From 06338066c77e054f0191c2b10c1b48dac60885e0 Mon Sep 17 00:00:00 2001 From: goyuken Date: Sun, 2 Feb 2014 17:37:42 +0000 Subject: [PATCH] gpgx: cleanup unused stuff --- genplus-gx/gx/config.c | 272 -- genplus-gx/gx/config.h | 125 - genplus-gx/gx/fileio/file_load.c | 464 --- genplus-gx/gx/fileio/file_load.h | 72 - genplus-gx/gx/fileio/file_slot.c | 830 ---- genplus-gx/gx/fileio/file_slot.h | 60 - genplus-gx/gx/fileio/fileio.c | 258 -- genplus-gx/gx/fileio/fileio.h | 47 - genplus-gx/gx/fileio/history.c | 138 - genplus-gx/gx/fileio/history.h | 69 - genplus-gx/gx/gui/cheats.c | 1492 ------- genplus-gx/gx/gui/cheats.h | 50 - genplus-gx/gx/gui/filesel.c | 645 --- genplus-gx/gx/gui/filesel.h | 58 - genplus-gx/gx/gui/font.c | 400 -- genplus-gx/gx/gui/font.h | 49 - genplus-gx/gx/gui/gui.c | 1968 ---------- genplus-gx/gx/gui/gui.h | 245 -- genplus-gx/gx/gui/legal.c | 172 - genplus-gx/gx/gui/menu.c | 3683 ------------------ genplus-gx/gx/gui/menu.h | 46 - genplus-gx/gx/gui/saveicon.h | 136 - genplus-gx/gx/gx_audio.c | 210 - genplus-gx/gx/gx_audio.h | 52 - genplus-gx/gx/gx_input.c | 1641 -------- genplus-gx/gx/gx_input.h | 72 - genplus-gx/gx/gx_video.c | 2041 ---------- genplus-gx/gx/gx_video.h | 105 - genplus-gx/gx/images/Banner_bottom.png | Bin 4704 -> 0 bytes genplus-gx/gx/images/Banner_main.png | Bin 23123 -> 0 bytes genplus-gx/gx/images/Banner_top.png | Bin 6169 -> 0 bytes genplus-gx/gx/images/Bg_credits.png | Bin 291755 -> 0 bytes genplus-gx/gx/images/Bg_intro_c1.png | Bin 20755 -> 0 bytes genplus-gx/gx/images/Bg_intro_c2.png | Bin 17290 -> 0 bytes genplus-gx/gx/images/Bg_intro_c3.png | Bin 11446 -> 0 bytes genplus-gx/gx/images/Bg_intro_c4.png | Bin 10388 -> 0 bytes genplus-gx/gx/images/Bg_layer.png | Bin 260 -> 0 bytes genplus-gx/gx/images/Bg_overlay.png | Bin 212 -> 0 bytes genplus-gx/gx/images/Browser_dir.png | Bin 450 -> 0 bytes genplus-gx/gx/images/Button_arrow.png | Bin 3386 -> 0 bytes genplus-gx/gx/images/Button_arrow_over.png | Bin 3389 -> 0 bytes genplus-gx/gx/images/Button_delete.png | Bin 4433 -> 0 bytes genplus-gx/gx/images/Button_delete_over.png | Bin 4466 -> 0 bytes genplus-gx/gx/images/Button_digit.png | Bin 1758 -> 0 bytes genplus-gx/gx/images/Button_digit_over.png | Bin 2277 -> 0 bytes genplus-gx/gx/images/Button_down.png | Bin 4199 -> 0 bytes genplus-gx/gx/images/Button_down_over.png | Bin 4287 -> 0 bytes genplus-gx/gx/images/Button_icon.png | Bin 7741 -> 0 bytes genplus-gx/gx/images/Button_icon_over.png | Bin 7409 -> 0 bytes genplus-gx/gx/images/Button_icon_sm.png | Bin 4985 -> 0 bytes genplus-gx/gx/images/Button_icon_sm_over.png | Bin 4914 -> 0 bytes genplus-gx/gx/images/Button_load.png | Bin 4460 -> 0 bytes genplus-gx/gx/images/Button_load_over.png | Bin 4509 -> 0 bytes genplus-gx/gx/images/Button_save.png | Bin 4607 -> 0 bytes genplus-gx/gx/images/Button_save_over.png | Bin 4618 -> 0 bytes genplus-gx/gx/images/Button_sm_blue.png | Bin 2889 -> 0 bytes genplus-gx/gx/images/Button_sm_grey.png | Bin 2581 -> 0 bytes genplus-gx/gx/images/Button_sm_yellow.png | Bin 2838 -> 0 bytes genplus-gx/gx/images/Button_special.png | Bin 4759 -> 0 bytes genplus-gx/gx/images/Button_special_over.png | Bin 4806 -> 0 bytes genplus-gx/gx/images/Button_text.png | Bin 2779 -> 0 bytes genplus-gx/gx/images/Button_text_over.png | Bin 2855 -> 0 bytes genplus-gx/gx/images/Button_up.png | Bin 3898 -> 0 bytes genplus-gx/gx/images/Button_up_over.png | Bin 4136 -> 0 bytes genplus-gx/gx/images/CD_access_off.png | Bin 877 -> 0 bytes genplus-gx/gx/images/CD_access_on.png | Bin 1812 -> 0 bytes genplus-gx/gx/images/CD_ready_off.png | Bin 837 -> 0 bytes genplus-gx/gx/images/CD_ready_on.png | Bin 1858 -> 0 bytes genplus-gx/gx/images/Cart_gg.png | Bin 31114 -> 0 bytes genplus-gx/gx/images/Cart_md.png | Bin 23753 -> 0 bytes genplus-gx/gx/images/Cart_ms.png | Bin 23290 -> 0 bytes genplus-gx/gx/images/Cart_sg.png | Bin 34509 -> 0 bytes genplus-gx/gx/images/Crosshair_p1.png | Bin 1806 -> 0 bytes genplus-gx/gx/images/Crosshair_p2.png | Bin 1651 -> 0 bytes genplus-gx/gx/images/Ctrl_4wayplay.png | Bin 5570 -> 0 bytes genplus-gx/gx/images/Ctrl_activator.png | Bin 2602 -> 0 bytes genplus-gx/gx/images/Ctrl_config.png | Bin 635 -> 0 bytes genplus-gx/gx/images/Ctrl_gamepad_md.png | Bin 4938 -> 0 bytes genplus-gx/gx/images/Ctrl_gamepad_ms.png | Bin 4286 -> 0 bytes genplus-gx/gx/images/Ctrl_justifiers.png | Bin 4600 -> 0 bytes genplus-gx/gx/images/Ctrl_lightphaser.png | Bin 3890 -> 0 bytes genplus-gx/gx/images/Ctrl_menacer.png | Bin 4627 -> 0 bytes genplus-gx/gx/images/Ctrl_mouse.png | Bin 3853 -> 0 bytes genplus-gx/gx/images/Ctrl_none.png | Bin 2227 -> 0 bytes genplus-gx/gx/images/Ctrl_pad3b.png | Bin 1842 -> 0 bytes genplus-gx/gx/images/Ctrl_pad6b.png | Bin 1777 -> 0 bytes genplus-gx/gx/images/Ctrl_paddle.png | Bin 4795 -> 0 bytes genplus-gx/gx/images/Ctrl_sportspad.png | Bin 4924 -> 0 bytes genplus-gx/gx/images/Ctrl_teamplayer.png | Bin 5929 -> 0 bytes genplus-gx/gx/images/Ctrl_xe_a1p.png | Bin 4848 -> 0 bytes genplus-gx/gx/images/Frame_s1.png | Bin 6997 -> 0 bytes genplus-gx/gx/images/Frame_s1_title.png | Bin 3510 -> 0 bytes genplus-gx/gx/images/Frame_s2.png | Bin 3890 -> 0 bytes genplus-gx/gx/images/Frame_s2_title.png | Bin 2285 -> 0 bytes genplus-gx/gx/images/Frame_s3.png | Bin 4447 -> 0 bytes genplus-gx/gx/images/Frame_throbber.png | Bin 2334 -> 0 bytes genplus-gx/gx/images/Key_A_gcn.png | Bin 1705 -> 0 bytes genplus-gx/gx/images/Key_A_wii.png | Bin 1542 -> 0 bytes genplus-gx/gx/images/Key_B_gcn.png | Bin 1633 -> 0 bytes genplus-gx/gx/images/Key_B_wii.png | Bin 1610 -> 0 bytes genplus-gx/gx/images/Key_DPAD.png | Bin 1189 -> 0 bytes genplus-gx/gx/images/Key_L_gcn.png | Bin 1850 -> 0 bytes genplus-gx/gx/images/Key_Minus_wii.png | Bin 1241 -> 0 bytes genplus-gx/gx/images/Key_Plus_wii.png | Bin 1346 -> 0 bytes genplus-gx/gx/images/Key_R_gcn.png | Bin 2105 -> 0 bytes genplus-gx/gx/images/Load_cd.png | Bin 5193 -> 0 bytes genplus-gx/gx/images/Load_gg.png | Bin 6452 -> 0 bytes genplus-gx/gx/images/Load_md.png | Bin 6767 -> 0 bytes genplus-gx/gx/images/Load_ms.png | Bin 6537 -> 0 bytes genplus-gx/gx/images/Load_recent.png | Bin 5676 -> 0 bytes genplus-gx/gx/images/Load_sg.png | Bin 5378 -> 0 bytes genplus-gx/gx/images/Main_cheats.png | Bin 2122 -> 0 bytes genplus-gx/gx/images/Main_file.png | Bin 8028 -> 0 bytes genplus-gx/gx/images/Main_load.png | Bin 11581 -> 0 bytes genplus-gx/gx/images/Main_logo.png | Bin 22305 -> 0 bytes genplus-gx/gx/images/Main_options.png | Bin 7506 -> 0 bytes genplus-gx/gx/images/Main_play_gcn.png | Bin 3732 -> 0 bytes genplus-gx/gx/images/Main_play_wii.png | Bin 3658 -> 0 bytes genplus-gx/gx/images/Main_quit.png | Bin 2242 -> 0 bytes genplus-gx/gx/images/Main_reset.png | Bin 6399 -> 0 bytes genplus-gx/gx/images/Main_showinfo.png | Bin 3694 -> 0 bytes genplus-gx/gx/images/Main_takeshot.png | Bin 3544 -> 0 bytes genplus-gx/gx/images/Option_ctrl.png | Bin 12311 -> 0 bytes genplus-gx/gx/images/Option_menu.png | Bin 2482 -> 0 bytes genplus-gx/gx/images/Option_sound.png | Bin 4305 -> 0 bytes genplus-gx/gx/images/Option_system.png | Bin 9709 -> 0 bytes genplus-gx/gx/images/Option_video.png | Bin 5072 -> 0 bytes genplus-gx/gx/images/Overlay_bar.png | Bin 2309 -> 0 bytes genplus-gx/gx/images/Snap_empty.png | Bin 27671 -> 0 bytes genplus-gx/gx/images/Star_empty.png | Bin 812 -> 0 bytes genplus-gx/gx/images/Star_full.png | Bin 994 -> 0 bytes genplus-gx/gx/images/ctrl_classic.png | Bin 1270 -> 0 bytes genplus-gx/gx/images/ctrl_gamecube.png | Bin 1310 -> 0 bytes genplus-gx/gx/images/ctrl_nunchuk.png | Bin 1329 -> 0 bytes genplus-gx/gx/images/ctrl_option_off.png | Bin 1004 -> 0 bytes genplus-gx/gx/images/ctrl_option_on.png | Bin 880 -> 0 bytes genplus-gx/gx/images/ctrl_wiimote.png | Bin 698 -> 0 bytes genplus-gx/gx/images/generic_point.png | Bin 2200 -> 0 bytes genplus-gx/gx/main.c | 614 --- genplus-gx/gx/osd.h | 86 - genplus-gx/gx/sounds/button_over.pcm | Bin 160 -> 0 bytes genplus-gx/gx/sounds/button_select.pcm | Bin 11904 -> 0 bytes genplus-gx/gx/sounds/intro.pcm | Bin 56186 -> 0 bytes genplus-gx/gx/utils/oggplayer.c | 536 --- genplus-gx/gx/utils/oggplayer.h | 179 - genplus-gx/gx/utils/vi_encoder.c | 565 --- genplus-gx/gx/utils/vi_encoder.h | 79 - genplus-gx/sdl/CHANGELOG.txt | 694 ---- genplus-gx/sdl/LICENSE.txt | 585 --- genplus-gx/sdl/Makefile.sdl | 173 - genplus-gx/sdl/README.txt | 146 - genplus-gx/sdl/config.c | 52 - genplus-gx/sdl/config.h | 53 - genplus-gx/sdl/error.c | 35 - genplus-gx/sdl/error.h | 10 - genplus-gx/sdl/fileio.c | 158 - genplus-gx/sdl/fileio.h | 48 - genplus-gx/sdl/icon.rc | 1 - genplus-gx/sdl/main.c | 934 ----- genplus-gx/sdl/main.h | 11 - genplus-gx/sdl/md.ico | Bin 42126 -> 0 bytes genplus-gx/sdl/osd.h | 35 - genplus-gx/sdl/readme-sdl.txt | 5 - genplus-gx/sdl/unzip.c | 1294 ------ genplus-gx/sdl/unzip.h | 273 -- 165 files changed, 21966 deletions(-) delete mode 100644 genplus-gx/gx/config.c delete mode 100644 genplus-gx/gx/config.h delete mode 100644 genplus-gx/gx/fileio/file_load.c delete mode 100644 genplus-gx/gx/fileio/file_load.h delete mode 100644 genplus-gx/gx/fileio/file_slot.c delete mode 100644 genplus-gx/gx/fileio/file_slot.h delete mode 100644 genplus-gx/gx/fileio/fileio.c delete mode 100644 genplus-gx/gx/fileio/fileio.h delete mode 100644 genplus-gx/gx/fileio/history.c delete mode 100644 genplus-gx/gx/fileio/history.h delete mode 100644 genplus-gx/gx/gui/cheats.c delete mode 100644 genplus-gx/gx/gui/cheats.h delete mode 100644 genplus-gx/gx/gui/filesel.c delete mode 100644 genplus-gx/gx/gui/filesel.h delete mode 100644 genplus-gx/gx/gui/font.c delete mode 100644 genplus-gx/gx/gui/font.h delete mode 100644 genplus-gx/gx/gui/gui.c delete mode 100644 genplus-gx/gx/gui/gui.h delete mode 100644 genplus-gx/gx/gui/legal.c delete mode 100644 genplus-gx/gx/gui/menu.c delete mode 100644 genplus-gx/gx/gui/menu.h delete mode 100644 genplus-gx/gx/gui/saveicon.h delete mode 100644 genplus-gx/gx/gx_audio.c delete mode 100644 genplus-gx/gx/gx_audio.h delete mode 100644 genplus-gx/gx/gx_input.c delete mode 100644 genplus-gx/gx/gx_input.h delete mode 100644 genplus-gx/gx/gx_video.c delete mode 100644 genplus-gx/gx/gx_video.h delete mode 100644 genplus-gx/gx/images/Banner_bottom.png delete mode 100644 genplus-gx/gx/images/Banner_main.png delete mode 100644 genplus-gx/gx/images/Banner_top.png delete mode 100644 genplus-gx/gx/images/Bg_credits.png delete mode 100644 genplus-gx/gx/images/Bg_intro_c1.png delete mode 100644 genplus-gx/gx/images/Bg_intro_c2.png delete mode 100644 genplus-gx/gx/images/Bg_intro_c3.png delete mode 100644 genplus-gx/gx/images/Bg_intro_c4.png delete mode 100644 genplus-gx/gx/images/Bg_layer.png delete mode 100644 genplus-gx/gx/images/Bg_overlay.png delete mode 100644 genplus-gx/gx/images/Browser_dir.png delete mode 100644 genplus-gx/gx/images/Button_arrow.png delete mode 100644 genplus-gx/gx/images/Button_arrow_over.png delete mode 100644 genplus-gx/gx/images/Button_delete.png delete mode 100644 genplus-gx/gx/images/Button_delete_over.png delete mode 100644 genplus-gx/gx/images/Button_digit.png delete mode 100644 genplus-gx/gx/images/Button_digit_over.png delete mode 100644 genplus-gx/gx/images/Button_down.png delete mode 100644 genplus-gx/gx/images/Button_down_over.png delete mode 100644 genplus-gx/gx/images/Button_icon.png delete mode 100644 genplus-gx/gx/images/Button_icon_over.png delete mode 100644 genplus-gx/gx/images/Button_icon_sm.png delete mode 100644 genplus-gx/gx/images/Button_icon_sm_over.png delete mode 100644 genplus-gx/gx/images/Button_load.png delete mode 100644 genplus-gx/gx/images/Button_load_over.png delete mode 100644 genplus-gx/gx/images/Button_save.png delete mode 100644 genplus-gx/gx/images/Button_save_over.png delete mode 100644 genplus-gx/gx/images/Button_sm_blue.png delete mode 100644 genplus-gx/gx/images/Button_sm_grey.png delete mode 100644 genplus-gx/gx/images/Button_sm_yellow.png delete mode 100644 genplus-gx/gx/images/Button_special.png delete mode 100644 genplus-gx/gx/images/Button_special_over.png delete mode 100644 genplus-gx/gx/images/Button_text.png delete mode 100644 genplus-gx/gx/images/Button_text_over.png delete mode 100644 genplus-gx/gx/images/Button_up.png delete mode 100644 genplus-gx/gx/images/Button_up_over.png delete mode 100644 genplus-gx/gx/images/CD_access_off.png delete mode 100644 genplus-gx/gx/images/CD_access_on.png delete mode 100644 genplus-gx/gx/images/CD_ready_off.png delete mode 100644 genplus-gx/gx/images/CD_ready_on.png delete mode 100644 genplus-gx/gx/images/Cart_gg.png delete mode 100644 genplus-gx/gx/images/Cart_md.png delete mode 100644 genplus-gx/gx/images/Cart_ms.png delete mode 100644 genplus-gx/gx/images/Cart_sg.png delete mode 100644 genplus-gx/gx/images/Crosshair_p1.png delete mode 100644 genplus-gx/gx/images/Crosshair_p2.png delete mode 100644 genplus-gx/gx/images/Ctrl_4wayplay.png delete mode 100644 genplus-gx/gx/images/Ctrl_activator.png delete mode 100644 genplus-gx/gx/images/Ctrl_config.png delete mode 100644 genplus-gx/gx/images/Ctrl_gamepad_md.png delete mode 100644 genplus-gx/gx/images/Ctrl_gamepad_ms.png delete mode 100644 genplus-gx/gx/images/Ctrl_justifiers.png delete mode 100644 genplus-gx/gx/images/Ctrl_lightphaser.png delete mode 100644 genplus-gx/gx/images/Ctrl_menacer.png delete mode 100644 genplus-gx/gx/images/Ctrl_mouse.png delete mode 100644 genplus-gx/gx/images/Ctrl_none.png delete mode 100644 genplus-gx/gx/images/Ctrl_pad3b.png delete mode 100644 genplus-gx/gx/images/Ctrl_pad6b.png delete mode 100644 genplus-gx/gx/images/Ctrl_paddle.png delete mode 100644 genplus-gx/gx/images/Ctrl_sportspad.png delete mode 100644 genplus-gx/gx/images/Ctrl_teamplayer.png delete mode 100644 genplus-gx/gx/images/Ctrl_xe_a1p.png delete mode 100644 genplus-gx/gx/images/Frame_s1.png delete mode 100644 genplus-gx/gx/images/Frame_s1_title.png delete mode 100644 genplus-gx/gx/images/Frame_s2.png delete mode 100644 genplus-gx/gx/images/Frame_s2_title.png delete mode 100644 genplus-gx/gx/images/Frame_s3.png delete mode 100644 genplus-gx/gx/images/Frame_throbber.png delete mode 100644 genplus-gx/gx/images/Key_A_gcn.png delete mode 100644 genplus-gx/gx/images/Key_A_wii.png delete mode 100644 genplus-gx/gx/images/Key_B_gcn.png delete mode 100644 genplus-gx/gx/images/Key_B_wii.png delete mode 100644 genplus-gx/gx/images/Key_DPAD.png delete mode 100644 genplus-gx/gx/images/Key_L_gcn.png delete mode 100644 genplus-gx/gx/images/Key_Minus_wii.png delete mode 100644 genplus-gx/gx/images/Key_Plus_wii.png delete mode 100644 genplus-gx/gx/images/Key_R_gcn.png delete mode 100644 genplus-gx/gx/images/Load_cd.png delete mode 100644 genplus-gx/gx/images/Load_gg.png delete mode 100644 genplus-gx/gx/images/Load_md.png delete mode 100644 genplus-gx/gx/images/Load_ms.png delete mode 100644 genplus-gx/gx/images/Load_recent.png delete mode 100644 genplus-gx/gx/images/Load_sg.png delete mode 100644 genplus-gx/gx/images/Main_cheats.png delete mode 100644 genplus-gx/gx/images/Main_file.png delete mode 100644 genplus-gx/gx/images/Main_load.png delete mode 100644 genplus-gx/gx/images/Main_logo.png delete mode 100644 genplus-gx/gx/images/Main_options.png delete mode 100644 genplus-gx/gx/images/Main_play_gcn.png delete mode 100644 genplus-gx/gx/images/Main_play_wii.png delete mode 100644 genplus-gx/gx/images/Main_quit.png delete mode 100644 genplus-gx/gx/images/Main_reset.png delete mode 100644 genplus-gx/gx/images/Main_showinfo.png delete mode 100644 genplus-gx/gx/images/Main_takeshot.png delete mode 100644 genplus-gx/gx/images/Option_ctrl.png delete mode 100644 genplus-gx/gx/images/Option_menu.png delete mode 100644 genplus-gx/gx/images/Option_sound.png delete mode 100644 genplus-gx/gx/images/Option_system.png delete mode 100644 genplus-gx/gx/images/Option_video.png delete mode 100644 genplus-gx/gx/images/Overlay_bar.png delete mode 100644 genplus-gx/gx/images/Snap_empty.png delete mode 100644 genplus-gx/gx/images/Star_empty.png delete mode 100644 genplus-gx/gx/images/Star_full.png delete mode 100644 genplus-gx/gx/images/ctrl_classic.png delete mode 100644 genplus-gx/gx/images/ctrl_gamecube.png delete mode 100644 genplus-gx/gx/images/ctrl_nunchuk.png delete mode 100644 genplus-gx/gx/images/ctrl_option_off.png delete mode 100644 genplus-gx/gx/images/ctrl_option_on.png delete mode 100644 genplus-gx/gx/images/ctrl_wiimote.png delete mode 100644 genplus-gx/gx/images/generic_point.png delete mode 100644 genplus-gx/gx/main.c delete mode 100644 genplus-gx/gx/osd.h delete mode 100644 genplus-gx/gx/sounds/button_over.pcm delete mode 100644 genplus-gx/gx/sounds/button_select.pcm delete mode 100644 genplus-gx/gx/sounds/intro.pcm delete mode 100644 genplus-gx/gx/utils/oggplayer.c delete mode 100644 genplus-gx/gx/utils/oggplayer.h delete mode 100644 genplus-gx/gx/utils/vi_encoder.c delete mode 100644 genplus-gx/gx/utils/vi_encoder.h delete mode 100644 genplus-gx/sdl/CHANGELOG.txt delete mode 100644 genplus-gx/sdl/LICENSE.txt delete mode 100644 genplus-gx/sdl/Makefile.sdl delete mode 100644 genplus-gx/sdl/README.txt delete mode 100644 genplus-gx/sdl/config.c delete mode 100644 genplus-gx/sdl/config.h delete mode 100644 genplus-gx/sdl/error.c delete mode 100644 genplus-gx/sdl/error.h delete mode 100644 genplus-gx/sdl/fileio.c delete mode 100644 genplus-gx/sdl/fileio.h delete mode 100644 genplus-gx/sdl/icon.rc delete mode 100644 genplus-gx/sdl/main.c delete mode 100644 genplus-gx/sdl/main.h delete mode 100644 genplus-gx/sdl/md.ico delete mode 100644 genplus-gx/sdl/osd.h delete mode 100644 genplus-gx/sdl/readme-sdl.txt delete mode 100644 genplus-gx/sdl/unzip.c delete mode 100644 genplus-gx/sdl/unzip.h diff --git a/genplus-gx/gx/config.c b/genplus-gx/gx/config.c deleted file mode 100644 index d13b15bbb5..0000000000 --- a/genplus-gx/gx/config.c +++ /dev/null @@ -1,272 +0,0 @@ -/**************************************************************************** - * config.c - * - * Genesis Plus GX configuration file support - * - * Copyright Eke-Eke (2007-2013) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#include "shared.h" -#include "gui.h" -#include "file_load.h" - -static int config_load(void) -{ - /* open configuration file */ - char fname[MAXPATHLEN]; - sprintf (fname, "%s/config.ini", DEFAULT_PATH); - FILE *fp = fopen(fname, "rb"); - if (fp) - { - /* check file size */ - fseek(fp, 0, SEEK_END); - if (ftell(fp) != sizeof(config)) - { - fclose(fp); - return 0; - } - - /* check version */ - char version[16]; - fseek(fp, 0, SEEK_SET); - fread(version, 16, 1, fp); - if (memcmp(version,CONFIG_VERSION,16)) - { - fclose(fp); - return 0; - } - - /* read file */ - fseek(fp, 0, SEEK_SET); - fread(&config, sizeof(config), 1, fp); - fclose(fp); - return 1; - } - return 0; -} - -void config_save(void) -{ - /* open configuration file */ - char fname[MAXPATHLEN]; - sprintf (fname, "%s/config.ini", DEFAULT_PATH); - FILE *fp = fopen(fname, "wb"); - if (fp) - { - /* write file */ - fwrite(&config, sizeof(config), 1, fp); - fclose(fp); - } -} - -void config_default(void) -{ - /* version TAG */ - strncpy(config.version,CONFIG_VERSION,16); - - /* sound options */ - config.psg_preamp = 150; - config.fm_preamp = 100; - config.hq_fm = 1; - config.psgBoostNoise = 1; - config.filter = 1; - config.lp_range = 0x9999; /* 0.6 in 16.16 fixed point */ - config.low_freq = 880; - config.high_freq = 5000; - config.lg = 1.0; - config.mg = 1.0; - config.hg = 1.0; - config.dac_bits = 14; - config.ym2413 = 2; /* AUTO */ - config.mono = 0; - - /* system options */ - config.system = 0; /* AUTO */ - config.region_detect = 0; /* AUTO */ - config.vdp_mode = 0; /* AUTO */ - config.master_clock = 0; /* AUTO */ - config.force_dtack = 0; - config.addr_error = 1; - config.bios = 0; - config.lock_on = 0; - config.hot_swap = 0; - - /* video options */ - config.xshift = 0; - config.yshift = 0; - config.xscale = 0; - config.yscale = 0; - config.aspect = 1; - config.overscan = 3; /* FULL */ - config.gg_extra = 0; - config.ntsc = 0; - config.vsync = 1; /* AUTO */ - config.bilinear = 0; - config.vfilter = 1; - - if (VIDEO_HaveComponentCable()) - { - config.render = 2; - } - else - { - config.render = 0; - } - - switch (vmode->viTVMode >> 2) - { - case VI_PAL: - config.tv_mode = 1; /* 50hz only */ - break; - - case VI_EURGB60: - config.tv_mode = 2; /* 50/60hz */ - break; - - default: - config.tv_mode = 0; /* 60hz only */ - break; - } - -#ifdef HW_RVL - config.trap = 0; - config.gamma = VI_GM_1_0 / 10.0; -#endif - - /* controllers options */ - config.gun_cursor[0] = 1; - config.gun_cursor[1] = 1; - config.invert_mouse = 0; - - /* on-screen options */ - config.cd_leds = 0; - config.fps = 0; - - /* menu options */ - config.autoload = 0; - config.autocheat = 0; -#ifdef HW_RVL - config.s_auto = 1; -#else - config.s_auto = 0; - config.v_prog = 1; -#endif - config.s_default = 1; - config.s_device = 0; - config.l_device = 0; - config.bg_overlay = 0; - config.screen_w = 658; - config.bgm_volume = 100.0; - config.sfx_volume = 100.0; - - /* default ROM directories */ -#ifdef HW_RVL - sprintf (config.lastdir[0][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[1][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[2][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[3][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[4][TYPE_SD], "sd:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[0][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[1][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[2][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[3][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[4][TYPE_USB], "usb:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[0][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[1][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[2][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[3][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[4][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); -#else - sprintf (config.lastdir[0][TYPE_SD], "%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[1][TYPE_SD], "%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[2][TYPE_SD], "%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[3][TYPE_SD], "%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[4][TYPE_SD], "%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[0][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[1][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[2][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[3][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); - sprintf (config.lastdir[4][TYPE_DVD], "dvd:%s/roms/", DEFAULT_PATH); -#endif - - /* try to restore user config */ - int loaded = config_load(); - -#ifndef HW_RVL - /* check if component cable was detected */ - if (VIDEO_HaveComponentCable()) - { - /* when component cable is detected, libogc automatically enables progressive mode */ - /* as preferred video mode but it could still be used on TV not supporting 480p/576p */ - PAD_ScanPads(); - - /* detect progressive mode switch requests */ - if (PAD_ButtonsHeld(0) & PAD_BUTTON_B) - { - /* swap progressive mode enable flag */ - config.v_prog ^= 1; - - /* play some sound to inform user */ - ASND_Pause(0); - int voice = ASND_GetFirstUnusedVoice(); - ASND_SetVoice(voice,VOICE_MONO_16BIT,44100,0,(u8 *)intro_pcm,intro_pcm_size,200,200,NULL); - sleep (2); - ASND_Pause(1); - } - - /* check if progressive mode should be disabled */ - if (!config.v_prog) - { - /* switch menu video mode to interlaced */ - vmode->viTVMode = (vmode->viTVMode & ~3) | VI_INTERLACE; - VIDEO_Configure (vmode); - VIDEO_Flush(); - VIDEO_WaitVSync(); - VIDEO_WaitVSync(); - } - } -#endif - - /* inform user if default config is used */ - if (!loaded) - { - GUI_WaitPrompt("Warning","Default Settings restored"); - gx_input_SetDefault(); - } - - /* default emulated inputs */ - input.system[0] = SYSTEM_MD_GAMEPAD; - input.system[1] = (config.input[1].device != -1) ? SYSTEM_MD_GAMEPAD : NO_SYSTEM; - input_init(); -} diff --git a/genplus-gx/gx/config.h b/genplus-gx/gx/config.h deleted file mode 100644 index 59b773e1ff..0000000000 --- a/genplus-gx/gx/config.h +++ /dev/null @@ -1,125 +0,0 @@ -/**************************************************************************** - * config.c - * - * Genesis Plus GX configuration file support - * - * Copyright Eke-Eke (2007-2013) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifndef _CONFIG_H_ -#define _CONFIG_H_ - -#define CONFIG_VERSION "GENPLUS-GX 1.7.5" - -/**************************************************************************** - * Config Option - * - ****************************************************************************/ -typedef struct -{ - char version[16]; - uint8 hq_fm; - uint8 filter; - uint8 psgBoostNoise; - uint8 dac_bits; - uint8 ym2413; - uint8 mono; - int16 psg_preamp; - int16 fm_preamp; - uint32 lp_range; - int16 low_freq; - int16 high_freq; - int16 lg; - int16 mg; - int16 hg; - uint8 system; - uint8 region_detect; - uint8 master_clock; - uint8 vdp_mode; - uint8 force_dtack; - uint8 addr_error; - uint8 bios; - uint8 lock_on; - uint8 hot_swap; - uint8 invert_mouse; - uint8 gun_cursor[2]; - uint8 overscan; - uint8 gg_extra; - uint8 ntsc; - uint8 vsync; - uint8 render; - uint8 tv_mode; - uint8 bilinear; - uint8 vfilter; - uint8 aspect; - int16 xshift; - int16 yshift; - int16 xscale; - int16 yscale; -#ifdef HW_RVL - uint32 trap; - float gamma; -#else - uint8 v_prog; -#endif - t_input_config input[MAX_INPUTS]; - uint16 pad_keymap[4][MAX_KEYS+1]; -#ifdef HW_RVL - uint32 wpad_keymap[4*3][MAX_KEYS]; -#endif - uint8 autoload; - uint8 autocheat; - uint8 s_auto; - uint8 s_default; - uint8 s_device; - uint8 l_device; - uint8 bg_overlay; - uint8 cd_leds; - uint8 fps; - int16 screen_w; - float bgm_volume; - float sfx_volume; - char lastdir[FILETYPE_MAX][TYPE_RECENT][MAXPATHLEN]; -} t_config; - -/* Global data */ -t_config config; - - -extern void config_save(void); -extern void config_default(void); - - -#endif /* _CONFIG_H_ */ - diff --git a/genplus-gx/gx/fileio/file_load.c b/genplus-gx/gx/fileio/file_load.c deleted file mode 100644 index e896c4e312..0000000000 --- a/genplus-gx/gx/fileio/file_load.c +++ /dev/null @@ -1,464 +0,0 @@ -/* - * file_load.c - * - * ROM File loading support - * - * Copyright Eke-Eke (2008-2012) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#include "shared.h" -#include "file_load.h" -#include "gui.h" -#include "history.h" -#include "filesel.h" -#include "file_slot.h" - -#include -#ifdef HW_RVL -#include -#else -#include -#endif - -char rom_filename[256]; - -/* device root directories */ -#ifdef HW_RVL -static const char rootdir[TYPE_RECENT][10] = {"sd:/","usb:/","dvd:/"}; -#else -static const char rootdir[TYPE_RECENT][10] = {"/","dvd:/"}; -#endif - -/* DVD interface */ -#ifdef HW_RVL -static const DISC_INTERFACE* dvd = &__io_wiidvd; -#else -static const DISC_INTERFACE* dvd = &__io_gcdvd; -#endif - -/* current directory */ -static char *fileDir; - -/* current device */ -static int deviceType = -1; - -/* current file type */ -static int fileType = -1; - -/* DVD status flag */ -static u8 dvd_mounted = 0; - -/*************************************************************************** - * MountDVD - * - * return 0 on error, 1 on success - ***************************************************************************/ -static int MountDVD(void) -{ - GUI_MsgBoxOpen("Information", "Mounting DVD ...",1); - - /* initialize DVD interface if needed */ -#ifdef HW_RVL - DI_Init(); -#else - DVD_Init(); -#endif - - /* check if DVD is already mounted */ - if (dvd_mounted) - { - /* unmount DVD */ - ISO9660_Unmount("dvd:"); - dvd_mounted = 0; - } - - /* check if disc is found */ - if(!dvd->isInserted()) - { - GUI_WaitPrompt("Error","No Disc inserted !"); - return 0; - } - - /* mount DVD */ - if(!ISO9660_Mount("dvd",dvd)) - { - GUI_WaitPrompt("Error","Disc can not be read !"); - return 0; - } - - /* DVD is mounted */ - dvd_mounted = 1; - - GUI_MsgBoxClose(); - return 1; -} - -/*************************************************************************** - * FileSortCallback (thanks to Marty Disibio) - * - * Quick sort callback to sort file entries with the following order: - * . - * .. - * - * - ***************************************************************************/ -static int FileSortCallback(const void *f1, const void *f2) -{ - /* Special case for implicit directories */ - if(((FILEENTRIES *)f1)->filename[0] == '.' || ((FILEENTRIES *)f2)->filename[0] == '.') - { - if(strcmp(((FILEENTRIES *)f1)->filename, ".") == 0) { return -1; } - if(strcmp(((FILEENTRIES *)f2)->filename, ".") == 0) { return 1; } - if(strcmp(((FILEENTRIES *)f1)->filename, "..") == 0) { return -1; } - if(strcmp(((FILEENTRIES *)f2)->filename, "..") == 0) { return 1; } - } - - /* If one is a file and one is a directory the directory is first. */ - if(((FILEENTRIES *)f1)->flags && !((FILEENTRIES *)f2)->flags) return -1; - if(!((FILEENTRIES *)f1)->flags && ((FILEENTRIES *)f2)->flags) return 1; - - return stricmp(((FILEENTRIES *)f1)->filename, ((FILEENTRIES *)f2)->filename); -} - -/*************************************************************************** - * UpdateDirectory - * - * Update current browser directory - * return zero if going up while in root - * when going up, return previous dir name - ***************************************************************************/ -int UpdateDirectory(bool go_up, char *dirname) -{ - /* go up to parent directory */ - if (go_up) - { - /* special case */ - if (deviceType == TYPE_RECENT) return 0; - - /* check if we already are at root directory */ - if (!strcmp(rootdir[deviceType], (const char *)fileDir)) return 0; - - int size=0; - char temp[MAXPATHLEN]; - - /* determine last folder name length */ - strcpy(temp, fileDir); - char *test= strtok(temp,"/"); - while (test != NULL) - { - size = strlen(test); - strncpy(dirname,test,size); - dirname[size] = 0; - test = strtok(NULL,"/"); - } - - /* remove last folder from path */ - size = strlen(fileDir) - size; - fileDir[size - 1] = 0; - } - else - { - /* by default, simply append folder name */ - sprintf(fileDir, "%s%s/",fileDir, dirname); - } - - return 1; -} - -/*************************************************************************** - * ParseDirectory - * - * List files into one directory - ***************************************************************************/ -int ParseDirectory(void) -{ - int nbfiles = 0; - - /* open directory */ - DIR *dir = opendir(fileDir); - if (dir == NULL) - { - return -1; - } - - struct dirent *entry = readdir(dir); - - /* list entries */ - while ((entry != NULL)&& (nbfiles < MAXFILES)) - { - /* filter entries */ - if ((entry->d_name[0] != '.') - && strncasecmp(".wav", &entry->d_name[strlen(entry->d_name) - 4], 4) - && strncasecmp(".ogg", &entry->d_name[strlen(entry->d_name) - 4], 4) - && strncasecmp(".mp3", &entry->d_name[strlen(entry->d_name) - 4], 4)) - { - memset(&filelist[nbfiles], 0, sizeof (FILEENTRIES)); - sprintf(filelist[nbfiles].filename,"%s",entry->d_name); - if (entry->d_type == DT_DIR) - { - filelist[nbfiles].flags = 1; - } - nbfiles++; - } - - /* next entry */ - entry = readdir(dir); - } - - /* close directory */ - closedir(dir); - - /* Sort the file list */ - qsort(filelist, nbfiles, sizeof(FILEENTRIES), FileSortCallback); - - return nbfiles; -} - -/**************************************************************************** - * LoadFile - * - * This function will load a game file into the ROM buffer. - * This functions return the actual size of data copied into the buffer - * - ****************************************************************************/ -int LoadFile(int selection) -{ - int size, cd_mode1, filetype; - char filename[MAXPATHLEN]; - - /* file path */ - char *filepath = (deviceType == TYPE_RECENT) ? history.entries[selection].filepath : fileDir; - - /* full filename */ - sprintf(filename, "%s%s", filepath, filelist[selection].filename); - - /* DVD hot swap */ - if (!strncmp(filepath, rootdir[TYPE_DVD], strlen(rootdir[TYPE_DVD]))) - { - /* Check if file is still accessible */ - struct stat filestat; - if(stat(filename, &filestat) != 0) - { - /* If not, try to mount DVD */ - if (!MountDVD()) return 0; - } - } - - /* open message box */ - GUI_MsgBoxOpen("Information", "Loading game...", 1); - - /* no cartridge or CD game loaded */ - size = cd_mode1 = 0; - - /* check if virtual CD tray was open */ - if ((system_hw == SYSTEM_MCD) && (cdd.status == CD_OPEN)) - { - /* swap CD image file in (without changing region, system,...) */ - size = cdd_load(filename, (char *)(cdc.ram)); - - /* check if a cartridge is currently loaded */ - if (scd.cartridge.boot) - { - /* CD Mode 1 */ - cd_mode1 = size; - } - else - { - /* update game informations from CD image file header */ - getrominfo((char *)(cdc.ram)); - } - } - - /* no CD image file loaded */ - if (!size) - { - /* close CD tray to force system reset */ - cdd.status = NO_DISC; - - /* load game file */ - size = load_rom(filename); - } - - if (size > 0) - { - /* do not update game basename if a CD was loaded with a cartridge (Mode 1) */ - if (cd_mode1) - { - /* add CD image file to history list */ - filetype = 1; - } - else - { - /* auto-save previous game state */ - slot_autosave(config.s_default,config.s_device); - - /* update game basename (for screenshot, save & cheat files) */ - if (romtype & SYSTEM_SMS) - { - /* Master System ROM file */ - filetype = 2; - sprintf(rom_filename,"ms/%s",filelist[selection].filename); - } - else if (romtype & SYSTEM_GG) - { - /* Game Gear ROM file */ - filetype = 3; - sprintf(rom_filename,"gg/%s",filelist[selection].filename); - } - else if (romtype == SYSTEM_SG) - { - /* SG-1000 ROM file */ - filetype = 4; - sprintf(rom_filename,"sg/%s",filelist[selection].filename); - } - else if (romtype == SYSTEM_MCD) - { - /* CD image file */ - filetype = 1; - sprintf(rom_filename,"cd/%s",filelist[selection].filename); - } - else - { - /* by default, Genesis ROM file */ - filetype = 0; - sprintf(rom_filename,"md/%s",filelist[selection].filename); - } - - /* remove file extension */ - int i = strlen(rom_filename) - 1; - while ((i > 0) && (rom_filename[i] != '.')) i--; - if (i > 0) rom_filename[i] = 0; - } - - /* add/move the file to the top of the history. */ - history_add_file(filepath, filelist[selection].filename, filetype); - - /* recent file list may have changed */ - if (deviceType == TYPE_RECENT) deviceType = -1; - - /* close message box */ - GUI_MsgBoxClose(); - - /* valid image has been loaded */ - return 1; - } - - GUI_WaitPrompt("Error", "Unable to load game"); - return 0; -} - -/**************************************************************************** - * OpenDir - * - * Function to open a directory and load ROM file list. - ****************************************************************************/ -int OpenDirectory(int device, int type) -{ - int max = 0; - - if (device == TYPE_RECENT) - { - /* fetch history list */ - int i; - for(i=0; i < NUM_HISTORY_ENTRIES; i++) - { - if(history.entries[i].filepath[0] > 0) - { - filelist[i].flags = 0; - strncpy(filelist[i].filename,history.entries[i].filename, MAXJOLIET-1); - filelist[i].filename[MAXJOLIET-1] = '\0'; - max++; - } - else - { - /* Found the end of the list. */ - break; - } - } - } - else - { - /* only DVD hot swap is supported */ - if (device == TYPE_DVD) - { - /* try to access root directory */ - DIR *dir = opendir(rootdir[TYPE_DVD]); - if (dir == NULL) - { - /* mount DVD */ - if (!MountDVD()) return 0; - deviceType = -1; - } - else - { - closedir(dir); - } - } - - /* parse last directory */ - fileDir = config.lastdir[type][device]; - max = ParseDirectory(); - if (max <= 0) - { - /* parse root directory */ - strcpy(fileDir, rootdir[device]); - max = ParseDirectory(); - if (max < 0) - { - GUI_WaitPrompt("Error","Unable to open directory !"); - return 0; - } - deviceType = -1; - } - } - - if (max == 0) - { - GUI_WaitPrompt("Error","No files found !"); - return 0; - } - - /* check if device or file type has changed */ - if ((device != deviceType) || (type != fileType)) - { - /* reset current types */ - deviceType = device; - fileType = type; - - /* reset File selector */ - ClearSelector(max); - } - - return 1; -} diff --git a/genplus-gx/gx/fileio/file_load.h b/genplus-gx/gx/fileio/file_load.h deleted file mode 100644 index fca2aba1c3..0000000000 --- a/genplus-gx/gx/fileio/file_load.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * file_load.c - * - * ROM File loading support - * - * Copyright Eke-Eke (2008-2012) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifndef _FILE_FAT_H -#define _FILE_FAT_H - -/* suppported load devices */ -typedef enum -{ - TYPE_SD = 0, -#ifdef HW_RVL - TYPE_USB, -#endif - TYPE_DVD, - TYPE_RECENT -}DEVTYPES; - -/* supported file types */ -typedef enum -{ - FILETYPE_MD = 0, - FILETYPE_CD, - FILETYPE_MS, - FILETYPE_GG, - FILETYPE_SG, - FILETYPE_MAX -}FILETYPES; - -extern int OpenDirectory(int device, int type); -extern int UpdateDirectory(bool go_up, char *filename); -extern int ParseDirectory(void); -extern int LoadFile(int selection); - -extern char rom_filename[256]; - -#endif diff --git a/genplus-gx/gx/fileio/file_slot.c b/genplus-gx/gx/fileio/file_slot.c deleted file mode 100644 index 45d117f70d..0000000000 --- a/genplus-gx/gx/fileio/file_slot.c +++ /dev/null @@ -1,830 +0,0 @@ -/* - * file_slot.c - * - * FAT and Memory Card SRAM/State slots managment - * - * Copyright Eke-Eke (2008-2012), based on original code from Softdev (2006) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#include "shared.h" -#include "file_slot.h" -#include "file_load.h" -#include "gui.h" -#include "filesel.h" -#include "saveicon.h" - -/** - * libOGC CARD System Work Area - */ -static u8 SysArea[CARD_WORKAREA] ATTRIBUTE_ALIGN (32); - -/* Mega CD backup RAM stuff */ -static u32 brm_crc[2]; -static char brm_filename[3][32] = {CD_BRAM_JP, CD_BRAM_EU, CD_BRAM_US}; -static u8 brm_format[0x40] = -{ - 0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x00,0x00,0x00,0x00,0x40, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x53,0x45,0x47,0x41,0x5f,0x43,0x44,0x5f,0x52,0x4f,0x4d,0x00,0x01,0x00,0x00,0x00, - 0x52,0x41,0x4d,0x5f,0x43,0x41,0x52,0x54,0x52,0x49,0x44,0x47,0x45,0x5f,0x5f,0x5f -}; - -/**************************************************************************** - * CardMount - * - * libOGC provides the CARD_Mount function, and it should be all you need. - * However, experience with previous emulators has taught me that you are - * better off doing a little bit more than that! - * - *****************************************************************************/ -static int CardMount(int slot) -{ - int tries = 0; -#ifdef HW_RVL - *(unsigned long *) (0xCD006800) |= 1 << 13; /*** Disable Encryption ***/ -#else - *(unsigned long *) (0xCC006800) |= 1 << 13; /*** Disable Encryption ***/ -#endif - while (tries < 10) - { - VIDEO_WaitVSync (); - if (CARD_Mount(slot, SysArea, NULL) == CARD_ERROR_READY) - return 1; - else - EXI_ProbeReset (); - tries++; - } - return 0; -} - -/**************************************************************************** - * Slot Management - * - * - ****************************************************************************/ -void slot_autoload(int slot, int device) -{ - /* Mega CD backup RAM specific */ - if (!slot && (system_hw == SYSTEM_MCD)) - { - /* automatically load internal backup RAM */ - FILE *fp = fopen(brm_filename[((region_code ^ 0x40) >> 6) - 1], "rb"); - if (fp != NULL) - { - fread(scd.bram, 0x2000, 1, fp); - fclose(fp); - - /* update CRC */ - brm_crc[0] = crc32(0, scd.bram, 0x2000); - } - else - { - /* force internal backup RAM format (does not use previous region backup RAM) */ - scd.bram[0x1fff] = 0; - } - - /* check if internal backup RAM is correctly formatted */ - if (memcmp(scd.bram + 0x2000 - 0x20, brm_format + 0x20, 0x20)) - { - /* clear internal backup RAM */ - memset(scd.bram, 0x00, 0x2000 - 0x40); - - /* internal Backup RAM size fields */ - brm_format[0x10] = brm_format[0x12] = brm_format[0x14] = brm_format[0x16] = 0x00; - brm_format[0x11] = brm_format[0x13] = brm_format[0x15] = brm_format[0x17] = (sizeof(scd.bram) / 64) - 3; - - /* format internal backup RAM */ - memcpy(scd.bram + 0x2000 - 0x40, brm_format, 0x40); - - /* clear CRC to force file saving (in case previous region backup RAM was also formatted) */ - brm_crc[0] = 0; - } - - /* automatically load cartridge backup RAM (if enabled) */ - if (scd.cartridge.id) - { - fp = fopen(CART_BRAM, "rb"); - if (fp != NULL) - { - int filesize = scd.cartridge.mask + 1; - int done = 0; - - /* Read into buffer (2k blocks) */ - while (filesize > CHUNKSIZE) - { - fread(scd.cartridge.area + done, CHUNKSIZE, 1, fp); - done += CHUNKSIZE; - filesize -= CHUNKSIZE; - } - - /* Read remaining bytes */ - if (filesize) - { - fread(scd.cartridge.area + done, filesize, 1, fp); - } - - /* close file */ - fclose(fp); - - /* update CRC */ - brm_crc[1] = crc32(0, scd.cartridge.area, scd.cartridge.mask + 1); - } - - /* check if cartridge backup RAM is correctly formatted */ - if (memcmp(scd.cartridge.area + scd.cartridge.mask + 1 - 0x20, brm_format + 0x20, 0x20)) - { - /* clear cartridge backup RAM */ - memset(scd.cartridge.area, 0x00, scd.cartridge.mask + 1); - - /* Cartridge Backup RAM size fields */ - brm_format[0x10] = brm_format[0x12] = brm_format[0x14] = brm_format[0x16] = (((scd.cartridge.mask + 1) / 64) - 3) >> 8; - brm_format[0x11] = brm_format[0x13] = brm_format[0x15] = brm_format[0x17] = (((scd.cartridge.mask + 1) / 64) - 3) & 0xff; - - /* format cartridge backup RAM */ - memcpy(scd.cartridge.area + scd.cartridge.mask + 1 - 0x40, brm_format, 0x40); - } - } - } - - /* configurable SRAM & State auto-saving */ - if ((slot && !(config.s_auto & 2)) || (!slot && !(config.s_auto & 1))) - { - return; - } - - if (strlen(rom_filename)) - { - SILENT = 1; - slot_load(slot, device); - SILENT = 0; - } -} - -void slot_autosave(int slot, int device) -{ - /* Mega CD backup RAM specific */ - if (!slot && (system_hw == SYSTEM_MCD)) - { - /* verify that internal backup RAM has been modified */ - if (crc32(0, scd.bram, 0x2000) != brm_crc[0]) - { - /* check if it is correctly formatted before saving */ - if (!memcmp(scd.bram + 0x2000 - 0x20, brm_format + 0x20, 0x20)) - { - FILE *fp = fopen(brm_filename[((region_code ^ 0x40) >> 6) - 1], "wb"); - if (fp != NULL) - { - fwrite(scd.bram, 0x2000, 1, fp); - fclose(fp); - - /* update CRC */ - brm_crc[0] = crc32(0, scd.bram, 0x2000); - } - } - } - - /* verify that cartridge backup RAM has been modified */ - if (scd.cartridge.id && (crc32(0, scd.cartridge.area, scd.cartridge.mask + 1) != brm_crc[1])) - { - /* check if it is correctly formatted before saving */ - if (!memcmp(scd.cartridge.area + scd.cartridge.mask + 1 - 0x20, brm_format + 0x20, 0x20)) - { - FILE *fp = fopen(CART_BRAM, "wb"); - if (fp != NULL) - { - int filesize = scd.cartridge.mask + 1; - int done = 0; - - /* Write to file (2k blocks) */ - while (filesize > CHUNKSIZE) - { - fwrite(scd.cartridge.area + done, CHUNKSIZE, 1, fp); - done += CHUNKSIZE; - filesize -= CHUNKSIZE; - } - - /* Write remaining bytes */ - if (filesize) - { - fwrite(scd.cartridge.area + done, filesize, 1, fp); - } - - /* Close file */ - fclose(fp); - - /* update CRC */ - brm_crc[1] = crc32(0, scd.cartridge.area, scd.cartridge.mask + 1); - } - } - } - } - - /* configurable SRAM & State auto-saving */ - if ((slot && !(config.s_auto & 2)) || (!slot && !(config.s_auto & 1))) - { - return; - } - - if (strlen(rom_filename)) - { - SILENT = 1; - slot_save(slot, device); - SILENT = 0; - } -} - -void slot_autodetect(int slot, int device, t_slot *ptr) -{ - if (!ptr) return; - - char filename[MAXPATHLEN]; - memset(ptr,0,sizeof(t_slot)); - - if (!device) - { - /* FAT support */ - if (slot > 0) - { - sprintf (filename,"%s/saves/%s.gp%d", DEFAULT_PATH, rom_filename, slot - 1); - } - else - { - sprintf (filename,"%s/saves/%s.srm", DEFAULT_PATH, rom_filename); - } - - /* Open file */ - FILE *fp = fopen(filename, "rb"); - if (fp) - { - /* Retrieve date & close */ - struct stat filestat; - stat(filename, &filestat); - struct tm *timeinfo = localtime(&filestat.st_mtime); - ptr->year = 1900 + timeinfo->tm_year; - ptr->month = timeinfo->tm_mon; - ptr->day = timeinfo->tm_mday; - ptr->hour = timeinfo->tm_hour; - ptr->min = timeinfo->tm_min; - fclose(fp); - ptr->valid = 1; - } - } - else - { - /* Memory Card support */ - if (slot > 0) - sprintf(filename,"MD-%04X.gp%d", rominfo.realchecksum, slot - 1); - else - sprintf(filename,"MD-%04X.srm", rominfo.realchecksum); - - /* Initialise the CARD system */ - memset(&SysArea, 0, CARD_WORKAREA); - CARD_Init("GENP", "00"); - - /* CARD slot */ - device--; - - /* Mount CARD */ - if (CardMount(device)) - { - /* Open file */ - card_file CardFile; - if (CARD_Open(device, filename, &CardFile) == CARD_ERROR_READY) - { - /* Retrieve date & close */ - card_stat CardStatus; - CARD_GetStatus(device, CardFile.filenum, &CardStatus); - time_t rawtime = CardStatus.time; - struct tm *timeinfo = localtime(&rawtime); - ptr->year = 1900 + timeinfo->tm_year; - ptr->month = timeinfo->tm_mon; - ptr->day = timeinfo->tm_mday; - ptr->hour = timeinfo->tm_hour; - ptr->min = timeinfo->tm_min; - CARD_Close(&CardFile); - ptr->valid = 1; - } - CARD_Unmount(device); - } - } -} - -int slot_delete(int slot, int device) -{ - char filename[MAXPATHLEN]; - int ret = 0; - - if (!device) - { - /* FAT support */ - if (slot > 0) - { - /* remove screenshot */ - sprintf(filename,"%s/saves/%s__%d.png", DEFAULT_PATH, rom_filename, slot - 1); - remove(filename); - - sprintf (filename,"%s/saves/%s.gp%d", DEFAULT_PATH, rom_filename, slot - 1); - } - else - { - sprintf (filename,"%s/saves/%s.srm", DEFAULT_PATH, rom_filename); - } - - /* Delete file */ - ret = remove(filename); - } - else - { - /* Memory Card support */ - if (slot > 0) - sprintf(filename,"MD-%04X.gp%d", rominfo.realchecksum, slot - 1); - else - sprintf(filename,"MD-%04X.srm", rominfo.realchecksum); - - /* Initialise the CARD system */ - memset(&SysArea, 0, CARD_WORKAREA); - CARD_Init("GENP", "00"); - - /* CARD slot */ - device--; - - /* Mount CARD */ - if (CardMount(device)) - { - /* Delete file */ - ret = CARD_Delete(device,filename); - CARD_Unmount(device); - } - } - - return ret; -} - -int slot_load(int slot, int device) -{ - char filename[MAXPATHLEN]; - unsigned long filesize, done = 0; - u8 *buffer; - - /* File Type */ - if (slot > 0) - { - GUI_MsgBoxOpen("Information","Loading State ...",1); - } - else - { - if (!sram.on) - { - GUI_WaitPrompt("Error","Backup RAM is disabled !"); - return 0; - } - - GUI_MsgBoxOpen("Information","Loading Backup RAM ...",1); - } - - /* Device Type */ - if (!device) - { - /* FAT file */ - if (slot > 0) - { - sprintf (filename,"%s/saves/%s.gp%d", DEFAULT_PATH, rom_filename, slot - 1); - } - else - { - sprintf (filename,"%s/saves/%s.srm", DEFAULT_PATH, rom_filename); - } - - /* Open file */ - FILE *fp = fopen(filename, "rb"); - if (!fp) - { - GUI_WaitPrompt("Error","Unable to open file !"); - return 0; - } - - /* Get file size */ - fseek(fp, 0, SEEK_END); - filesize = ftell(fp); - fseek(fp, 0, SEEK_SET); - - /* allocate buffer */ - buffer = (u8 *)memalign(32,filesize); - if (!buffer) - { - GUI_WaitPrompt("Error","Unable to allocate memory !"); - fclose(fp); - return 0; - } - - /* Read into buffer (2k blocks) */ - while (filesize > CHUNKSIZE) - { - fread(buffer + done, CHUNKSIZE, 1, fp); - done += CHUNKSIZE; - filesize -= CHUNKSIZE; - } - - /* Read remaining bytes */ - fread(buffer + done, filesize, 1, fp); - done += filesize; - - /* Close file */ - fclose(fp); - } - else - { - /* Memory Card file */ - if (slot > 0) - { - sprintf(filename, "MD-%04X.gp%d", rominfo.realchecksum, slot - 1); - } - else - { - sprintf(filename, "MD-%04X.srm", rominfo.realchecksum); - } - - /* Initialise the CARD system */ - char action[64]; - memset(&SysArea, 0, CARD_WORKAREA); - CARD_Init("GENP", "00"); - - /* CARD slot */ - device--; - - /* Attempt to mount the card */ - if (!CardMount(device)) - { - GUI_WaitPrompt("Error","Unable to mount memory card"); - return 0; - } - - /* Retrieve the sector size */ - u32 SectorSize = 0; - int CardError = CARD_GetSectorSize(device, &SectorSize); - if (!SectorSize) - { - sprintf(action, "Invalid sector size (%d)", CardError); - GUI_WaitPrompt("Error",action); - CARD_Unmount(device); - return 0; - } - - /* Open file */ - card_file CardFile; - CardError = CARD_Open(device, filename, &CardFile); - if (CardError) - { - sprintf(action, "Unable to open file (%d)", CardError); - GUI_WaitPrompt("Error",action); - CARD_Unmount(device); - return 0; - } - - /* Get file size */ - filesize = CardFile.len; - if (filesize % SectorSize) - { - filesize = ((filesize / SectorSize) + 1) * SectorSize; - } - - /* Allocate buffer */ - u8 *in = (u8 *)memalign(32, filesize); - if (!in) - { - GUI_WaitPrompt("Error","Unable to allocate memory !"); - CARD_Close(&CardFile); - CARD_Unmount(device); - return 0; - } - - /* Read file sectors */ - while (filesize > 0) - { - CARD_Read(&CardFile, &in[done], SectorSize, done); - done += SectorSize; - filesize -= SectorSize; - } - - /* Close file */ - CARD_Close(&CardFile); - CARD_Unmount(device); - - /* Uncompressed file size */ - memcpy(&filesize, in + 2112, 4); - buffer = (u8 *)memalign(32, filesize); - if (!buffer) - { - free(in); - GUI_WaitPrompt("Error","Unable to allocate memory !"); - return 0; - } - - /* Uncompress file */ - uncompress ((Bytef *)buffer, &filesize, (Bytef *)(in + 2112 + 4), done - 2112 - 4); - free(in); - } - - if (slot > 0) - { - /* Load state */ - if (state_load(buffer) <= 0) - { - free(buffer); - GUI_WaitPrompt("Error","Invalid state file !"); - return 0; - } - } - else - { - /* load SRAM */ - memcpy(sram.sram, buffer, 0x10000); - - /* update CRC */ - sram.crc = crc32(0, sram.sram, 0x10000); - } - - free(buffer); - GUI_MsgBoxClose(); - return 1; -} - -int slot_save(int slot, int device) -{ - char filename[MAXPATHLEN]; - unsigned long filesize, done = 0; - u8 *buffer; - - if (slot > 0) - { - GUI_MsgBoxOpen("Information","Saving State ...",1); - - /* allocate buffer */ - buffer = (u8 *)memalign(32,STATE_SIZE); - if (!buffer) - { - GUI_WaitPrompt("Error","Unable to allocate memory !"); - return 0; - } - - filesize = state_save(buffer); - } - else - { - /* only save if SRAM is enabled */ - if (!sram.on) - { - GUI_WaitPrompt("Error","Backup RAM disabled !"); - return 0; - } - - /* only save if SRAM has been modified */ - if (crc32(0, &sram.sram[0], 0x10000) == sram.crc) - { - GUI_WaitPrompt("Warning","Backup RAM not modified !"); - return 0; - } - - GUI_MsgBoxOpen("Information","Saving Backup RAM ...",1); - - /* allocate buffer */ - buffer = (u8 *)memalign(32, 0x10000); - if (!buffer) - { - GUI_WaitPrompt("Error","Unable to allocate memory !"); - return 0; - } - - /* copy SRAM data */ - memcpy(buffer, sram.sram, 0x10000); - filesize = 0x10000; - - /* update CRC */ - sram.crc = crc32(0, sram.sram, 0x10000); - } - - /* Device Type */ - if (!device) - { - /* FAT filename */ - if (slot > 0) - { - sprintf(filename, "%s/saves/%s.gp%d", DEFAULT_PATH, rom_filename, slot - 1); - } - else - { - sprintf(filename, "%s/saves/%s.srm", DEFAULT_PATH, rom_filename); - } - - /* Open file */ - FILE *fp = fopen(filename, "wb"); - if (!fp) - { - GUI_WaitPrompt("Error","Unable to open file !"); - free(buffer); - return 0; - } - - /* Write from buffer (2k blocks) */ - while (filesize > CHUNKSIZE) - { - fwrite(buffer + done, CHUNKSIZE, 1, fp); - done += CHUNKSIZE; - filesize -= CHUNKSIZE; - } - - /* Write remaining bytes */ - fwrite(buffer + done, filesize, 1, fp); - done += filesize; - - /* Close file */ - fclose(fp); - free(buffer); - - /* Close message box */ - GUI_MsgBoxClose(); - - /* Save state screenshot */ - if (slot > 0) - { - sprintf(filename,"%s/saves/%s__%d.png", DEFAULT_PATH, rom_filename, slot - 1); - gxSaveScreenshot(filename); - } - } - else - { - /* Memory Card filename */ - if (slot > 0) - { - sprintf(filename, "MD-%04X.gp%d", rominfo.realchecksum, slot - 1); - } - else - { - sprintf(filename, "MD-%04X.srm", rominfo.realchecksum); - } - - /* Initialise the CARD system */ - char action[64]; - memset(&SysArea, 0, CARD_WORKAREA); - CARD_Init("GENP", "00"); - - /* CARD slot */ - device--; - - /* Attempt to mount the card */ - if (!CardMount(device)) - { - GUI_WaitPrompt("Error","Unable to mount memory card"); - free(buffer); - return 0; - } - - /* Retrieve sector size */ - u32 SectorSize = 0; - int CardError = CARD_GetSectorSize(device, &SectorSize); - if (!SectorSize) - { - sprintf(action, "Invalid sector size (%d)", CardError); - GUI_WaitPrompt("Error",action); - CARD_Unmount(device); - free(buffer); - return 0; - } - - /* Build output buffer */ - u8 *out = (u8 *)memalign(32, filesize + 2112 + 4); - if (!out) - { - GUI_WaitPrompt("Error","Unable to allocate memory !"); - CARD_Unmount(device); - free(buffer); - return 0; - } - - /* Memory Card file header */ - char comment[2][32] = { {"Genesis Plus GX"}, {"SRAM Save"} }; - strcpy (comment[1], filename); - memcpy (&out[0], &icon, 2048); - memcpy (&out[2048], &comment[0], 64); - - /* uncompressed size */ - done = filesize; - memcpy(&out[2112], &done, 4); - - /* compress file */ - compress2 ((Bytef *)&out[2112 + 4], &filesize, (Bytef *)buffer, done, 9); - - /* Adjust file size */ - filesize = filesize + 4 + 2112; - if (filesize % SectorSize) - { - filesize = ((filesize / SectorSize) + 1) * SectorSize; - } - - /* Check if file already exists */ - card_file CardFile; - if (CARD_Open(device, filename, &CardFile) == CARD_ERROR_READY) - { - int size = filesize - CardFile.len; - CARD_Close(&CardFile); - memset(&CardFile,0,sizeof(CardFile)); - - /* Check file new size */ - if (size > 0) - { - CardError = CARD_Create(device, "TEMP", size, &CardFile); - if (CardError) - { - sprintf(action, "Unable to increase file size (%d)", CardError); - GUI_WaitPrompt("Error",action); - CARD_Unmount(device); - free(out); - free(buffer); - return 0; - } - - /* delete temporary file */ - CARD_Close(&CardFile); - memset(&CardFile,0,sizeof(CardFile)); - CARD_Delete(device, "TEMP"); - } - - /* delete previously existing file */ - CARD_Delete(device, filename); - } - - /* Create a new file */ - CardError = CARD_Create(device, filename, filesize, &CardFile); - if (CardError) - { - sprintf(action, "Unable to create file (%d)", CardError); - GUI_WaitPrompt("Error",action); - CARD_Unmount(device); - free(out); - free(buffer); - return 0; - } - - /* Update file informations */ - time_t rawtime; - time(&rawtime); - card_stat CardStatus; - CARD_GetStatus(device, CardFile.filenum, &CardStatus); - CardStatus.icon_addr = 0x0; - CardStatus.icon_fmt = 2; - CardStatus.icon_speed = 1; - CardStatus.comment_addr = 2048; - CardStatus.time = rawtime; - CARD_SetStatus(device, CardFile.filenum, &CardStatus); - - /* Write file sectors */ - while (filesize > 0) - { - CARD_Write(&CardFile, &out[done], SectorSize, done); - filesize -= SectorSize; - done += SectorSize; - } - - /* Close file */ - CARD_Close(&CardFile); - CARD_Unmount(device); - free(out); - free(buffer); - - /* Close message box */ - GUI_MsgBoxClose(); - } - - return 1; -} diff --git a/genplus-gx/gx/fileio/file_slot.h b/genplus-gx/gx/fileio/file_slot.h deleted file mode 100644 index fe227a8936..0000000000 --- a/genplus-gx/gx/fileio/file_slot.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * file_slot.c - * - * FAT and Memory Card SRAM/Savestate files managment - * - * Copyright Eke-Eke (2008-2012), based on original code from Softdev (2006) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifndef _FILE_SLOT_H -#define _FILE_SLOT_H - -typedef struct -{ - int valid; - u16 year; - u8 month; - u8 day; - u8 hour; - u8 min; -} t_slot; - -extern void slot_autoload(int slot, int device); -extern void slot_autosave(int slot, int device); -extern void slot_autodetect(int slot, int device, t_slot *ptr); -extern int slot_delete(int slot, int device); -extern int slot_load(int slot, int device); -extern int slot_save(int slot, int device); - -#endif diff --git a/genplus-gx/gx/fileio/fileio.c b/genplus-gx/gx/fileio/fileio.c deleted file mode 100644 index 4d97eb05a6..0000000000 --- a/genplus-gx/gx/fileio/fileio.c +++ /dev/null @@ -1,258 +0,0 @@ -/* - * fileio.c - * - * Load a normal file, or ZIP/GZ archive into ROM buffer. - * Returns loaded ROM size (zero if an error occured). - * - * Copyright Eke-Eke (2007-2013), based on original work from Softdev (2006) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#include "shared.h" -#include "file_load.h" -#include "gui.h" - -/* - * Zip file header definition - */ -typedef struct -{ - unsigned int zipid __attribute__ ((__packed__)); // 0x04034b50 - unsigned short zipversion __attribute__ ((__packed__)); - unsigned short zipflags __attribute__ ((__packed__)); - unsigned short compressionMethod __attribute__ ((__packed__)); - unsigned short lastmodtime __attribute__ ((__packed__)); - unsigned short lastmoddate __attribute__ ((__packed__)); - unsigned int crc32 __attribute__ ((__packed__)); - unsigned int compressedSize __attribute__ ((__packed__)); - unsigned int uncompressedSize __attribute__ ((__packed__)); - unsigned short filenameLength __attribute__ ((__packed__)); - unsigned short extraDataLength __attribute__ ((__packed__)); -} PKZIPHEADER; - - -/* - * Zip files are stored little endian - * Support functions for short and int types - */ -static inline u32 FLIP32 (u32 b) -{ - unsigned int c; - c = (b & 0xff000000) >> 24; - c |= (b & 0xff0000) >> 8; - c |= (b & 0xff00) << 8; - c |= (b & 0xff) << 24; - return c; -} - -static inline u16 FLIP16 (u16 b) -{ - u16 c; - c = (b & 0xff00) >> 8; - c |= (b & 0xff) << 8; - return c; -} - -int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension) -{ - int size = 0; - char in[CHUNKSIZE]; - char msg[64] = "Unable to open file"; - - /* Open file */ - FILE *fd = fopen(filename, "rb"); - - /* Master System & Game Gear BIOS are optional files */ - if (!strcmp(filename,MS_BIOS_US) || !strcmp(filename,MS_BIOS_EU) || !strcmp(filename,MS_BIOS_JP) || !strcmp(filename,GG_BIOS)) - { - /* disable all messages */ - SILENT = 1; - } - - /* Mega CD BIOS are required files */ - if (!strcmp(filename,CD_BIOS_US) || !strcmp(filename,CD_BIOS_EU) || !strcmp(filename,CD_BIOS_JP)) - { - sprintf(msg,"Unable to open %s", filename + 14); - } - - if (!fd) - { - GUI_WaitPrompt("Error", msg); - SILENT = 0; - return 0; - } - - /* Read first chunk */ - fread(in, CHUNKSIZE, 1, fd); - - /* Detect Zip file */ - if (memcmp(in, "PK", 2) == 0) - { - /* Inflate buffer */ - char out[CHUNKSIZE]; - - /* PKZip header pointer */ - PKZIPHEADER *pkzip = (PKZIPHEADER *) in; - - /* Retrieve uncompressed ROM size */ - size = FLIP32(pkzip->uncompressedSize); - - /* Check ROM size */ - if (size > maxsize) - { - fclose(fd); - GUI_WaitPrompt("Error","File is too large"); - SILENT = 0; - return 0; - } - - sprintf (msg, "Unzipping %d bytes ...", size); - GUI_MsgBoxUpdate("Information",msg); - - /* Initialize zip stream */ - z_stream zs; - memset (&zs, 0, sizeof (z_stream)); - zs.zalloc = Z_NULL; - zs.zfree = Z_NULL; - zs.opaque = Z_NULL; - zs.avail_in = 0; - zs.next_in = Z_NULL; - int res = inflateInit2(&zs, -MAX_WBITS); - - if (res != Z_OK) - { - fclose(fd); - GUI_WaitPrompt("Error","Unable to unzip file"); - SILENT = 0; - return 0; - } - - /* Compressed filename offset */ - int offset = sizeof (PKZIPHEADER) + FLIP16(pkzip->filenameLength); - - if (extension) - { - memcpy(extension, &in[offset - 3], 3); - extension[3] = 0; - } - - - /* Initial Zip buffer offset */ - offset += FLIP16(pkzip->extraDataLength); - zs.next_in = (Bytef *)&in[offset]; - - /* Initial Zip remaining chunk size */ - zs.avail_in = CHUNKSIZE - offset; - - /* Start unzipping file */ - do - { - /* Inflate data until output buffer is empty */ - do - { - zs.avail_out = CHUNKSIZE; - zs.next_out = (Bytef *) out; - res = inflate(&zs, Z_NO_FLUSH); - - if (res == Z_MEM_ERROR) - { - inflateEnd(&zs); - fclose(fd); - GUI_WaitPrompt("Error","Unable to unzip file"); - SILENT = 0; - return 0; - } - - offset = CHUNKSIZE - zs.avail_out; - if (offset) - { - memcpy(buffer, out, offset); - buffer += offset; - } - } - while (zs.avail_out == 0); - - /* Read next chunk of zipped data */ - fread(in, CHUNKSIZE, 1, fd); - zs.next_in = (Bytef *)&in[0]; - zs.avail_in = CHUNKSIZE; - } - while (res != Z_STREAM_END); - inflateEnd (&zs); - } - else - { - /* Get file size */ - fseek(fd, 0, SEEK_END); - size = ftell(fd); - fseek(fd, 0, SEEK_SET); - - /* size limit */ - if(size > maxsize) - { - fclose(fd); - GUI_WaitPrompt("Error","File is too large"); - SILENT = 0; - return 0; - } - - sprintf((char *)msg,"Loading %d bytes ...", size); - GUI_MsgBoxUpdate("Information", (char *)msg); - - /* filename extension */ - if (extension) - { - memcpy(extension, &filename[strlen(filename) - 3], 3); - extension[3] = 0; - } - - /* Read into buffer */ - int left = size; - while (left > CHUNKSIZE) - { - fread(buffer, CHUNKSIZE, 1, fd); - buffer += CHUNKSIZE; - left -= CHUNKSIZE; - } - - /* Read remaining bytes */ - fread(buffer, left, 1, fd); - } - - /* Close file */ - fclose(fd); - - /* Return loaded ROM size */ - SILENT = 0; - return size; -} diff --git a/genplus-gx/gx/fileio/fileio.h b/genplus-gx/gx/fileio/fileio.h deleted file mode 100644 index 4e1c6c6050..0000000000 --- a/genplus-gx/gx/fileio/fileio.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * fileio.c - * - * Load a normal file, or ZIP/GZ archive into ROM buffer. - * Returns loaded ROM size (zero if an error occured). - * - * Copyright Eke-Eke (2007-2013), based on original work from Softdev (2006) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifndef _FILEIO_H_ -#define _FILEIO_H_ - -/* Function prototypes */ -int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension); - -#endif /* _FILEIO_H_ */ diff --git a/genplus-gx/gx/fileio/history.c b/genplus-gx/gx/fileio/history.c deleted file mode 100644 index a28219fd3a..0000000000 --- a/genplus-gx/gx/fileio/history.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * history.c - * - * Generic ROM history list managment - * - * Copyright Eke-Eke (2008-2012), based on original code from Martin Disibio (2008) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#include "shared.h" -#include "history.h" - -t_history history; - - -/**************************************************************************** - * history_add_file - * - * Adds the given file path to the top of the history list, shifting each - * existing entry in the history down one place. If given file path is - * already in the list then the existing entry is (in effect) moved to the - * top instead. - ****************************************************************************/ -void history_add_file(char *filepath, char *filename, u8 filetype) -{ - /* Create the new entry for this path. */ - t_history_entry newentry; - strncpy(newentry.filepath, filepath, MAXJOLIET - 1); - strncpy(newentry.filename, filename, MAXJOLIET - 1); - newentry.filepath[MAXJOLIET - 1] = '\0'; - newentry.filename[MAXJOLIET - 1] = '\0'; - newentry.filetype = filetype; - - t_history_entry oldentry; /* Old entry is the one being shuffled down a spot. */ - t_history_entry currentry; /* Curr entry is the one that just replaced old path. */ - - /* Initially set curr entry to the new value. */ - memcpy(¤try, &newentry, sizeof(t_history_entry)); - - int i; - for(i=0; i < NUM_HISTORY_ENTRIES; i++) - { - /* Save off the next entry. */ - memcpy(&oldentry, &history.entries[i], sizeof(t_history_entry)); - - /* Overwrite with the previous entry. */ - memcpy(&history.entries[i], ¤try, sizeof(t_history_entry)); - - /* Switch the old entry to the curr entry now. */ - memcpy(¤try, &oldentry, sizeof(t_history_entry)); - - /* If the entry in the list at this spot matches - the new entry then do nothing and let this - entry get deleted. */ - if(strcmp(newentry.filepath, currentry.filepath) == 0 && strcmp(newentry.filename, currentry.filename) == 0) - break; - } - - /* now save to disk */ - history_save(); -} - -void history_save() -{ - /* open file */ - char fname[MAXPATHLEN]; - sprintf (fname, "%s/history.ini", DEFAULT_PATH); - FILE *fp = fopen(fname, "wb"); - if (fp) - { - /* write file */ - fwrite(&history, sizeof(history), 1, fp); - fclose(fp); - } -} - -void history_load(void) -{ - /* open file */ - char fname[MAXPATHLEN]; - sprintf (fname, "%s/history.ini", DEFAULT_PATH); - FILE *fp = fopen(fname, "rb"); - if (fp) - { - /* read file */ - if (fread(&history, sizeof(history), 1, fp) != 1) - { - /* an error ocurred, better clear hoistory */ - memset(&history, 0, sizeof(history)); - } - - /* close file */ - fclose(fp); - } -} - -void history_default(void) -{ - int i; - for(i=0; i < NUM_HISTORY_ENTRIES; i++) - memset(&history.entries[i], 0, sizeof(t_history_entry)); - - /* restore history */ - history_load(); -} - - - diff --git a/genplus-gx/gx/fileio/history.h b/genplus-gx/gx/fileio/history.h deleted file mode 100644 index e40081a5d8..0000000000 --- a/genplus-gx/gx/fileio/history.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * history.c - * - * Generic ROM history list managment - * - * Copyright Eke-Eke (2008-2012), based on original code from Martin Disibio (2008) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifndef _HISTORY_H -#define _HISTORY_H - -#include "filesel.h" - -#define NUM_HISTORY_ENTRIES (10) - -/**************************************************************************** - * ROM Play History - * - ****************************************************************************/ -typedef struct -{ - char filepath[MAXJOLIET]; - char filename[MAXJOLIET]; - u8 filetype; -} t_history_entry; - -typedef struct -{ - t_history_entry entries[NUM_HISTORY_ENTRIES]; -} t_history; - -extern t_history history; -extern void history_add_file(char *filepath, char *filename, u8 filetype); -extern void history_save(void); -extern void history_load(void); -extern void history_default(void); - -#endif diff --git a/genplus-gx/gx/gui/cheats.c b/genplus-gx/gx/gui/cheats.c deleted file mode 100644 index 829044cbfe..0000000000 --- a/genplus-gx/gx/gui/cheats.c +++ /dev/null @@ -1,1492 +0,0 @@ -/* - * cheats.c - * - * Cheats menu - * - * Copyright Eke-Eke (2010-2012) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#include "shared.h" -#include "file_load.h" -#include "cheats.h" -#include "font.h" -#include "gui.h" - -#define BG_COLOR_1 {0x49,0x49,0x49,0xff} -#define BG_COLOR_2 {0x66,0x66,0x66,0xff} - -#define MAX_CHEATS (150) -#define MAX_DESC_LENGTH (63) - -#ifdef HW_RVL -extern const u8 Key_Minus_wii_png[]; -extern const u8 Key_Plus_wii_png[]; -#else -extern const u8 Key_R_gcn_png[]; -extern const u8 Key_L_gcn_png[]; -#endif -extern const u8 Key_DPAD_png[]; - -typedef struct -{ - char code[12]; - char text[MAX_DESC_LENGTH]; - u8 enable; - u16 data; - u16 old; - u32 address; - u8 *prev; -} CHEATENTRY; - -static int string_offset = 0; -static int selection = 0; -static int offset = 0; -static int type = 0; -static int maxcheats = 0; -static int maxROMcheats = 0; -static int maxRAMcheats = 0; - -static CHEATENTRY cheatlist[MAX_CHEATS]; -static u8 cheatIndexes[MAX_CHEATS]; - -static void cheatmenu_cb(void); - -/*****************************************************************************/ -/* GUI Buttons data */ -/*****************************************************************************/ -static butn_data arrow_up_data = -{ - {NULL,NULL}, - {Button_up_png,Button_up_over_png} -}; - -static butn_data arrow_down_data = -{ - {NULL,NULL}, - {Button_down_png,Button_down_over_png} -}; -static butn_data button_digit_data = -{ - {NULL,NULL}, - {Button_digit_png,Button_digit_over_png} -}; - -/*****************************************************************************/ -/* GUI Arrows button */ -/*****************************************************************************/ - -static gui_butn arrow_up = {&arrow_up_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,0,0,0},14,76,360,32}; -static gui_butn arrow_down = {&arrow_down_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,0,0,0},14,368,360,32}; - - -/*****************************************************************************/ -/* GUI helpers */ -/*****************************************************************************/ -static gui_item action_cancel = -{ - NULL,Key_B_png,"","Exit",10,422,28,28 -}; - -static gui_item action_select = -{ - NULL,Key_A_png,"","Edit Entry",602,422,28,28 -}; - -/*****************************************************************************/ -/* GUI Background images */ -/*****************************************************************************/ -static gui_image bg_cheats[7] = -{ - {NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, - {NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, - {NULL,Banner_top_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,0,0,640,108,255}, - {NULL,Banner_bottom_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,0,380,640,100,255}, - {NULL,Main_logo_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,466,40,152,44,255}, - {NULL,Frame_s1_png,IMAGE_VISIBLE,8,70,372,336,152}, - {NULL,Frame_s1_png,IMAGE_SLIDE_RIGHT,411,109,372,296,76}, -}; - -/*****************************************************************************/ -/* Menu Items description */ -/*****************************************************************************/ -static gui_item items_cheats[30] = -{ - {NULL,NULL,"","Edit Entry",0,0,0,0}, - {NULL,NULL,"","Edit Entry",0,0,0,0}, - {NULL,NULL,"","Edit Entry",0,0,0,0}, - {NULL,NULL,"","Edit Entry",0,0,0,0}, - {NULL,NULL,"","Edit Entry",0,0,0,0}, - {NULL,NULL,"","Edit Entry",0,0,0,0}, - {NULL,NULL,"","Edit Entry",0,0,0,0}, - {NULL,NULL,"","Edit Entry",0,0,0,0}, - {NULL,NULL,"","Edit Entry",0,0,0,0}, - {NULL,NULL,"","Edit Entry",0,0,0,0}, - {NULL,NULL,"0","Add Character" ,440,136,40,40}, - {NULL,NULL,"1","Add Character" ,486,136,40,40}, - {NULL,NULL,"2","Add Character" ,532,136,40,40}, - {NULL,NULL,"3","Add Character" ,578,136,40,40}, - {NULL,NULL,"4","Add Character" ,440,182,40,40}, - {NULL,NULL,"5","Add Character" ,486,182,40,40}, - {NULL,NULL,"6","Add Character" ,532,182,40,40}, - {NULL,NULL,"7","Add Character" ,578,182,40,40}, - {NULL,NULL,"8","Add Character" ,440,228,40,40}, - {NULL,NULL,"9","Add Character" ,486,228,40,40}, - {NULL,NULL,"A","Add Character" ,532,228,40,40}, - {NULL,NULL,"B","Add Character" ,578,228,40,40}, - {NULL,NULL,"C","Add Character" ,440,274,40,40}, - {NULL,NULL,"D","Add Character" ,486,274,40,40}, - {NULL,NULL,"E","Add Character" ,532,274,40,40}, - {NULL,NULL,"F","Add Character" ,578,274,40,40}, - {NULL,NULL,"del","Backspace" ,440,338,40,40}, - {NULL,NULL,":","Add Separator" ,486,338,40,40}, - {NULL,NULL,"+","Next Characters",532,338,40,40}, - {NULL,NULL,"ok","Save Entry" ,578,338,40,40} -}; - -/*****************************************************************************/ -/* Menu Buttons description */ -/*****************************************************************************/ -static gui_butn buttons_cheats[30] = -{ - {NULL, BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,108,358,26}, - {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,134,358,26}, - {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,160,358,26}, - {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,186,358,26}, - {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,212,358,26}, - {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,238,358,26}, - {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,264,358,26}, - {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,290,358,26}, - {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,316,358,26}, - {NULL, BUTTON_VISIBLE|BUTTON_SELECT_SFX|BUTTON_OVER_SFX,{1,0,0,0},15,342,358,26}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{0,4,0,1},440,136,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{0,4,1,1},486,136,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{0,4,1,1},532,136,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{0,4,1,0},578,136,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,0,1},440,182,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,1},486,182,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,1},532,182,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,0},578,182,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,0,1},440,228,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,1},486,228,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,1},532,228,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,0},578,228,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,0,1},440,274,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,1},486,274,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,1},532,274,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,4,1,0},578,274,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,0,0,1},440,338,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,0,1,1},486,338,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,0,1,1},532,338,40,40}, - {&button_digit_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{4,0,1,0},578,338,40,40} -}; - -/*****************************************************************************/ -/* Menu description */ -/*****************************************************************************/ -static gui_menu menu_cheats = -{ - "Cheats Manager", - 0,0, - 30,30,7,0, - items_cheats, - buttons_cheats, - bg_cheats, - {&action_cancel, &action_select}, - {&arrow_up,&arrow_down}, - cheatmenu_cb -}; - -static char ggvalidchars[] = "ABCDEFGHJKLMNPRSTVWXYZ0123456789"; - -static char arvalidchars[] = "0123456789ABCDEF"; - -static u32 decode_cheat(char *string, int index) -{ - char *p; - int i,n; - u32 len = 0; - u32 address = 0; - u16 data = 0; - u8 ref = 0; - - /* 16-bit Game Genie code (ABCD-EFGH) */ - if ((strlen(string) >= 9) && (string[4] == '-')) - { - /* 16-bit system only */ - if ((system_hw & SYSTEM_PBC) != SYSTEM_MD) - { - return 0; - } - - for (i = 0; i < 8; i++) - { - if (i == 4) string++; - p = strchr (ggvalidchars, *string++); - if (p == NULL) return 0; - n = p - ggvalidchars; - - switch (i) - { - case 0: - data |= n << 3; - break; - - case 1: - data |= n >> 2; - address |= (n & 3) << 14; - break; - - case 2: - address |= n << 9; - break; - - case 3: - address |= (n & 0xF) << 20 | (n >> 4) << 8; - break; - - case 4: - data |= (n & 1) << 12; - address |= (n >> 1) << 16; - break; - - case 5: - data |= (n & 1) << 15 | (n >> 1) << 8; - break; - - case 6: - data |= (n >> 3) << 13; - address |= (n & 7) << 5; - break; - - case 7: - address |= n; - break; - } - } - - /* code length */ - len = 9; - } - - /* 8-bit Game Genie code (DDA-AAA-XXX) */ - else if ((strlen(string) >= 11) && (string[3] == '-') && (string[7] == '-')) - { - /* 8-bit system only */ - if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) - { - return 0; - } - - /* decode 8-bit data */ - for (i=0; i<2; i++) - { - p = strchr (arvalidchars, *string++); - if (p == NULL) return 0; - n = (p - arvalidchars) & 0xF; - data |= (n << ((1 - i) * 4)); - } - - /* decode 16-bit address (low 12-bits) */ - for (i=0; i<3; i++) - { - if (i==1) string++; /* skip separator */ - p = strchr (arvalidchars, *string++); - if (p == NULL) return 0; - n = (p - arvalidchars) & 0xF; - address |= (n << ((2 - i) * 4)); - } - - /* decode 16-bit address (high 4-bits) */ - p = strchr (arvalidchars, *string++); - if (p == NULL) return 0; - n = (p - arvalidchars) & 0xF; - n ^= 0xF; /* bits inversion */ - address |= (n << 12); - - /* RAM address are also supported */ - if (address >= 0xC000) - { - /* convert to 24-bit Work RAM address */ - address = 0xFF0000 | (address & 0x1FFF); - } - - /* decode reference 8-bit data */ - for (i=0; i<2; i++) - { - string++; /* skip separator and 2nd digit */ - p = strchr (arvalidchars, *string++); - if (p == NULL) return 0; - n = (p - arvalidchars) & 0xF; - ref |= (n << ((1 - i) * 4)); - } - ref = (ref >> 2) | ((ref & 0x03) << 6); /* 2-bit right rotation */ - ref ^= 0xBA; /* XOR */ - - /* update old data value */ - cheatlist[index].old = ref; - - /* code length */ - len = 11; - } - - /* Action Replay code */ - else if (string[6] == ':') - { - if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) - { - /* 16-bit code (AAAAAA:DDDD) */ - if (strlen(string) < 11) return 0; - - /* decode 24-bit address */ - for (i=0; i<6; i++) - { - p = strchr (arvalidchars, *string++); - if (p == NULL) return 0; - n = (p - arvalidchars) & 0xF; - address |= (n << ((5 - i) * 4)); - } - - /* decode 16-bit data */ - string++; - for (i=0; i<4; i++) - { - p = strchr (arvalidchars, *string++); - if (p == NULL) return 0; - n = (p - arvalidchars) & 0xF; - data |= (n << ((3 - i) * 4)); - } - - /* code length */ - len = 11; - } - else - { - /* 8-bit code (xxAAAA:DD) */ - if (strlen(string) < 9) return 0; - - /* decode 16-bit address */ - string+=2; - for (i=0; i<4; i++) - { - p = strchr (arvalidchars, *string++); - if (p == NULL) return 0; - n = (p - arvalidchars) & 0xF; - address |= (n << ((3 - i) * 4)); - } - - /* ROM addresses are not supported */ - if (address < 0xC000) return 0; - - /* convert to 24-bit Work RAM address */ - address = 0xFF0000 | (address & 0x1FFF); - - /* decode 8-bit data */ - string++; - for (i=0; i<2; i++) - { - p = strchr (arvalidchars, *string++); - if (p == NULL) return 0; - n = (p - arvalidchars) & 0xF; - data |= (n << ((1 - i) * 4)); - } - - /* code length */ - len = 9; - } - } - - /* Valid code found ? */ - if (len) - { - /* update cheat address & data values */ - cheatlist[index].address = address; - cheatlist[index].data = data; - } - - /* return code length (0 = invalid) */ - return len; -} - -static void apply_cheats(void) -{ - u8 *ptr; - - /* clear ROM&RAM patches counter */ - maxROMcheats = maxRAMcheats = 0; - - int i; - for (i = 0; i < maxcheats; i++) - { - if (cheatlist[i].enable) - { - if (cheatlist[i].address < cart.romsize) - { - if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) - { - /* patch ROM data */ - cheatlist[i].old = *(u16 *)(cart.rom + (cheatlist[i].address & 0xFFFFFE)); - *(u16 *)(cart.rom + (cheatlist[i].address & 0xFFFFFE)) = cheatlist[i].data; - } - else - { - /* add ROM patch */ - maxROMcheats++; - cheatIndexes[MAX_CHEATS - maxROMcheats] = i; - - /* get current banked ROM address */ - ptr = &z80_readmap[(cheatlist[i].address) >> 10][cheatlist[i].address & 0x03FF]; - - /* check if reference matches original ROM data */ - if (((u8)cheatlist[i].old) == *ptr) - { - /* patch data */ - *ptr = cheatlist[i].data; - - /* save patched ROM address */ - cheatlist[i].prev = ptr; - } - else - { - /* no patched ROM address yet */ - cheatlist[i].prev = NULL; - } - } - } - else if (cheatlist[i].address >= 0xFF0000) - { - /* add RAM patch */ - cheatIndexes[maxRAMcheats++] = i; - } - } - } -} - -static void clear_cheats(void) -{ - int i = maxcheats; - - /* disable cheats in reversed order in case the same address is used by multiple patches */ - while (i > 0) - { - if (cheatlist[i-1].enable) - { - if (cheatlist[i-1].address < cart.romsize) - { - if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) - { - /* restore original ROM data */ - *(u16 *)(cart.rom + (cheatlist[i-1].address & 0xFFFFFE)) = cheatlist[i-1].old; - } - else - { - /* check if previous banked ROM address has been patched */ - if (cheatlist[i-1].prev != NULL) - { - /* restore original data */ - *cheatlist[i-1].prev = cheatlist[i-1].old; - - /* no more patched ROM address */ - cheatlist[i-1].prev = NULL; - } - } - } - } - - i--; - } -} - -static void switch_chars(void) -{ - int i; - gui_menu *m = &menu_cheats; - - if (m->items[10].text[0] == '0') - { - m->items[10].text[0] = 'G'; - m->items[11].text[0] = 'H'; - m->items[12].text[0] = 'J'; - m->items[13].text[0] = 'K'; - m->items[14].text[0] = 'L'; - m->items[15].text[0] = 'M'; - m->items[16].text[0] = 'N'; - m->items[17].text[0] = 'P'; - m->items[18].text[0] = 'R'; - m->items[19].text[0] = 'S'; - m->items[20].text[0] = 'T'; - m->items[21].text[0] = 'V'; - m->items[22].text[0] = 'W'; - m->items[23].text[0] = 'X'; - m->items[24].text[0] = 'Y'; - m->items[25].text[0] = 'Z'; - } - else if (m->items[10].text[0] == 'G') - { - m->items[10].text[0] = '0'; - m->items[11].text[0] = '1'; - m->items[12].text[0] = '2'; - m->items[13].text[0] = '3'; - m->items[14].text[0] = '4'; - m->items[15].text[0] = '5'; - m->items[16].text[0] = '6'; - m->items[17].text[0] = '7'; - m->items[18].text[0] = '8'; - m->items[19].text[0] = '9'; - m->items[20].text[0] = 'A'; - m->items[21].text[0] = 'B'; - m->items[22].text[0] = 'C'; - m->items[23].text[0] = 'D'; - m->items[24].text[0] = 'E'; - m->items[25].text[0] = 'F'; - } - else if (m->items[10].text[0] == 'A') - { - m->items[10].text[0] = 'Q'; - m->items[11].text[0] = 'R'; - m->items[12].text[0] = 'S'; - m->items[13].text[0] = 'T'; - m->items[14].text[0] = 'U'; - m->items[15].text[0] = 'V'; - m->items[16].text[0] = 'W'; - m->items[17].text[0] = 'X'; - m->items[18].text[0] = 'Y'; - m->items[19].text[0] = 'Z'; - m->items[20].text[0] = '0'; - m->items[21].text[0] = '1'; - m->items[22].text[0] = '2'; - m->items[23].text[0] = '3'; - m->items[24].text[0] = '4'; - m->items[25].text[0] = '5'; - } - else if (m->items[10].text[0] == 'Q') - { - m->items[10].text[0] = '6'; - m->items[11].text[0] = '7'; - m->items[12].text[0] = '8'; - m->items[13].text[0] = '9'; - - /* hide unused buttons */ - for (i=14; i<26; i++) - { - m->buttons[i].state &= ~BUTTON_VISIBLE; - } - m->buttons[10].shift[1] = 16; - m->buttons[11].shift[1] = 16; - m->buttons[12].shift[1] = 16; - m->buttons[13].shift[1] = 16; - m->buttons[26].shift[0] = 16; - m->buttons[27].shift[0] = 16; - m->buttons[28].shift[0] = 16; - m->buttons[29].shift[0] = 16; - } - else if (m->items[10].text[0] == '6') - { - m->items[10].text[0] = 'A'; - m->items[11].text[0] = 'B'; - m->items[12].text[0] = 'C'; - m->items[13].text[0] = 'D'; - m->items[14].text[0] = 'E'; - m->items[15].text[0] = 'F'; - m->items[16].text[0] = 'G'; - m->items[17].text[0] = 'H'; - m->items[18].text[0] = 'I'; - m->items[19].text[0] = 'J'; - m->items[20].text[0] = 'K'; - m->items[21].text[0] = 'L'; - m->items[22].text[0] = 'M'; - m->items[23].text[0] = 'N'; - m->items[24].text[0] = 'O'; - m->items[25].text[0] = 'P'; - - /* show previously unused buttons */ - for (i=14; i<26; i++) - { - m->buttons[i].state |= BUTTON_VISIBLE; - } - m->buttons[10].shift[1] = 4; - m->buttons[11].shift[1] = 4; - m->buttons[12].shift[1] = 4; - m->buttons[13].shift[1] = 4; - m->buttons[26].shift[0] = 4; - m->buttons[27].shift[0] = 4; - m->buttons[28].shift[0] = 4; - m->buttons[29].shift[0] = 4; - } -} - -static void cheatmenu_cb(void) -{ - int i; - int yoffset = 108; - gui_image bar_over; - gui_image star; - char temp[MAX_DESC_LENGTH]; - - /* Initialize textures */ - bar_over.texture = gxTextureOpenPNG(Overlay_bar_png,0); - star.texture = gxTextureOpenPNG(Star_full_png,0); - - /* Draw browser array */ - gxDrawRectangle(15, 108, 358, 26, 127, (GXColor)BG_COLOR_1); - gxDrawRectangle(15, 134, 358, 26, 127, (GXColor)BG_COLOR_2); - gxDrawRectangle(15, 160, 358, 26, 127, (GXColor)BG_COLOR_1); - gxDrawRectangle(15, 186, 358, 26, 127, (GXColor)BG_COLOR_2); - gxDrawRectangle(15, 212, 358, 26, 127, (GXColor)BG_COLOR_1); - gxDrawRectangle(15, 238, 358, 26, 127, (GXColor)BG_COLOR_2); - gxDrawRectangle(15, 264, 358, 26, 127, (GXColor)BG_COLOR_1); - gxDrawRectangle(15, 290, 358, 26, 127, (GXColor)BG_COLOR_2); - gxDrawRectangle(15, 316, 358, 26, 127, (GXColor)BG_COLOR_1); - gxDrawRectangle(15, 342, 358, 26, 127, (GXColor)BG_COLOR_2); - - /* Draw Cheat list */ - for (i=0; ((offset + i) < maxcheats) && (i < 10); i++) - { - if (i == selection) - { - /* selection bar */ - gxDrawTexture(bar_over.texture,16,yoffset+1,356,24,255); - - /* cheat description need to be specifically handled */ - if (type) - { - /* check if text is being edited */ - if (menu_cheats.bg_images[6].state & IMAGE_VISIBLE) - { - /* adjust offset so that last characters are visible */ - string_offset += FONT_writeCenter(cheatlist[offset + i].text+string_offset,16,40,366,yoffset+21,(GXColor)WHITE); - } - else - { - /* scroll text (speed = 1/10 frame) */ - if ((string_offset/10) >= strlen(cheatlist[offset + i].text)) - { - string_offset = 0; - } - - if (string_offset) - { - sprintf(temp,"%s ",cheatlist[offset + i].text+string_offset/10); - strncat(temp, cheatlist[offset + i].text, string_offset/10); - } - else - { - strcpy(temp, cheatlist[offset + i].text); - } - - if (FONT_writeCenter(temp,16,40,366,yoffset+21,(GXColor)WHITE)) - { - /* scroll text if string does not fit */ - string_offset ++; - } - } - } - else - { - FONT_writeCenter(cheatlist[offset + i].code,18,40,366,yoffset+22,(GXColor)WHITE); - } - } - else - { - if (type) - { - FONT_writeCenter(cheatlist[offset + i].text,16,40,366,yoffset+21,(GXColor)WHITE); - } - else - { - FONT_writeCenter(cheatlist[offset + i].code,18,40,366,yoffset+22,(GXColor)WHITE); - } - } - - /* draw cheat enable mark */ - if (cheatlist[offset + i].enable) - { - gxDrawTexture(star.texture,20,yoffset+5,16,16,255); - } - - yoffset += 26; - } - - /* New Entry */ - if (i < 10) - { - if (i == selection) - { - /* selection bar */ - gxDrawTexture(bar_over.texture,16,yoffset+1,356,24,255); - - /* check if new code is being edited */ - if (menu_cheats.bg_images[6].state & IMAGE_VISIBLE) - { - FONT_writeCenter(cheatlist[offset + selection].code,18,40,366,yoffset+22,(GXColor)WHITE); - } - else - { - FONT_writeCenter("New Code",18,40,366,yoffset+22,(GXColor)WHITE); - } - } - else - { - FONT_writeCenter("New Code",18,40,366,yoffset+22,(GXColor)WHITE); - } - } - - gxTextureClose(&bar_over.texture); - gxTextureClose(&star.texture); - - /* Extra helpers */ - if (maxcheats && !(menu_cheats.bg_images[6].state & IMAGE_VISIBLE)) - { - /* switch between cheat code & description preview */ - gui_image key_switch; - key_switch.texture = gxTextureOpenPNG(Key_DPAD_png,0); -#ifdef HW_RVL - gxDrawTexture(key_switch.texture,268,424,24,24,255); - FONT_write(type ? "View\nCode":"View\nText",16,300,436,640,(GXColor)WHITE); -#else - gxDrawTexture(key_switch.texture,272,424,24,24,255); - FONT_write(type ? "View\nCode":"View\nText",16,304,436,640,(GXColor)WHITE); -#endif - gxTextureClose(&key_switch.texture); - - /* delete & enable cheats */ - if ((offset + selection) < maxcheats) - { - gui_image key_enable; - gui_image key_delete; - #ifdef HW_RVL - key_enable.texture = gxTextureOpenPNG(Key_Plus_wii_png,0); - key_delete.texture = gxTextureOpenPNG(Key_Minus_wii_png,0); - gxDrawTexture(key_enable.texture,152,424,24,24,255); - gxDrawTexture(key_delete.texture,372,424,24,24,255); - FONT_write(cheatlist[offset + selection].enable ? "Disable\nCheat":"Enable\nCheat",16,184,436,640,(GXColor)WHITE); - FONT_write("Delete\nCheat",16,404,436,640,(GXColor)WHITE); - #else - key_enable.texture = gxTextureOpenPNG(Key_L_gcn_png,0); - key_delete.texture = gxTextureOpenPNG(Key_R_gcn_png,0); - gxDrawTexture(key_enable.texture,136,426,44,20,255); - gxDrawTexture(key_delete.texture,368,426,44,20,255); - FONT_write(cheatlist[offset + selection].enable ? "Disable\nCheat":"Enable\nCheat",16,188,436,640,(GXColor)WHITE); - FONT_write("Delete\nCheat",16,420,436,640,(GXColor)WHITE); - #endif - gxTextureClose(&key_enable.texture); - gxTextureClose(&key_delete.texture); - } - } -} - - -/**************************************************************************** - * CheatMenu - * - * Manage cheats for the currently loaded game - * - ****************************************************************************/ -void CheatMenu(void) -{ - int i, update = 0; - int digit_cnt = 0; - int max = 0; - char temp[256]; - char *str = NULL; - gui_menu *m = &menu_cheats; - - /* clear existing ROM patches */ - clear_cheats(); - - /* reset scrolling */ - string_offset = 0; - - /* background overlay */ - if (config.bg_overlay) - { - bg_cheats[1].state |= IMAGE_VISIBLE; - } - else - { - bg_cheats[1].state &= ~IMAGE_VISIBLE; - } - - /* selected item */ - m->selected = selection; - - /* slide-in menu */ - GUI_InitMenu(m); - GUI_DrawMenuFX(m,30,0); - m->cb = cheatmenu_cb; - - /* lock background elements */ - m->bg_images[2].state &= ~IMAGE_SLIDE_TOP; - m->bg_images[3].state &= ~IMAGE_SLIDE_BOTTOM; - m->bg_images[4].state &= ~IMAGE_SLIDE_TOP; - - while (update != -1) - { - /* update arrows buttons */ - if (offset > 0) m->arrows[0]->state |= BUTTON_VISIBLE; - else m->arrows[0]->state &= ~BUTTON_VISIBLE; - if ((offset + 10) < (maxcheats + 1)) m->arrows[1]->state |= BUTTON_VISIBLE; - else m->arrows[1]->state &= ~BUTTON_VISIBLE; - - /* draw menu */ - GUI_DrawMenu(m); - - /* restore cheats offset */ - if (!(menu_cheats.bg_images[6].state & IMAGE_VISIBLE)) - { - m->offset = offset; - m->max_items = maxcheats + 1; - m->max_buttons = 10; - } - - /* update menu */ - update = GUI_UpdateMenu(m); - - /* update selected cheat */ - if ((m->selected < 10) && (selection != m->selected)) - { - selection = m->selected; - string_offset = 0; - } - - /* save offset then restore default */ - if (!(m->bg_images[6].state & IMAGE_VISIBLE)) - { - offset = m->offset; - m->offset = 0; - m->max_items = m->max_buttons = 30; - } - - - /* handle pressed buttons */ - if (update > 0) - { - switch (m->selected) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: /* Edit cheat */ - { - if (type && ((selection + offset) != maxcheats)) - { - /* cheat description */ - str = cheatlist[offset + selection].text; - strcpy(temp, str); - max = MAX_DESC_LENGTH - 2; - digit_cnt = strlen(str); - if (digit_cnt <= max) - { - str[digit_cnt] = '*'; - str[digit_cnt+1] = 0; - } - - /* init specific characters */ - m->items[10].text[0] = '6'; - m->items[27].text[0] = ' '; - strcpy(m->items[27].comment,"Add White Space"); - switch_chars(); - } - else - { - /* cheat code */ - str = cheatlist[offset + selection].code; - strcpy(temp, str); - if ((offset + selection) == maxcheats) - { - /* initialize code */ - max = 0; - digit_cnt = 0; - str[0] = '*'; - str[1] = 0; - } - else - { - /* code type */ - if (str[6] == ':') - { - /* Action Replay code */ - if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) - { - /* 16-bit code */ - max = 10; - } - else - { - /* 8-bit code */ - max = 8; - } - } - else if (str[4] == '-') - { - /* 16-bit Game Genie code */ - max = 8; - } - else - { - /* 8-bit Game Genie code */ - max = 10; - } - - /* set cursor to end of code */ - digit_cnt = max + 1; - } - - /* init specific characters */ - m->items[10].text[0] = 'G'; - m->items[27].text[0] = ':'; - strcpy(m->items[27].comment,"Add Code Separator"); - switch_chars(); - } - - /* show digit buttons */ - for (i=10; i<30; i++) m->buttons[i].state |= BUTTON_VISIBLE; - - /* show right window */ - m->bg_images[6].state |= IMAGE_VISIBLE; - - /* disable left buttons */ - for (i=0; i<10; i++) m->buttons[i].state &= ~BUTTON_ACTIVE; - - /* disable arrow buttons */ - m->arrows[0]->state &= ~BUTTON_ACTIVE; - m->arrows[1]->state &= ~BUTTON_ACTIVE; - - /* slide in right window */ - GUI_DrawMenuFX(m,20,0); - - /* update helper */ - strcpy(action_cancel.comment,"Cancel"); - - /* select first digit */ - m->selected = 10; - - /* reset scrolling */ - string_offset = 0; - break; - } - - case 26: /* Backspace */ - { - if (digit_cnt > 0) - { - /* delete last character */ - str[digit_cnt--] = 0; - - /* code separator is being deleted */ - if ((str[digit_cnt] == ':') || (str[digit_cnt] == '-')) - { - /* reset detected code type (except 8-bit Game Genie code using 2 separators) */ - if (((system_hw & SYSTEM_PBC) == SYSTEM_MD) || (digit_cnt != 7)) - { - max = 0; - } - } - - /* edit mark */ - str[digit_cnt] = '*'; - - /* update scroll value if necessary */ - if (string_offset > 0) string_offset--; - } - break; - } - - case 27: - { - if (type && ((offset + selection) != maxcheats)) - { - /* SPACE character */ - if (digit_cnt <= max) - { - str[digit_cnt++] = ' '; - str[digit_cnt] = 0; - if (digit_cnt <= max) - { - str[digit_cnt] = '*'; - str[digit_cnt+1] = 0; - } - } - } - else - { - /* Separator character */ - if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) - { - /* 16-bit codes */ - if (digit_cnt == 4) - { - /* Game Genie code */ - max = 8; - str[4] = '-'; - } - else if ((digit_cnt == 6) && (max != 8)) - { - /* Action Replay code */ - max = 10; - str[6] = ':'; - } - else - { - break; - } - } - else - { - /* 8-bit codes */ - if (digit_cnt == 3) - { - /* Game Genie code */ - max = 10; - str[3] = '-'; - } - else if ((digit_cnt == 7) && (max == 10)) - { - /* Game Genie code (last part) */ - str[7] = '-'; - } - else if ((digit_cnt == 6) && (max != 10)) - { - /* Action Replay code */ - max = 8; - str[6] = ':'; - } - else - { - break; - } - } - - digit_cnt++; - str[digit_cnt] = '*'; - str[digit_cnt+1] = 0; - } - break; - } - - case 28: /* Next character set */ - { - GUI_DrawMenuFX(m,40,1); - switch_chars(); - GUI_DrawMenuFX(m,40,0); - break; - } - - case 29: /* Validate entry */ - { - /* check if entry is valid */ - if (type && ((offset + selection) != maxcheats)) - { - str[digit_cnt] = 0; - update = -1; - } - else if (max && (digit_cnt > max)) - { - if (decode_cheat(cheatlist[offset + selection].code, offset + selection)) - { - /* new cheat ? */ - if ((offset + selection) == maxcheats) - { - /* increase cheat count */ - maxcheats++; - - /* enable cheat by default */ - cheatlist[offset + selection].enable = 1; - - /* no description by default */ - strcpy(cheatlist[offset + selection].text,"No Description"); - } - - /* return to cheat selection */ - update = -1; - } - else - { - GUI_WaitPrompt("Error", "Invalid Cheat Code"); - } - } - break; - } - - default: /* Add Character */ - { - /* force code separator if none has been set yet */ - if ((max == 0) && (digit_cnt == 6)) break; - - /* force 8-bit Game Genie code last separator */ - if (((system_hw & SYSTEM_PBC) != SYSTEM_MD) && (max == 10) && (digit_cnt == 7)) break; - - /* add character */ - if ((digit_cnt <= max) || (max == 0)) - { - str[digit_cnt++] = m->items[m->selected].text[0]; - str[digit_cnt] = 0; - if ((digit_cnt <= max) || (max == 0)) - { - str[digit_cnt] = '*'; - str[digit_cnt+1] = 0; - } - if (string_offset > 0) string_offset ++; - } - break; - } - } - } - else if (update < 0) - { - if (m->bg_images[6].state & IMAGE_VISIBLE) - { - /* Restore old entry */ - strcpy(str, temp); - } - } - else - { - if (maxcheats && !(m->bg_images[6].state & IMAGE_VISIBLE)) - { - if ((m_input.keys & PAD_BUTTON_LEFT) || (m_input.keys & PAD_BUTTON_RIGHT)) - { - /* Switch between cheat code & description */ - type ^= 1; - - /* reset scrolling */ - string_offset = 0; - } - - if ((offset + selection) < maxcheats) - { - /* Special inputs */ - if (m_input.keys & PAD_TRIGGER_R) - { - /* sort cheat list */ - for (i = offset + selection + 1; i < maxcheats; i++) - { - strcpy(cheatlist[i-1].text,cheatlist[i].text); - strcpy(cheatlist[i-1].code,cheatlist[i].code); - cheatlist[i-1].address = cheatlist[i].address; - cheatlist[i-1].data = cheatlist[i].data; - cheatlist[i-1].enable = cheatlist[i].enable; - } - - /* clear last cheat */ - cheatlist[maxcheats-1].text[0] = 0; - cheatlist[maxcheats-1].code[0] = 0; - cheatlist[maxcheats-1].address = 0; - cheatlist[maxcheats-1].data = 0; - cheatlist[maxcheats-1].enable = 0; - - /* disable last button */ - if ((maxcheats - offset) < 10) - { - m->buttons[maxcheats - offset].state &= ~BUTTON_ACTIVE; - m->buttons[maxcheats - offset - 1].shift[1] = 0; - } - - /* decrease cheat count */ - maxcheats--; - - /* reset scrolling */ - string_offset = 0; - } - else if (m_input.keys & PAD_TRIGGER_L) - { - /* cheat ON/OFF */ - cheatlist[offset + selection].enable ^= 1; - } - } - } - } - - if (update < 0) - { - if (m->bg_images[6].state & IMAGE_VISIBLE) - { - /* slide out right window */ - GUI_DrawMenuFX(m,20,1); - - /* hide digit buttons */ - for (i=10; i<30; i++) m->buttons[i].state &= ~BUTTON_VISIBLE; - - /* hide right window */ - m->bg_images[6].state &= ~IMAGE_VISIBLE; - - /* update left buttons */ - for (i=0; i<10; i++) - { - if ((offset + i) < maxcheats) - { - m->buttons[i].state |= BUTTON_ACTIVE; - m->buttons[i].shift[1] = 1; - } - else if ((offset + i) == maxcheats) - { - m->buttons[i].state |= BUTTON_ACTIVE; - m->buttons[i].shift[1] = 0; - } - else - { - m->buttons[i].state &= ~BUTTON_ACTIVE; - m->buttons[i].shift[1] = 0; - } - } - - /* enable arrow buttons */ - m->arrows[0]->state |= BUTTON_ACTIVE; - m->arrows[1]->state |= BUTTON_ACTIVE; - - /* restore helper */ - strcpy(action_cancel.comment,"Back"); - - /* select current cheat */ - m->selected = selection; - - /* stay in menu */ - update = 0; - } - } - } - - /* apply ROM patches */ - apply_cheats(); - - /* save cheats to file */ - sprintf(temp, "%s/cheats/%s.pat", DEFAULT_PATH, rom_filename); - - if (maxcheats) - { - /* open file */ - FILE *f = fopen(temp, "w"); - - /* write cheats */ - if (f) - { - for (i=0; ibg_images[2].state |= IMAGE_SLIDE_TOP; - m->bg_images[3].state |= IMAGE_SLIDE_BOTTOM; - m->bg_images[4].state |= IMAGE_SLIDE_TOP; - - /* leave menu */ - m->cb = NULL; - GUI_DeleteMenu(m); - GUI_DrawMenuFX(m,30,1); -} - - -/**************************************************************************** - * CheatLoad - * - * Load cheats from associated .pat file, called when loading a new game - * ROM patches are automatically applied. - * RAM patches are applied once per frame. - * - ****************************************************************************/ -void CheatLoad(void) -{ - int len; - int cnt = 0; - char temp[256]; - - /* reset cheat count */ - maxcheats = 0; - - /* make cheat filename */ - sprintf(temp, "%s/cheats/%s.pat", DEFAULT_PATH, rom_filename); - - /* open file */ - FILE *f = fopen(temp, "r"); - if (f) - { - /* clear string */ - memset(temp, 0, 256); - - /* read cheats from file (one line per cheat) */ - while (fgets(temp, 256, f) && (maxcheats < MAX_CHEATS) && (cnt < MAX_CHEATS)) - { - /* remove CR & EOL chars */ - if ((temp[strlen(temp) - 2] == 0x0d) || (temp[strlen(temp) - 2] == 0x0a)) temp[strlen(temp) - 2] = 0; - else temp[strlen(temp) - 1] = 0; - - /* check cheat validty */ - len = decode_cheat(temp, maxcheats); - - if (len) - { - /* copy cheat code */ - strncpy(cheatlist[maxcheats].code, temp, len); - cheatlist[maxcheats].code[len] = 0; - len++; - - /* jump TAB and SPACE characters */ - while ((temp[len] == 0x20) || (temp[len] == 0x09)) len++; - - /* copy cheat description */ - strncpy(cheatlist[maxcheats].text, &temp[len], MAX_DESC_LENGTH - 1); - cheatlist[maxcheats].text[MAX_DESC_LENGTH - 1] = 0; - - /* increment cheat count */ - maxcheats++; - } - else if (!strcmp(temp,"ON") && config.autocheat) - { - /* enable flag */ - cheatlist[cnt++].enable = 1; - } - else if (!strcmp(temp,"OFF") && config.autocheat) - { - /* disable flag */ - cheatlist[cnt++].enable = 0; - } - } - - /* by default, disable cheats that were not flagged */ - while (cnt < maxcheats) cheatlist[cnt++].enable = 0; - - /* close file */ - fclose(f); - } - - /* apply ROM patches */ - apply_cheats(); - - /* adjust menu buttons */ - for (cnt=0; cnt<10; cnt++) - { - if (cnt < maxcheats) - { - menu_cheats.buttons[cnt].state |= BUTTON_ACTIVE; - menu_cheats.buttons[cnt].shift[1] = 1; - } - else if (cnt == maxcheats) - { - menu_cheats.buttons[cnt].state |= BUTTON_ACTIVE; - menu_cheats.buttons[cnt].shift[1] = 0; - } - else - { - menu_cheats.buttons[cnt].shift[1] = 0; - menu_cheats.buttons[cnt].state &= ~BUTTON_ACTIVE; - } - } - - /* reset menu */ - selection = offset = 0; -} - -/**************************************************************************** - * RAMCheatUpdate - * - * Apply RAM patches (this should be called once per frame) - * - ****************************************************************************/ -void RAMCheatUpdate(void) -{ - int index, cnt = maxRAMcheats; - - while (cnt) - { - /* get cheat index */ - index = cheatIndexes[--cnt]; - - /* apply RAM patch */ - if (cheatlist[index].data & 0xFF00) - { - /* word patch */ - *(u16 *)(work_ram + (cheatlist[index].address & 0xFFFE)) = cheatlist[index].data; - } - else - { - /* byte patch */ - work_ram[cheatlist[index].address & 0xFFFF] = cheatlist[index].data; - } - } -} - - -/**************************************************************************** - * ROMCheatUpdate - * - * Apply ROM patches (this should be called each time banking is changed) - * - ****************************************************************************/ -void ROMCheatUpdate(void) -{ - int index, cnt = maxROMcheats; - u8 *ptr; - - while (cnt) - { - /* get cheat index */ - index = cheatIndexes[MAX_CHEATS - cnt]; - - /* check if previous banked ROM address was patched */ - if (cheatlist[index].prev != NULL) - { - /* restore original data */ - *cheatlist[index].prev = cheatlist[index].old; - - /* no more patched ROM address */ - cheatlist[index].prev = NULL; - } - - /* get current banked ROM address */ - ptr = &z80_readmap[(cheatlist[index].address) >> 10][cheatlist[index].address & 0x03FF]; - - /* check if reference matches original ROM data */ - if (((u8)cheatlist[index].old) == *ptr) - { - /* patch data */ - *ptr = cheatlist[index].data; - - /* save patched ROM address */ - cheatlist[index].prev = ptr; - } - - /* next ROM patch */ - cnt--; - } -} diff --git a/genplus-gx/gx/gui/cheats.h b/genplus-gx/gx/gui/cheats.h deleted file mode 100644 index e6759a6a8a..0000000000 --- a/genplus-gx/gx/gui/cheats.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * cheats.c - * - * Cheats menu - * - * Copyright Eke-Eke (2010-2012) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifndef _CHEATS_H -#define _CHEATS_H - -#define CHEATS_UPDATE() ROMCheatUpdate() - -extern void CheatMenu(void); -extern void CheatLoad(void); -extern void RAMCheatUpdate(void); -extern void ROMCheatUpdate(void); - -#endif diff --git a/genplus-gx/gx/gui/filesel.c b/genplus-gx/gx/gui/filesel.c deleted file mode 100644 index 0ed07a0c4c..0000000000 --- a/genplus-gx/gx/gui/filesel.c +++ /dev/null @@ -1,645 +0,0 @@ -/* - * filesel.c - * - * ROM File Browser - * - * Copyright Eke-Eke (2009-2013) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#include "shared.h" -#include "filesel.h" -#include "font.h" -#include "gui.h" -#include "file_load.h" -#include "history.h" - -#define BG_COLOR_1 {0x49,0x49,0x49,0xff} -#define BG_COLOR_2 {0x66,0x66,0x66,0xff} - -#define SCROLL_SPEED 10 - -extern const u8 Browser_dir_png[]; -extern const u8 Snap_empty_png[]; -extern const u8 Cart_md_png[]; -extern const u8 Cart_ms_png[]; -extern const u8 Cart_gg_png[]; -extern const u8 Cart_sg_png[]; - -FILEENTRIES filelist[MAXFILES]; - -static int offset = 0; -static int selection = 0; -static int maxfiles = 0; -static int string_offset = 0; -static char prev_folder[MAXJOLIET]; -static void selector_cb(void); - -/*****************************************************************************/ -/* GUI Buttons data */ -/*****************************************************************************/ -static butn_data arrow_up_data = -{ - {NULL,NULL}, - {Button_up_png,Button_up_over_png} -}; - -static butn_data arrow_down_data = -{ - {NULL,NULL}, - {Button_down_png,Button_down_over_png} -}; - -/*****************************************************************************/ -/* GUI Arrows button */ -/*****************************************************************************/ - -static gui_butn arrow_up = {&arrow_up_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,0,0,0},14,76,360,32}; -static gui_butn arrow_down = {&arrow_down_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,0,0,0},14,368,360,32}; - -/*****************************************************************************/ -/* GUI helpers */ -/*****************************************************************************/ -static gui_item action_cancel = -{ - NULL,Key_B_png,"","Previous Directory",10,422,28,28 -}; - -static gui_item action_select = -{ - NULL,Key_A_png,"","Load ROM file",602,422,28,28 -}; - -/*****************************************************************************/ -/* GUI Background images */ -/*****************************************************************************/ -static gui_image bg_filesel[14] = -{ - {NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, - {NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, - {NULL,Banner_top_png,IMAGE_VISIBLE,0,0,640,108,255}, - {NULL,Banner_bottom_png,IMAGE_VISIBLE,0,380,640,100,255}, - {NULL,Main_logo_png,IMAGE_VISIBLE,466,40,152,44,255}, - {NULL,Frame_s1_png,IMAGE_VISIBLE,8,70,372,336,152}, - {NULL,Frame_s2_png,0,384,264,248,140,152}, - {NULL,Snap_empty_png,IMAGE_VISIBLE,424,148,160,112,255}, - {NULL,NULL,0,424,148,160,112,255}, - {NULL,NULL,0,388,147,240,152,255}, - {NULL,NULL,0,388,147,240,152,255}, - {NULL,NULL,0,392,118,232,148,255}, - {NULL,NULL,0,414,116,184,188,255}, - {NULL,NULL,0,416,144,180,228,255} -}; - -static const u8 *Cart_png[FILETYPE_MAX] = -{ - Cart_md_png, - Cart_md_png, - Cart_ms_png, - Cart_gg_png, - Cart_sg_png -}; - -static const char *Cart_dir[FILETYPE_MAX] = -{ - "md", - "cd", - "ms", - "gg", - "sg" -}; - -/*****************************************************************************/ -/* GUI Descriptor */ -/*****************************************************************************/ -static gui_menu menu_selector = -{ - "Game Selection", - -1,-1, - 0,0,14,0, - NULL, - NULL, - bg_filesel, - {&action_cancel, &action_select}, - {&arrow_up,&arrow_down}, - selector_cb -}; - - -static void selector_cb(void) -{ - int i; - char text[MAXPATHLEN]; - int yoffset = 108; - - /* Initialize directory icon */ - gui_image dir_icon; - dir_icon.texture = gxTextureOpenPNG(Browser_dir_png,0); - dir_icon.w = dir_icon.texture->width; - dir_icon.h = dir_icon.texture->height; - dir_icon.x = 26; - dir_icon.y = (26 - dir_icon.h)/2; - - /* Initialize selection bar */ - gui_image bar_over; - bar_over.texture = gxTextureOpenPNG(Overlay_bar_png,0); - bar_over.w = bar_over.texture->width; - bar_over.h = bar_over.texture->height; - bar_over.x = 16; - bar_over.y = (26 - bar_over.h)/2; - - /* Draw browser array */ - gxDrawRectangle(15, 108, 358, 26, 127, (GXColor)BG_COLOR_1); - gxDrawRectangle(15, 134, 358, 26, 127, (GXColor)BG_COLOR_2); - gxDrawRectangle(15, 160, 358, 26, 127, (GXColor)BG_COLOR_1); - gxDrawRectangle(15, 186, 358, 26, 127, (GXColor)BG_COLOR_2); - gxDrawRectangle(15, 212, 358, 26, 127, (GXColor)BG_COLOR_1); - gxDrawRectangle(15, 238, 358, 26, 127, (GXColor)BG_COLOR_2); - gxDrawRectangle(15, 264, 358, 26, 127, (GXColor)BG_COLOR_1); - gxDrawRectangle(15, 290, 358, 26, 127, (GXColor)BG_COLOR_2); - gxDrawRectangle(15, 316, 358, 26, 127, (GXColor)BG_COLOR_1); - gxDrawRectangle(15, 342, 358, 26, 127, (GXColor)BG_COLOR_2); - - /* Draw Files list */ - for (i = offset; (i < (offset + 10)) && (i < maxfiles); i++) - { - if (i == selection) - { - /* selection bar */ - gxDrawTexture(bar_over.texture,bar_over.x,yoffset+bar_over.y,bar_over.w,bar_over.h,255); - - /* scrolling text */ - if ((string_offset/SCROLL_SPEED) >= strlen(filelist[i].filename)) - { - string_offset = 0; - } - - if (string_offset) - { - sprintf(text,"%s ",filelist[i].filename+string_offset/SCROLL_SPEED); - strncat(text, filelist[i].filename, string_offset/SCROLL_SPEED); - } - else - { - strcpy(text, filelist[i].filename); - } - - /* print text */ - if (filelist[i].flags) - { - /* directory icon */ - gxDrawTexture(dir_icon.texture,dir_icon.x,yoffset+dir_icon.y,dir_icon.w,dir_icon.h,255); - if (FONT_write(text,18,dir_icon.x+dir_icon.w+6,yoffset+22,bar_over.w-dir_icon.w-26,(GXColor)WHITE)) - { - /* text scrolling */ - string_offset ++; - } - } - else - { - if (FONT_write(text,18,dir_icon.x,yoffset+22,bar_over.w-20,(GXColor)WHITE)) - { - /* text scrolling */ - string_offset ++; - } - } - } - else - { - if (filelist[i].flags) - { - /* directory icon */ - gxDrawTexture(dir_icon.texture,dir_icon.x,yoffset+dir_icon.y,dir_icon.w,dir_icon.h,255); - FONT_write(filelist[i].filename,18,dir_icon.x+dir_icon.w+6,yoffset+22,bar_over.w-dir_icon.w-26,(GXColor)WHITE); - } - else - { - FONT_write(filelist[i].filename,18,dir_icon.x,yoffset+22,bar_over.w-20,(GXColor)WHITE); - } - } - - yoffset += 26; - } - - gxTextureClose(&bar_over.texture); - gxTextureClose(&dir_icon.texture); -} - - -/**************************************************************************** - * FileSelector - * - * Browse directories and select a file from the file listing - * return ROM size - * - ****************************************************************************/ -int FileSelector(int type) -{ - short p; - int i; - int old = -1; - char fname[MAXPATHLEN]; - FILE *snap; - gui_menu *m = &menu_selector; - -#ifdef HW_RVL - int x,y; - gui_butn *button; -#endif - - /* Background overlay */ - if (config.bg_overlay) - { - bg_filesel[1].state |= IMAGE_VISIBLE; - } - else - { - bg_filesel[1].state &= ~IMAGE_VISIBLE; - } - - /* Hide all cartridge labels */ - for (i=0; i select all cartridge type */ - for (i=0; i variable game types */ - if (type < 0) - { - /* hide all cartridge labels */ - for (i=0; i 0) && (fname[i] != '.')) i--; - if (i > 0) fname[i] = 0; - - /* add PNG file extension */ - strcat(fname, ".png"); - - /* try to load screenshot file */ - snap = fopen(fname, "rb"); - if (snap) - { - bg_filesel[8].texture = gxTextureOpenPNG(0,snap); - if (bg_filesel[8].texture) - { - bg_filesel[8].state |= IMAGE_VISIBLE; - } - fclose(snap); - } - } - } - - /* update helper */ - if (m->selected != -1) - { - /* out of focus */ - strcpy(action_select.comment,""); - } - else if (filelist[selection].flags) - { - /* this is a directory */ - strcpy(action_select.comment,"Open Directory"); - } - else - { - /* this is a ROM file */ - strcpy(action_select.comment,"Load File"); - } - - /* Draw menu*/ - GUI_DrawMenu(m); - -#ifdef HW_RVL - if (Shutdown) - { - gxTextureClose(&w_pointer); - GUI_DeleteMenu(m); - GUI_FadeOut(); - shutdown(); - SYS_ResetSystem(SYS_POWEROFF, 0, 0); - } - else if (m_input.ir.valid) - { - /* get cursor position */ - x = m_input.ir.x; - y = m_input.ir.y; - - /* draw wiimote pointer */ - gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255); - - /* ensure we are in the selectable area */ - if ((x < 380) && (y >= 108) && (y <= 368)) - { - /* find selected item */ - selection = (y - 108) / 26; - if (selection > 9) selection = 9; - selection += offset; - if (selection >= maxfiles) selection = old; - - /* reset selection */ - m->selected = -1; - } - else - { - /* disable selection */ - m->selected = m->max_buttons + 2; - - /* find selected button */ - for (i=0; i<2; i++) - { - button = m->arrows[i]; - if (button) - { - if (button->state & BUTTON_VISIBLE) - { - if ((x>=button->x)&&(x<=(button->x+button->w))&&(y>=button->y)&&(y<=(button->y+button->h))) - { - m->selected = m->max_buttons + i; - break; - } - } - } - } - } - } - else - { - /* reset selection */ - m->selected = -1; - } -#endif - - /* copy EFB to XFB */ - gxSetScreen(); - - p = m_input.keys; - - /* highlight next item */ - if (p & PAD_BUTTON_DOWN) - { - selection++; - if (selection == maxfiles) - selection = offset = 0; - if ((selection - offset) >= 10) - offset += 10; - } - - /* highlight previous item */ - else if (p & PAD_BUTTON_UP) - { - selection--; - if (selection < 0) - { - selection = maxfiles - 1; - offset = maxfiles - 10; - } - if (selection < offset) - offset -= 10; - if (offset < 0) - offset = 0; - } - - /* go back one page */ - else if (p & (PAD_TRIGGER_L | PAD_BUTTON_LEFT)) - { - if (maxfiles >= 10) - { - selection -= 10; - if (selection < 0) - { - selection = offset = 0; - } - else if (selection < offset) - { - offset -= 10; - if (offset < 0) offset = 0; - } - } - } - - /* go forward one page */ - else if (p & (PAD_TRIGGER_R | PAD_BUTTON_RIGHT)) - { - if (maxfiles >= 10) - { - selection += 10; - if (selection > maxfiles - 1) - { - /* last page */ - selection = maxfiles - 1; - offset = maxfiles - 10; - } - else if (selection >= (offset + 10)) - { - /* next page */ - offset += 10; - if (offset > (maxfiles - 10)) offset = maxfiles - 10; - } - } - } - - /* quit */ - else if (p & PAD_TRIGGER_Z) - { - GUI_DeleteMenu(m); - return 0; - } - - /* previous directory */ - else if (p & PAD_BUTTON_B) - { - string_offset = 0; - - /* update browser directory (and get current folder)*/ - if (UpdateDirectory(1, prev_folder)) - { - /* get directory entries */ - maxfiles = ParseDirectory(); - - /* clear selection by default */ - selection = offset = 0; - old = -1; - - /* select previous directory */ - for (i=0; i= (offset + 10)) - { - offset += 10; - if (offset > (maxfiles - 10)) offset = maxfiles - 10; - } - break; - } - } - } - else - { - /* exit */ - GUI_DeleteMenu(m); - return 0; - } - } - - /* open selected file or directory */ - else if (p & PAD_BUTTON_A) - { - string_offset = 0; - - /* ensure we are in focus area */ - if (m->selected < m->max_buttons) - { - if (filelist[selection].flags) - { - /* get new directory */ - UpdateDirectory(0, filelist[selection].filename); - - /* get directory entries */ - maxfiles = ParseDirectory(); - - /* clear selection by default */ - selection = offset = 0; - old = -1; - } - else - { - /* load ROM file from device */ - int ret = LoadFile(selection); - - /* exit menu */ - GUI_DeleteMenu(m); - - /* return ROM size (or zero if an error occured) */ - return ret; - } - } - -#ifdef HW_RVL - /* arrow buttons selected */ - else if (m->selected == m->max_buttons) - { - /* up arrow */ - selection--; - if (selection < 0) - { - selection = maxfiles - 1; - offset = selection - 10 + 1; - } - if (selection < offset) offset -= 10; - if (offset < 0) offset = 0; - } - else if (m->selected == (m->max_buttons+1)) - { - /* down arrow */ - selection++; - if (selection == maxfiles) - selection = offset = 0; - if ((selection - offset) >= 10) - offset += 10; - } -#endif - } - } -} - -void ClearSelector(u32 max) -{ - maxfiles = max; - offset = 0; - selection = 0; -} diff --git a/genplus-gx/gx/gui/filesel.h b/genplus-gx/gx/gui/filesel.h deleted file mode 100644 index 213e304f69..0000000000 --- a/genplus-gx/gx/gui/filesel.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * filesel.c - * - * ROM File Browser - * - * Copyright Eke-Eke (2009-2013) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifndef _FILESEL_H -#define _FILESEL_H - -#define MAXJOLIET 256 -#define MAXFILES 1000 - -/* Filelist structure */ -typedef struct -{ - u8 flags; - char filename[MAXJOLIET]; -}FILEENTRIES; - -/* Globals */ -extern int FileSelector(int type); -extern void ClearSelector(u32 max); -extern FILEENTRIES filelist[MAXFILES]; - -#endif diff --git a/genplus-gx/gx/gui/font.c b/genplus-gx/gx/gui/font.c deleted file mode 100644 index 36582147e1..0000000000 --- a/genplus-gx/gx/gui/font.c +++ /dev/null @@ -1,400 +0,0 @@ -/***************************************************************************** - * font.c - * - * IPL font engine (using GX rendering) - * - * Copyright Eke-Eke (2009-2013) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#include "shared.h" -#include "font.h" - -#define _SHIFTR(v, s, w) \ - ((u32)(((u32)(v) >> (s)) & ((0x01 << (w)) - 1))) - -typedef struct _yay0header { - unsigned int id ATTRIBUTE_PACKED; - unsigned int dec_size ATTRIBUTE_PACKED; - unsigned int links_offset ATTRIBUTE_PACKED; - unsigned int chunks_offset ATTRIBUTE_PACKED; -} yay0header; - -static u8 *fontImage; -static u8 *fontTexture; -static void *ipl_fontarea; -static sys_fontheader *fontHeader; -static u8 font_size[256]; - -#ifndef HW_RVL - -/* disable Qoob Modchip before IPL access (emukiddid) */ -static void ipl_set_config(unsigned char c) -{ - volatile unsigned long* exi = (volatile unsigned long*)0xCC006800; - unsigned long val,addr; - addr=0xc0000000; - val = c << 24; - exi[0] = ((((exi[0]) & 0x405) | 256) | 48); //select IPL - //write addr of IPL - exi[0 * 5 + 4] = addr; - exi[0 * 5 + 3] = ((4 - 1) << 4) | (1 << 2) | 1; - while (exi[0 * 5 + 3] & 1); - //write the ipl we want to send - exi[0 * 5 + 4] = val; - exi[0 * 5 + 3] = ((4 - 1) << 4) | (1 << 2) | 1; - while (exi[0 * 5 + 3] & 1); - exi[0] &= 0x405; //deselect IPL -} - -#endif - -static void decode_szp(void *src,void *dest) -{ - u32 i,k,link; - u8 *dest8,*tmp; - u32 loff,coff,roff; - u32 size,cnt,cmask,bcnt; - yay0header *header; - - dest8 = (u8*)dest; - header = (yay0header*)src; - size = header->dec_size; - loff = header->links_offset; - coff = header->chunks_offset; - - roff = sizeof(yay0header); - cmask = 0; - cnt = 0; - bcnt = 0; - - do { - if(!bcnt) { - cmask = *(u32*)(src+roff); - roff += 4; - bcnt = 32; - } - - if(cmask&0x80000000) { - dest8[cnt++] = *(u8*)(src+coff); - coff++; - } else { - link = *(u16*)(src+loff); - loff += 2; - - tmp = dest8+(cnt-(link&0x0fff)-1); - k = link>>12; - if(k==0) { - k = (*(u8*)(src+coff))+18; - coff++; - } else k += 2; - - for(i=0;isheet_format==0x0000) { - cnt = (sys_fontdata->sheet_fullsize/2)-1; - - while(cnt>=0) { - idx = _SHIFTR(src[cnt],6,2); - val1 = data[idx]; - - idx = _SHIFTR(src[cnt],4,2); - val2 = data[idx]; - - dest[(cnt<<1)+0] =((val1&0xf0)|(val2&0x0f)); - - idx = _SHIFTR(src[cnt],2,2); - val1 = data[idx]; - - idx = _SHIFTR(src[cnt],0,2); - val2 = data[idx]; - - dest[(cnt<<1)+1] =((val1&0xf0)|(val2&0x0f)); - - cnt--; - } - } - DCStoreRange(dest,sys_fontdata->sheet_fullsize); -} - -static void GetFontTexel(s32 c,void *image,s32 pos,s32 stride) -{ - u32 sheets,rem; - u32 xoff,yoff; - u32 xpos,ypos; - u8 *img_start; - u8 *ptr1,*ptr2; - sys_fontheader *sys_fontdata = fontHeader; - - if(cfirst_char || c>sys_fontdata->last_char) c = sys_fontdata->inval_char; - else c -= sys_fontdata->first_char; - - sheets = sys_fontdata->sheet_column*sys_fontdata->sheet_row; - rem = c%sheets; - sheets = c/sheets; - xoff = (rem%sys_fontdata->sheet_column)*sys_fontdata->cell_width; - yoff = (rem/sys_fontdata->sheet_column)*sys_fontdata->cell_height; - img_start = fontImage+(sys_fontdata->sheet_size*sheets); - - ypos = 0; - while(yposcell_height) { - xpos = 0; - while(xposcell_width) { - ptr1 = img_start+(((sys_fontdata->sheet_width/8)<<5)*((ypos+yoff)/8)); - ptr1 = ptr1+(((xpos+xoff)/8)<<5); - ptr1 = ptr1+(((ypos+yoff)%8)<<2); - ptr1 = ptr1+(((xpos+xoff)%8)/2); - - ptr2 = image+((ypos/8)*(((stride<<1)/8)<<5)); - ptr2 = ptr2+(((xpos+pos)/8)<<5); - ptr2 = ptr2+(((xpos+pos)%8)/2); - ptr2 = ptr2+((ypos%8)<<2); - - *ptr2 = *ptr1; - - xpos += 2; - } - ypos++; - } -} - -static void DrawChar(unsigned char c, int xpos, int ypos, int size, GXColor color) -{ - /* reintialize texture object */ - GXTexObj texobj; - GX_InitTexObj(&texobj, fontTexture, fontHeader->cell_width, fontHeader->cell_height, GX_TF_I4, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_LoadTexObj(&texobj, GX_TEXMAP0); - - /* reinitialize font texture data */ - memset(fontTexture,0,fontHeader->cell_width * fontHeader->cell_height / 2); - GetFontTexel(c,fontTexture,0,fontHeader->cell_width/2); - DCFlushRange(fontTexture, fontHeader->cell_width * fontHeader->cell_height / 2); - GX_InvalidateTexAll(); - - /* adjust texture width */ - s32 width = (fontHeader->cell_width * size * vmode->fbWidth) / (fontHeader->cell_height * vmode->viWidth); - - /* adjust texture height */ - size = (size * vmode->efbHeight) / 480; - - /* GX rendering */ - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - GX_Position2s16(xpos, ypos - size); - GX_Color4u8(color.r, color.g, color.b, 0xff); - GX_TexCoord2f32(0.0, 0.0); - GX_Position2s16(xpos + width, ypos - size); - GX_Color4u8(color.r, color.g, color.b, 0xff); - GX_TexCoord2f32(1.0, 0.0); - GX_Position2s16(xpos + width, ypos); - GX_Color4u8(color.r, color.g, color.b, 0xff); - GX_TexCoord2f32(1.0, 1.0); - GX_Position2s16(xpos, ypos); - GX_Color4u8(color.r, color.g, color.b, 0xff); - GX_TexCoord2f32(0.0, 1.0); - GX_End(); - GX_DrawDone(); -} - -/**************************************************************************** - * IPL font support - * - ****************************************************************************/ -extern void __SYS_ReadROM(void *buf,u32 len,u32 offset); - -int FONT_Init(void) -{ -#ifndef HW_RVL - /* --- Game Cube --- disable Qoob before accessing IPL */ - ipl_set_config(6); -#endif - - /* read IPL font (ASCII) from Mask ROM */ - ipl_fontarea = memalign(32,131360); - if (!ipl_fontarea) - return 0; - memset(ipl_fontarea,0,131360); - __SYS_ReadROM(ipl_fontarea+119072,12288,0x1FCF00); - - /* YAY0 decompression */ - decode_szp(ipl_fontarea+119072,ipl_fontarea); - - /* retrieve IPL font data */ - fontHeader = (sys_fontheader*)ipl_fontarea; - fontImage = (u8*)((((u32)ipl_fontarea+fontHeader->sheet_image)+31)&~31); - - /* expand to I4 format */ - expand_font((u8*)ipl_fontarea+fontHeader->sheet_image,fontImage); - - /* character width table */ - int i,c; - for (i=0; i<256; ++i) - { - if ((i < fontHeader->first_char) || (i > fontHeader->last_char)) - c = fontHeader->inval_char; - else - c = i - fontHeader->first_char; - - font_size[i] = ((u8*)fontHeader)[fontHeader->width_table + c]; - } - - /* initialize texture data */ - fontTexture = memalign(32, fontHeader->cell_width * fontHeader->cell_height / 2); - if (!fontTexture) - { - free(ipl_fontarea); - return 0; - } - - return 1; -} - -void FONT_Shutdown(void) -{ - if (fontHeader) - free(ipl_fontarea); - if (fontTexture) - free(fontTexture); -} - -int FONT_write(char *string, int size, int x, int y, int max_width, GXColor color) -{ - int w, ox; - - x -= (vmode->fbWidth / 2); - y -= (vmode->efbHeight / 2); - - ox = x; - - while (*string) - { - if (*string == '\n') - { - x = ox; - y += size; - } - else - { - w = (font_size[(u8)*string] * size * vmode->fbWidth) / (fontHeader->cell_height * vmode->viWidth); - if ((x + w) > (ox + max_width)) return strlen(string); - DrawChar(*string, x, y, size,color); - x += w; - } - string++; - } - - return 0; -} - -int FONT_writeCenter(char *string, int size, int x1, int x2, int y, GXColor color) -{ - int x; - int i = 0; - int w = 0; - - while (string[i] && (string[i] != '\n')) - { - w += (font_size[(u8)string[i++]] * size * vmode->fbWidth) / (fontHeader->cell_height * vmode->viWidth); - } - - if ((x1 + w) > x2) w = x2 - x1; - x = x1 + (x2 - x1 - w - vmode->fbWidth) / 2; - x2 -= (vmode->fbWidth / 2); - y -= (vmode->efbHeight / 2); - - while (*string && (*string != '\n')) - { - w = (font_size[(u8)*string] * size * vmode->fbWidth) / (fontHeader->cell_height * vmode->viWidth); - if ((x + w) > x2) return strlen(string); - DrawChar(*string, x, y, size,color); - x += w; - string++; - } - - if (*string == '\n') - { - string++; - return FONT_writeCenter(string, size, x1, x2 + (vmode->fbWidth / 2), y + size + (vmode->efbHeight / 2), color); - } - - return 0; -} - -int FONT_alignRight(char *string, int size, int x, int y, GXColor color) -{ - int ox; - int i = 0; - int w = 0; - - while (string[i] && (string[i] != '\n')) - { - w += (font_size[(u8)string[i++]] * size * vmode->fbWidth) / (fontHeader->cell_height * vmode->viWidth); - } - - x -= (vmode->fbWidth / 2); - y -= (vmode->efbHeight / 2); - - ox = x; - x -= w; - - while (*string && (*string != '\n')) - { - w = (font_size[(u8)*string] * size * vmode->fbWidth) / (fontHeader->cell_height * vmode->viWidth); - if ((x + w) > ox) return strlen(string); - DrawChar(*string, x, y, size,color); - x += w; - string++; - } - - if (*string == '\n') - { - string++; - return FONT_alignRight(string, size, ox + (vmode->fbWidth / 2), y + size + (vmode->efbHeight / 2), color); - } - - return 0; -} diff --git a/genplus-gx/gx/gui/font.h b/genplus-gx/gx/gui/font.h deleted file mode 100644 index 8f516558af..0000000000 --- a/genplus-gx/gx/gui/font.h +++ /dev/null @@ -1,49 +0,0 @@ -/***************************************************************************** - * font.c - * - * IPL font engine (using GX rendering) - * - * Copyright Eke-Eke (2009-2013) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifndef _FONT_H -#define _FONT_H - -extern int FONT_Init(void); -extern void FONT_Shutdown(void); -extern int FONT_write(char *string, int size, int x, int y, int max_width, GXColor color); -extern int FONT_writeCenter(char *string, int size, int x1, int x2, int y, GXColor color); -extern int FONT_alignRight(char *string, int size, int x, int y, GXColor color); - -#endif diff --git a/genplus-gx/gx/gui/gui.c b/genplus-gx/gx/gui/gui.c deleted file mode 100644 index 21fc49065e..0000000000 --- a/genplus-gx/gx/gui/gui.c +++ /dev/null @@ -1,1968 +0,0 @@ -/**************************************************************************** - * gui.c - * - * generic GUI Engine (using GX rendering) - * - * Copyright Eke-Eke (2009-2010) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#include "shared.h" -#include "gui.h" -#include "font.h" - -#ifdef HW_RVL -gx_texture *w_pointer; -#endif - -u8 SILENT = 0; - -/* message box */ -static gui_message message_box; -static lwp_t msgboxthread; - -/* background color (black) */ -static const GXColor bg_color = {0x00,0x00,0x00,0xff}; - -/****************************************************************************/ -/* Generic GUI routines */ -/*****************************************************************************/ - -/* Allocate Menu texture images data */ -void GUI_InitMenu(gui_menu *menu) -{ - int i; - gui_item *item; - gui_butn *button; - gui_image *image; - - /* background elements */ - for (i=0; imax_images; i++) - { - image = &menu->bg_images[i]; - image->texture = gxTextureOpenPNG(image->data,0); - } - - for (i=0; i<2; i++) - { - /* key helpers */ - item = menu->helpers[i]; - if (item) - item->texture = gxTextureOpenPNG(item->data,0); - - /* arrows */ - button = menu->arrows[i]; - if (button) - { - if (!button->data->texture[0]) - button->data->texture[0] = gxTextureOpenPNG(button->data->image[0],0); - if (!button->data->texture[1]) - button->data->texture[1] = gxTextureOpenPNG(button->data->image[1],0); - - /* initial state */ - button->state &= ~BUTTON_VISIBLE; - if (((i==0) && (menu->offset != 0)) || ((i==1) && (menu->offset + menu->max_buttons) < menu->max_items)) - button->state |= BUTTON_VISIBLE; - } - } - - /* menu buttons */ - for (i=0; imax_buttons; i++) - { - button = &menu->buttons[i]; - if (button->data) - { - if (!button->data->texture[0]) - button->data->texture[0] = gxTextureOpenPNG(button->data->image[0],0); - if (!button->data->texture[1]) - button->data->texture[1] = gxTextureOpenPNG(button->data->image[1],0); - } - } - - /* menu items */ - for (i=0; imax_items; i++) - { - item = &menu->items[i]; - if (item->data) - item->texture = gxTextureOpenPNG(item->data,0); - } - - /* update message box */ - message_box.parent = menu; -} - -/* Release Menu allocated memory */ -void GUI_DeleteMenu(gui_menu *menu) -{ - int i; - gui_butn *button; - gui_item *item; - gui_image *image; - - /* background elements */ - for (i=0; imax_images; i++) - { - image = &menu->bg_images[i]; - gxTextureClose(&image->texture); - } - - for (i=0; i<2; i++) - { - /* key helpers */ - item = menu->helpers[i]; - if (item) - gxTextureClose(&item->texture); - - /* arrows */ - button = menu->arrows[i]; - if (button) - { - gxTextureClose(&button->data->texture[0]); - gxTextureClose(&button->data->texture[1]); - } - } - - /* menu buttons */ - for (i=0; imax_buttons; i++) - { - button = &menu->buttons[i]; - if (button->data) - { - gxTextureClose(&button->data->texture[0]); - gxTextureClose(&button->data->texture[1]); - } - } - - /* menu items */ - for (i=0; imax_items; i++) - { - item = &menu->items[i]; - gxTextureClose(&item->texture); - } -} - -extern void gxSnapshot(void); - -/* Draw Menu */ -void GUI_DrawMenu(gui_menu *menu) -{ - int i; - gui_item *item; - gui_butn *button; - gui_image *image; - - /* background color */ - if (menu->screenshot) - { - gxClearScreen((GXColor)BLACK); - gxDrawScreenshot(menu->screenshot); - } - else - { - gxClearScreen(bg_color); - } - - /* background elements */ - for (i=0; imax_images; i++) - { - image = &menu->bg_images[i]; - if (image->state & IMAGE_VISIBLE) - { - if (image->state & IMAGE_REPEAT) - gxDrawTextureRepeat(image->texture,image->x,image->y,image->w,image->h,image->alpha); - else - gxDrawTexture(image->texture,image->x,image->y,image->w,image->h,image->alpha); - } - } - - /* menu title */ - FONT_write(menu->title, 22,10,56,640,(GXColor)WHITE); - - /* draw buttons + items */ - for (i=0; imax_buttons; i++) - { - button = &menu->buttons[i]; - - if (button->state & BUTTON_VISIBLE) - { - /* item select (text or image) */ - item = (menu->items) ? (&menu->items[menu->offset + i]) : NULL; - - /* draw button + items */ - if ((i == menu->selected) || (button->state & BUTTON_SELECTED)) - { - if (button->data) - gxDrawTexture(button->data->texture[1],button->x-4,button->y-4,button->w+8,button->h+8,255); - - if (item) - { - if (item->texture) - { - gxDrawTexture(item->texture, item->x-4,item->y-4,item->w+8,item->h+8,255); - FONT_writeCenter(item->text,18,button->x+4,item->x-4,button->y+(button->h - 36)/2+18,(GXColor)DARK_GREY); - } - else - { - FONT_writeCenter(item->text,18,item->x-4,item->x+item->w+4,button->y+(button->h-18)/2+18,(GXColor)DARK_GREY); - } - } - } - else - { - if (button->data) - gxDrawTexture(button->data->texture[0],button->x,button->y,button->w, button->h,255); - - if (item) - { - if (item->texture) - { - gxDrawTexture(item->texture,item->x,item->y,item->w,item->h,255); - FONT_writeCenter(item->text,16,button->x+8,item->x,button->y+(button->h - 32)/2+16,(GXColor)DARK_GREY); - } - else - { - FONT_writeCenter(item->text,16,item->x,item->x+item->w,button->y+(button->h - 16)/2+16,(GXColor)DARK_GREY); - } - } - } - } - } - - /* draw arrow */ - for (i=0; i<2; i++) - { - button = menu->arrows[i]; - if (button) - { - if (button->state & BUTTON_VISIBLE) - { - if (menu->selected == (menu->max_buttons + i)) - gxDrawTexture(button->data->texture[1],button->x-2,button->y-2,button->w+4,button->h+4,255); - else - gxDrawTexture(button->data->texture[0],button->x,button->y,button->w, button->h,255); - } - } - } - - /* left comment */ - item = menu->helpers[0]; - if (item) - { - if (item->data && strlen(item->comment)) - { - gxDrawTexture(item->texture,item->x,item->y,item->w,item->h,255); - FONT_write(item->comment,16,item->x+item->w+6,item->y+(item->h-16)/2 + 16,640,(GXColor)WHITE); - } - } - - /* right comment */ - item = menu->helpers[1]; - if (item) - { - if (item->data && strlen(item->comment)) - { - gxDrawTexture(item->texture,item->x,item->y,item->w,item->h,255); - FONT_alignRight(item->comment,16,item->x-6,item->y+(item->h-16)/2+16,(GXColor)WHITE); - } - } - - if (menu->cb) - menu->cb(); -} - -/* Draw Menu with transitions effects */ -void GUI_DrawMenuFX(gui_menu *menu, u8 speed, u8 out) -{ - int i,temp,xoffset,yoffset; - int max_offset = 0; - u8 item_alpha = 255; - GXColor text_color = DARK_GREY; - gui_item *item; - gui_butn *button; - gui_image *image; - - /* find maximal offset */ - for (i=0; imax_images; i++) - { - image = &menu->bg_images[i]; - - if (image->state & IMAGE_SLIDE_LEFT) - { - temp = image->x + image->w; - if (max_offset < temp) - max_offset = temp; - } - else if (image->state & IMAGE_SLIDE_RIGHT) - { - temp = 640 - image->x; - if (max_offset < temp) - max_offset = temp; - } - - if (image->state & IMAGE_SLIDE_TOP) - { - temp = image->y + image->h; - if (max_offset < temp) - max_offset = temp; - } - else if (image->state & IMAGE_SLIDE_BOTTOM) - { - temp = 480 - image->y; - if (max_offset < temp) - max_offset = temp; - } - } - - temp = max_offset; - - /* Alpha steps */ - int alpha = 0; - int alpha_step = (255 * speed) / max_offset; - if (out) - { - alpha = 255; - alpha_step = -alpha_step; - } - - /* Let's loop until final position has been reached */ - while (temp > 0) - { - /* background color */ - if (menu->screenshot) - { - gxClearScreen((GXColor)BLACK); - if (alpha >= menu->screenshot) - gxDrawScreenshot(menu->screenshot); - else - gxDrawScreenshot(255 - alpha); - } - else - { - gxClearScreen(bg_color); - } - - /* background images */ - for (i=0; imax_images; i++) - { - image = &menu->bg_images[i]; - - /* X offset */ - if (image->state & IMAGE_SLIDE_LEFT) - xoffset = out ? (temp - max_offset) : (-temp); - else if (image->state & IMAGE_SLIDE_RIGHT) - xoffset = out ? (max_offset - temp) : (temp); - else - xoffset = 0; - - /* Y offset */ - if (image->state & IMAGE_SLIDE_TOP) - yoffset = out ? (temp - max_offset) : (-temp); - else if (image->state & IMAGE_SLIDE_BOTTOM) - yoffset = out ? (max_offset - temp) : (temp); - else - yoffset = 0; - - /* draw image */ - if ((image->state & IMAGE_FADE) && ((out && (image->alpha > alpha)) || (!out && (image->alpha < alpha)))) - { - /* FADE In-Out */ - if (image->state & IMAGE_VISIBLE) - { - if (image->state & IMAGE_REPEAT) - gxDrawTextureRepeat(image->texture,image->x+xoffset,image->y+yoffset,image->w,image->h,alpha); - else - gxDrawTexture(image->texture,image->x+xoffset,image->y+yoffset,image->w,image->h,alpha); - } - } - else - { - if (image->state & IMAGE_VISIBLE) - { - if (image->state & IMAGE_REPEAT) - gxDrawTextureRepeat(image->texture,image->x+xoffset,image->y+yoffset,image->w,image->h,image->alpha); - else - gxDrawTexture(image->texture,image->x+xoffset,image->y+yoffset,image->w,image->h,image->alpha); - } - } - } - - /* menu title */ - if ((menu->bg_images[2].state & IMAGE_SLIDE_TOP) || (menu->bg_images[3].state & IMAGE_SLIDE_TOP)) - FONT_write(menu->title, 22,10,out ? (56 + temp - max_offset) : (56 - temp),640,(GXColor)WHITE); - else - FONT_write(menu->title, 22,10,56,640,(GXColor)WHITE); - - /* draw buttons + items */ - for (i=0; imax_buttons; i++) - { - button = &menu->buttons[i]; - - if (button->state & BUTTON_VISIBLE) - { - /* X offset */ - if (button->state & BUTTON_SLIDE_LEFT) - xoffset = out ? (temp - max_offset) : (-temp); - else if (button->state & BUTTON_SLIDE_RIGHT) - xoffset = out ? (max_offset - temp) : (temp); - else - xoffset = 0; - - /* Y offset */ - if (button->state & BUTTON_SLIDE_TOP) - yoffset = out ? (temp - max_offset) : (-temp); - else if (button->state & BUTTON_SLIDE_BOTTOM) - yoffset = out ? (max_offset - temp) : (temp); - else - yoffset = 0; - - /* Alpha transparency */ - if (button->state & BUTTON_FADE) - { - item_alpha = alpha; - text_color.a = alpha; - } - else - { - item_alpha = 255; - text_color.a = 255; - } - - /* item select (text or image) */ - item = (menu->items) ? (&menu->items[menu->offset + i]) : NULL; - - /* draw button + items */ - if ((i == menu->selected) || (button->state & BUTTON_SELECTED)) - { - if (button->data) - gxDrawTexture(button->data->texture[1],button->x+xoffset-4,button->y+yoffset-4,button->w+8,button->h+8,item_alpha); - - if (item) - { - if (item->texture) - { - gxDrawTexture(item->texture, item->x+xoffset-4,item->y+yoffset-4,item->w+8,item->h+8,item_alpha); - FONT_writeCenter(item->text,18,button->x+xoffset+4,item->x+xoffset-4,button->y+yoffset+(button->h - 36)/2+18,text_color); - } - else - { - FONT_writeCenter(item->text,18,item->x+xoffset+2,item->x+item->w+xoffset+2,button->y+yoffset+(button->h-18)/2+18,text_color); - } - } - } - else - { - if (button->data) - gxDrawTexture(button->data->texture[0],button->x+xoffset,button->y+yoffset,button->w, button->h,item_alpha); - - if (item) - { - if (item->texture) - { - gxDrawTexture(item->texture,item->x+xoffset,item->y+yoffset,item->w,item->h,item_alpha); - FONT_writeCenter(item->text,16,button->x+xoffset+8,item->x+xoffset,button->y+yoffset+(button->h - 32)/2+16,text_color); - } - else - { - FONT_writeCenter(item->text,16,item->x+xoffset,item->x+item->w+xoffset,button->y+yoffset+(button->h - 16)/2+16,text_color); - } - } - } - } - } - - /* draw arrow */ - for (i=0; i<2; i++) - { - button = menu->arrows[i]; - if (button) - { - if (button->state & BUTTON_VISIBLE) - { - if (menu->selected == (menu->max_buttons + i)) - gxDrawTexture(button->data->texture[1],button->x-2,button->y-2,button->w+4,button->h+4,255); - else - gxDrawTexture(button->data->texture[0],button->x,button->y,button->w, button->h,255); - } - } - } - - if (!(menu->bg_images[3].state & IMAGE_SLIDE_BOTTOM) && !(menu->bg_images[4].state & IMAGE_SLIDE_BOTTOM)) - { - /* left comment */ - item = menu->helpers[0]; - if (item) - { - if (item->data && strlen(item->comment)) - { - gxDrawTexture(item->texture,item->x,item->y,item->w,item->h,255); - FONT_write(item->comment,16,item->x+item->w+6,item->y+(item->h-16)/2 + 16,640,(GXColor)WHITE); - } - } - - /* right comment */ - item = menu->helpers[1]; - if (item) - { - if (item->data && strlen(item->comment)) - { - gxDrawTexture(item->texture,item->x,item->y,item->w,item->h,255); - FONT_alignRight(item->comment,16,item->x-6,item->y+(item->h-16)/2+16,(GXColor)WHITE); - } - } - } - - if (menu->cb) - menu->cb(); - - /* update offset */ - temp -= speed; - - /* update alpha */ - alpha += alpha_step; - if (alpha > 255) - alpha = 255; - else if (alpha < 0) - alpha = 0; - - - /* copy EFB to XFB */ - gxSetScreen(); - } - - /* final position */ - if (!out) - { - GUI_DrawMenu(menu); - gxSetScreen(); - } - else if (menu->screenshot) - { - gxClearScreen((GXColor)BLACK); - gxDrawScreenshot(255); - gxSetScreen(); - } -} - -/* Basic menu title slide effect */ -void GUI_SlideMenuTitle(gui_menu *m, int title_offset) -{ -#ifdef HW_RVL - gui_butn *button; - int i,x,y; -#endif - - char title[64]; - strcpy(title,m->title); - - while (title_offset > 0) - { - /* update title */ - strcpy(m->title,title+title_offset); - m->title[strlen(title)-title_offset-1] = 0; - - /* draw menu */ - GUI_DrawMenu(m); - -#ifdef HW_RVL - /* keep pointer active */ - if (m_input.ir.valid) - { - /* get cursor position */ - x = m_input.ir.x; - y = m_input.ir.y; - - /* draw wiimote pointer */ - gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255); - - /* check for valid buttons */ - m->selected = m->max_buttons + 2; - for (i=0; imax_buttons; i++) - { - button = &m->buttons[i]; - if ((button->state & BUTTON_ACTIVE)&&(x>=button->x)&&(x<=(button->x+button->w))&&(y>=button->y)&&(y<=(button->y+button->h))) - { - m->selected = i; - break; - } - } - - for (i=0; i<2; i++) - { - button = m->arrows[i]; - if (button) - { - if (button->state & BUTTON_VISIBLE) - { - if ((x<=(button->x+button->w))&&(y>=button->y)&&(y<=(button->y+button->h))) - { - m->selected = m->max_buttons + i; - break; - } - } - } - } - } -#endif - gxSetScreen(); - usleep(6000); - title_offset--; - } - strcpy(m->title,title); -} - -/* Update current menu */ -int GUI_UpdateMenu(gui_menu *menu) -{ - u16 p; - int ret = 0; - int selected = menu->selected; - int max_items = menu->max_items; - int max_buttons = menu->max_buttons; - gui_butn *button; - -#ifdef HW_RVL - if (Shutdown) - { - GUI_DeleteMenu(menu); - GUI_FadeOut(); - shutdown(); - SYS_ResetSystem(SYS_POWEROFF, 0, 0); - } - else if (m_input.ir.valid) - { - /* get cursor position */ - int x = m_input.ir.x; - int y = m_input.ir.y; - - /* draw wiimote pointer */ - gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255); - - /* check for valid buttons */ - selected = max_buttons + 2; - int i; - for (i=0; ibuttons[i]; - if ((button->state & BUTTON_ACTIVE) && (button->state & BUTTON_VISIBLE)) - { - if((x>=button->x)&&(x<=(button->x+button->w))&&(y>=button->y)&&(y<=(button->y+button->h))) - { - selected = i; - break; - } - } - } - - for (i=0; i<2; i++) - { - button = menu->arrows[i]; - if (button) - { - if ((button->state & BUTTON_ACTIVE) && (button->state & BUTTON_VISIBLE)) - { - if ((x<=(button->x+button->w))&&(y>=button->y)&&(y<=(button->y+button->h))) - { - selected = max_buttons + i; - break; - } - } - } - } - } - else - { - /* reinitialize selection */ - if (selected >= menu->max_buttons) - { - selected = 0; - while ((selected < (menu->max_buttons + 2)) && - (!(menu->buttons[selected].state & BUTTON_ACTIVE) || - !(menu->buttons[selected].state & BUTTON_VISIBLE))) - selected++; - } - } -#endif - - /* update screen */ - gxSetScreen(); - - /* update menu */ - p = m_input.keys; - - if (selected < max_buttons) - { - button = &menu->buttons[selected]; - if (p & PAD_BUTTON_UP) - { - selected -= button->shift[0]; - if (selected < 0) - { - selected = 0; - if (menu->offset) - menu->offset --; - } - } - else if (p & PAD_BUTTON_DOWN) - { - selected += button->shift[1]; - if (selected >= max_buttons) - { - selected = max_buttons - 1; - if ((menu->offset + selected) < (max_items - 1)) - menu->offset ++; - } - } - else if (p & PAD_BUTTON_LEFT) - { - selected -= button->shift[2]; - if (selected < 0) - { - selected = 0; - if (menu->offset) - menu->offset --; - } - } - else if (p & PAD_BUTTON_RIGHT) - { - selected += button->shift[3]; - if (selected >= max_buttons) - { - selected = max_buttons - 1; - if ((menu->offset + selected) < (max_items - 1)) - menu->offset ++; - } - } - } - - if (p & PAD_BUTTON_A) - { - if (selected < max_buttons) - ret = 1; /* menu clicked */ - else if (selected == max_buttons) - menu->offset --; /* up arrow */ - else if (selected == (max_buttons+1)) - menu->offset ++; /* down arrow */ - } - else if ((p & PAD_BUTTON_B) || (p & PAD_TRIGGER_Z)) - { - /* quit menu */ - ret = -1; - } - - /* selected item has changed ? */ - if (menu->selected != selected) - { - if (selected < max_buttons) - { - /* sound fx */ - button = &menu->buttons[selected]; - if (button->state & BUTTON_OVER_SFX) - { - ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size, - ((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL); - } - } - else if (selected < (max_buttons + 2)) - { - /* sound fx */ - button = menu->arrows[selected-max_buttons]; - if (button->state & BUTTON_OVER_SFX) - { - ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size, - ((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL); - } - } - - /* update selection */ - menu->selected = selected; - } - - /* update helper comment */ - if (menu->helpers[1]) - { - if ((menu->offset + selected) < max_items) - { - gui_item *item = &menu->items[menu->offset + selected]; - strcpy(menu->helpers[1]->comment,item->comment); - } - else - { - strcpy(menu->helpers[1]->comment,""); - } - } - - if (ret > 0) - { - if (selected < max_buttons) - { - /* sound fx */ - button = &menu->buttons[selected]; - if (button->state & BUTTON_SELECT_SFX) - { - ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_select_pcm,button_select_pcm_size, - ((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL); - } - } - } - - return ret; -} - -/* Generic routine to render & update menus */ -int GUI_RunMenu(gui_menu *menu) -{ - int update = 0; - - /* update menu */ - while (!update) - { - GUI_DrawMenu(menu); - update = GUI_UpdateMenu(menu); - - /* update arrows buttons status (items list) */ - if (menu->arrows[0]) - { - if (menu->offset > 0) - menu->arrows[0]->state |= BUTTON_VISIBLE; - else - menu->arrows[0]->state &= ~BUTTON_VISIBLE; - } - - if (menu->arrows[1]) - { - if ((menu->offset + menu->max_buttons) < menu->max_items) - menu->arrows[1]->state |= BUTTON_VISIBLE; - else - menu->arrows[1]->state &= ~BUTTON_VISIBLE; - } - } - - if (update == 2) - return (-2-menu->offset-menu->selected); - else if (update == 1) - return (menu->offset + menu->selected); - else - return -1; - } - -/* Text Window */ -void GUI_TextWindow(gui_menu *parent, char *title, char items[][64], u8 nb_items, u8 fontsize) -{ - int i, quit = 0; - -#ifdef HW_RVL - int x,y; -#endif - - /* initialize window */ - gx_texture *window = gxTextureOpenPNG(Frame_s1_png,0); - gx_texture *top = gxTextureOpenPNG(Frame_s1_title_png,0); - - /* window position */ - int xwindow = (640 - window->width) /2; - int ywindow = (480 - window->height)/2; - - /* text position */ - int ypos = ywindow + top->height + (window->height - top->height - fontsize*nb_items) / 2 + fontsize/2; - - /* disable helper comment */ - const u8 *data = NULL; - if (parent->helpers[1]) - { - data = parent->helpers[1]->data; - parent->helpers[1]->data = NULL; - } - - /* slide in */ - int yoffset = ywindow + window->height; - while (yoffset > 0) - { - /* draw parent menu */ - GUI_DrawMenu(parent); - - /* draw window */ - gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,230); - gxDrawTexture(top,xwindow,ywindow-yoffset,top->width,top->height,255); - - /* draw title */ - FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20-yoffset,(GXColor)WHITE); - - /* draw text */ - for (i=0; iwidth,ypos+i*fontsize-yoffset,(GXColor)WHITE); - - /* update display */ - gxSetScreen(); - - /* slide speed */ - yoffset -= 60; - } - - /* draw menu + text window */ - while (quit == 0) - { - /* draw parent menu */ - GUI_DrawMenu(parent); - - /* draw window */ - gxDrawTexture(window,xwindow,ywindow,window->width,window->height,230); - gxDrawTexture(top,xwindow,ywindow,top->width,top->height,255); - - /* draw title */ - FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20,(GXColor)WHITE); - - /* draw text */ - for (i=0; iwidth,ypos+i*fontsize,(GXColor)WHITE); - } - -#ifdef HW_RVL - if (Shutdown) - { - gxTextureClose(&window); - gxTextureClose(&top); - gxTextureClose(&w_pointer); - GUI_DeleteMenu(parent); - GUI_FadeOut(); - shutdown(); - SYS_ResetSystem(SYS_POWEROFF, 0, 0); - } - else if (m_input.ir.valid) - { - /* get cursor position */ - x = m_input.ir.x; - y = m_input.ir.y; - - /* draw wiimote pointer */ - gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255); - } -#endif - - /* update screen */ - gxSetScreen(); - - /* wait for exit buttons */ - if (m_input.keys) - quit = 1; - } - - /* reset initial vertical offset */ - - /* slide out */ - yoffset = 0; - while (yoffset < (ywindow + window->height)) - { - /* draw parent menu */ - GUI_DrawMenu(parent); - - /* draw window */ - gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,230); - gxDrawTexture(top,xwindow,ywindow-yoffset,top->width,top->height,255); - - /* draw title */ - FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20-yoffset,(GXColor)WHITE); - - /* draw text */ - for (i=0; iwidth,ypos+i*fontsize-yoffset,(GXColor)WHITE); - - /* update display */ - gxSetScreen(); - - /* slide speed */ - yoffset += 60; - } - - /* restore helper comment */ - if (parent->helpers[1]) - parent->helpers[1]->data = data; - - /* final position */ - GUI_DrawMenu(parent); - gxSetScreen(); - - /* close textures */ - gxTextureClose(&window); - gxTextureClose(&top); -} - -/* Option Window (returns selected item) */ -int GUI_OptionWindow(gui_menu *parent, char *title, char *items[], u8 nb_items) -{ - int i, ret, quit = 0; - int old, selected = 0; - s16 p; - butn_data button; - -#ifdef HW_RVL - int x,y; -#endif - - /* initialize buttons data */ - button.texture[0] = gxTextureOpenPNG(Button_text_png,0); - button.texture[1] = gxTextureOpenPNG(Button_text_over_png,0); - - /* initialize texture window */ - gx_texture *window = gxTextureOpenPNG(Frame_s1_png,0); - gx_texture *top = gxTextureOpenPNG(Frame_s1_title_png,0); - - /* get initial positions */ - int w = button.texture[0]->width; - int h = button.texture[0]->height; - int xwindow = (640 - window->width)/2; - int ywindow = (480 - window->height)/2; - int xpos = xwindow + (window->width - w)/2; - int ypos = (window->height - top->height - (h*nb_items) - (nb_items-1)*20)/2; - ypos = ypos + ywindow + top->height; - - /* disable helper comment */ - const u8 *data = NULL; - if (parent->helpers[1]) - { - data = parent->helpers[1]->data; - parent->helpers[1]->data = 0; - } - - /* slide in */ - int yoffset = ywindow + window->height; - while (yoffset > 0) - { - /* draw parent menu */ - GUI_DrawMenu(parent); - - /* draw window */ - gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,230); - gxDrawTexture(top,xwindow,ywindow-yoffset,top->width,top->height,255); - - /* draw title */ - FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20-yoffset,(GXColor)WHITE); - - /* draw buttons + text */ - for (i=0; iwidth,window->height,230); - gxDrawTexture(top,xwindow,ywindow,top->width,top->height,255); - - /* draw title */ - FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20,(GXColor)WHITE); - - /* draw buttons + text */ - for (i=0; iwidth/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255); - - /* check for valid buttons */ - selected = -1; - for (i=0; i=xpos)&&(x<=(xpos+w))&&(y>=ypos+i*(20 + h))&&(y<=(ypos+i*(20+h)+h))) - { - selected = i; - break; - } - } - } - else - { - /* reinitialize selection */ - if (selected == -1) - selected = 0; - } -#endif - - /* update screen */ - gxSetScreen(); - - /* update selection */ - if (p & PAD_BUTTON_UP) - { - if (selected > 0) - selected --; - } - else if (p & PAD_BUTTON_DOWN) - { - if (selected < (nb_items -1)) - selected ++; - } - - /* sound fx */ - if (selected != old) - { - if (selected >= 0) - { - ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size, - ((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL); - } - } - - if (p & PAD_BUTTON_A) - { - if (selected >= 0) - { - quit = 1; - ret = selected; - } - } - else if (p & PAD_BUTTON_B) - { - quit = 1; - ret = -1; - } - } - - /* slide out */ - yoffset = 0; - while (yoffset < (ywindow + window->height)) - { - /* draw parent menu */ - GUI_DrawMenu(parent); - - /* draw window + header */ - gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,230); - gxDrawTexture(top,xwindow,ywindow-yoffset,top->width,top->height,255); - - /* draw title */ - FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20-yoffset,(GXColor)WHITE); - - /* draw buttons + text */ - for (i=0; ihelpers[1]) - parent->helpers[1]->data = data; - - /* final position */ - GUI_DrawMenu(parent); - gxSetScreen(); - - /* close textures */ - gxTextureClose(&window); - gxTextureClose(&top); - gxTextureClose(&button.texture[0]); - gxTextureClose(&button.texture[1]); - - return ret; -} - -/* Option Box */ -void GUI_OptionBox(gui_menu *parent, optioncallback cb, char *title, void *option, float step, float min, float max, u8 type) -{ - gx_texture *arrow[2]; - arrow[0] = gxTextureOpenPNG(Button_arrow_png,0); - arrow[1] = gxTextureOpenPNG(Button_arrow_over_png,0); - gx_texture *window = gxTextureOpenPNG(Frame_s2_png,0); - gx_texture *top = gxTextureOpenPNG(Frame_s2_title_png,0); - - /* window position */ - int xwindow = 166; - int ywindow = 160; - - /* arrows position */ - int xleft = 206; - int xright = 392; - int yleft = 238; - int yright = 238; - - /* disable action button helper */ - if (parent->helpers[1]) - parent->helpers[1]->data = 0; - - /* slide in */ - char msg[16]; - int yoffset = ywindow + window->height; - while (yoffset > 0) - { - /* draw parent menu */ - GUI_DrawMenu(parent); - - /* draw window */ - gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,225); - gxDrawTexture(top,xwindow,ywindow-yoffset,top->width,top->height,255); - - /* display title */ - FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20-yoffset,(GXColor)WHITE); - - /* update display */ - gxSetScreen(); - - /* slide speed */ - yoffset -= 60; - } - - /* display option box */ - int quit = 0; - int modified = 0; - int selected = -1; - s16 p; -#ifdef HW_RVL - int x,y; -#endif - - while (!quit) - { - /* draw parent menu */ - GUI_DrawMenu(parent); - - /* draw window */ - gxDrawTexture(window,xwindow,ywindow,window->width,window->height,225); - gxDrawTexture(top,xwindow,ywindow,top->width,top->height,255); - - /* display title */ - FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20,(GXColor)WHITE); - - /* option type */ - if (type) - { - /* integer type */ - if (*(s16 *)option < 0) - sprintf(msg,"-%d",abs(*(s16 *)option)); - else - sprintf(msg,"%d",abs(*(s16 *)option)); - } - else - { - /* float type */ - if (*(float *)option < 0.0) - sprintf(msg,"-%1.2f",fabs(*(float *)option)); - else - sprintf(msg,"%1.2f",fabs(*(float *)option)); - } - - /* draw option text */ - FONT_writeCenter(msg,24,xwindow,xwindow+window->width,272,(GXColor)WHITE); - - /* update inputs */ - p = m_input.keys; - - /* draw buttons */ - if (selected < 0) - { - /* nothing selected */ - gxDrawTexture(arrow[0],xleft,yleft,arrow[0]->width,arrow[0]->height,255); - gxDrawTextureRotate(arrow[0],xright,yright,arrow[0]->width,arrow[0]->height,180.0,255); - } - -#ifdef HW_RVL - else if (selected) - { - /* right button selected */ - gxDrawTexture(arrow[0],xleft,yleft,arrow[0]->width,arrow[0]->height,255); - gxDrawTextureRotate(arrow[1],xright-4,yright-4,arrow[1]->width+8,arrow[1]->height+8,180.0,255); - } - else - { - /* left button selected */ - gxDrawTexture(arrow[1],xleft-4,yleft-4,arrow[1]->width+8,arrow[1]->height+8,255); - gxDrawTextureRotate(arrow[0],xright,yright,arrow[0]->width,arrow[0]->height,180.0,255); - } - - selected = -1; - if (Shutdown) - { - gxTextureClose(&arrow[0]); - gxTextureClose(&arrow[1]); - gxTextureClose(&window); - gxTextureClose(&top); - gxTextureClose(&w_pointer); - GUI_DeleteMenu(parent); - GUI_FadeOut(); - shutdown(); - SYS_ResetSystem(SYS_POWEROFF, 0, 0); - } - else if (m_input.ir.valid) - { - /* get cursor position */ - x = m_input.ir.x; - y = m_input.ir.y; - - /* draw wiimote pointer */ - gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255); - - /* check for valid buttons */ - if ((x>=xleft)&&(x<=(xleft+arrow[0]->width))&&(y>=yleft)&&(y<=(yleft+arrow[0]->height))) - { - selected = 0; - if (p & PAD_BUTTON_A) - p |= PAD_BUTTON_LEFT; - } - else if ((x>=xright)&&(x<=(xright+arrow[0]->width))&&(y>=yright)&&(y<=(yright+arrow[0]->height))) - { - selected = 1; - if (p & PAD_BUTTON_A) - p |= PAD_BUTTON_RIGHT; - } - } -#endif - - /* update screen */ - gxSetScreen(); - - /* check input */ - if (p&PAD_BUTTON_LEFT) - { - /* decrement option value */ - if (type) - { - /* integer type */ - *(s16 *)option -= (s16)step; - if (*(s16 *)option < (s16)min) - *(s16 *)option = (s16)max; - } - else - { - /* float type */ - *(float *)option -= step; - if (*(float *)option < min) - *(float *)option = max; - } - - modified = 1; - } - else if (p&PAD_BUTTON_RIGHT) - { - /* increment option value */ - if (type) - { - /* integer type */ - *(s16 *)option += (s16)step; - if (*(s16 *)option > (s16)max) - *(s16 *)option = (s16)min; - } - else - { - /* float type */ - *(float *)option += step; - if (*(float *)option > max) - *(float *)option = min; - } - - modified = 1; - } - else if (p & PAD_BUTTON_B) - { - quit = 1; - } - - if (modified) - { - modified = 0; - - /* play sound effect */ - ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size, - ((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL); - - /* option callback */ - if (cb) - cb(); - } - } - - /* slide out */ - yoffset = 0; ; - while (yoffset < (ywindow + window->height)) - { - /* draw parent menu */ - GUI_DrawMenu(parent); - - /* draw window */ - gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,225); - gxDrawTexture(top,xwindow,ywindow-yoffset,top->width,top->height,255); - - /* display title */ - FONT_writeCenter(title,20,xwindow,xwindow+window->width,ywindow+(top->height-20)/2+20-yoffset,(GXColor)WHITE); - - /* update display */ - gxSetScreen(); - - /* slide speed */ - yoffset += 60; - } - - /* restore action button helper */ - if (parent->helpers[1]) - parent->helpers[1]->data = Key_A_png; - - /* final position */ - GUI_DrawMenu(parent); - gxSetScreen(); - - /* close textures */ - gxTextureClose(&arrow[0]); - gxTextureClose(&arrow[1]); - gxTextureClose(&window); - gxTextureClose(&top); -} - -/* Option Box with two parameters */ -void GUI_OptionBox2(gui_menu *parent, char *text_1, char *text_2, s16 *option_1, s16 *option_2, s16 step, s16 min, s16 max) -{ - gx_texture *arrow[2]; - arrow[0] = gxTextureOpenPNG(Button_arrow_png,0); - arrow[1] = gxTextureOpenPNG(Button_arrow_over_png,0); - gx_texture *window = gxTextureOpenPNG(Frame_s2_png,0); - - /* window position */ - int xwindow = 166; - int ywindow = 160; - - /* arrows position */ - int arrow_pos[4][2] = - { - {144,218}, - {452,218}, - {298,138}, - {298,298} - }; - - /* disable action button helper */ - if (parent->helpers[1]) - parent->helpers[1]->data = 0; - - /* slide in */ - char msg[16]; - int yoffset = ywindow + window->height; - while (yoffset > 0) - { - /* draw parent menu */ - GUI_DrawMenu(parent); - - /* draw window */ - gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,225); - - /* update display */ - gxSetScreen(); - - /* slide speed */ - yoffset -= 60; - } - - /* display option box */ - int quit = 0; - int modified = 0; - s16 p; -#ifdef HW_RVL - int selected = -1; - int i,x,y; -#endif - - while (!quit) - { - /* draw parent menu */ - GUI_DrawMenu(parent); - - /* draw window */ - gxDrawTexture(window,xwindow,ywindow,window->width,window->height,225); - - /* draw options text */ - if (*option_1 < 0) - sprintf(msg,"%s: -%02d",text_1,abs(*option_1)); - else - sprintf(msg,"%s: +%02d",text_1,abs(*option_1)); - FONT_writeCenter(msg,24,xwindow,xwindow+window->width,240,(GXColor)WHITE); - if (*option_2 < 0) - sprintf(msg,"%s: -%02d",text_2,abs(*option_2)); - else - sprintf(msg,"%s: +%02d",text_2,abs(*option_2)); - FONT_writeCenter(msg,24,xwindow,xwindow+window->width,264,(GXColor)WHITE); - - /* update inputs */ - p = m_input.keys; - - /* draw buttons */ -#ifdef HW_RVL - switch (selected) - { - case 0: /* left button */ - gxDrawTexture(arrow[1],arrow_pos[0][0]-4,arrow_pos[0][1]-4,arrow[0]->width+8,arrow[0]->height+8,255); - gxDrawTextureRotate(arrow[0],arrow_pos[1][0],arrow_pos[1][1],arrow[0]->width,arrow[0]->height,180.0,255); - gxDrawTextureRotate(arrow[0],arrow_pos[2][0],arrow_pos[2][1],arrow[0]->width,arrow[0]->height,90.0,255); - gxDrawTextureRotate(arrow[0],arrow_pos[3][0],arrow_pos[3][1],arrow[0]->width,arrow[0]->height,270.0,255); - if (p & PAD_BUTTON_A) p |= PAD_BUTTON_LEFT; - break; - - case 1: /* right button */ - gxDrawTexture(arrow[0],arrow_pos[0][0],arrow_pos[0][1],arrow[0]->width,arrow[0]->height,255); - gxDrawTextureRotate(arrow[1],arrow_pos[1][0]-4,arrow_pos[1][1]-4,arrow[0]->width+8,arrow[0]->height+8,180.0,255); - gxDrawTextureRotate(arrow[0],arrow_pos[2][0],arrow_pos[2][1],arrow[0]->width,arrow[0]->height,90.0,255); - gxDrawTextureRotate(arrow[0],arrow_pos[3][0],arrow_pos[3][1],arrow[0]->width,arrow[0]->height,270.0,255); - if (p & PAD_BUTTON_A) p |= PAD_BUTTON_RIGHT; - break; - - case 2: /* up button */ - gxDrawTexture(arrow[0],arrow_pos[0][0],arrow_pos[0][1],arrow[0]->width,arrow[0]->height,255); - gxDrawTextureRotate(arrow[0],arrow_pos[1][0],arrow_pos[1][1],arrow[0]->width,arrow[0]->height,180.0,255); - gxDrawTextureRotate(arrow[1],arrow_pos[2][0]-4,arrow_pos[2][1]-4,arrow[0]->width+8,arrow[0]->height+8,90.0,255); - gxDrawTextureRotate(arrow[0],arrow_pos[3][0],arrow_pos[3][1],arrow[0]->width,arrow[0]->height,270.0,255); - if (p & PAD_BUTTON_A) p |= PAD_BUTTON_UP; - break; - - case 3: /* down button */ - gxDrawTexture(arrow[0],arrow_pos[0][0],arrow_pos[0][1],arrow[0]->width,arrow[0]->height,255); - gxDrawTextureRotate(arrow[0],arrow_pos[1][0],arrow_pos[1][1],arrow[0]->width,arrow[0]->height,180.0,255); - gxDrawTextureRotate(arrow[0],arrow_pos[2][0],arrow_pos[2][1],arrow[0]->width,arrow[0]->height,90.0,255); - gxDrawTextureRotate(arrow[1],arrow_pos[3][0]-4,arrow_pos[3][1]-4,arrow[0]->width+8,arrow[0]->height+8,270.0,255); - if (p & PAD_BUTTON_A) p |= PAD_BUTTON_DOWN; - break; - - default: /* nothing selected */ - gxDrawTexture(arrow[0],arrow_pos[0][0],arrow_pos[0][1],arrow[0]->width,arrow[0]->height,255); - gxDrawTextureRotate(arrow[0],arrow_pos[1][0],arrow_pos[1][1],arrow[0]->width,arrow[0]->height,180.0,255); - gxDrawTextureRotate(arrow[0],arrow_pos[2][0],arrow_pos[2][1],arrow[0]->width,arrow[0]->height,90.0,255); - gxDrawTextureRotate(arrow[0],arrow_pos[3][0],arrow_pos[3][1],arrow[0]->width,arrow[0]->height,270.0,255); - break; - } - - if (Shutdown) - { - gxTextureClose(&arrow[0]); - gxTextureClose(&arrow[1]); - gxTextureClose(&window); - gxTextureClose(&w_pointer); - GUI_DeleteMenu(parent); - GUI_FadeOut(); - shutdown(); - SYS_ResetSystem(SYS_POWEROFF, 0, 0); - } - - /* update selection */ - selected = -1; - if (m_input.ir.valid) - { - /* get cursor position */ - x = m_input.ir.x; - y = m_input.ir.y; - - /* draw wiimote pointer */ - gxDrawTextureRotate(w_pointer, x-w_pointer->width/2, y-w_pointer->height/2, w_pointer->width, w_pointer->height,m_input.ir.angle,255); - - /* check for valid buttons */ - for (i=0; i<4; i++) - { - if ((x>=arrow_pos[i][0])&&(x<=(arrow_pos[i][0]+arrow[0]->width))&&(y>=arrow_pos[i][1])&&(y<=(arrow_pos[i][1]+arrow[0]->height))) - selected = i; - } - } -#else - gxDrawTexture(arrow[0],arrow_pos[0][0],arrow_pos[0][1],arrow[0]->width,arrow[0]->height,255); - gxDrawTextureRotate(arrow[0],arrow_pos[1][0],arrow_pos[1][1],arrow[0]->width,arrow[0]->height,180.0,255); - gxDrawTextureRotate(arrow[0],arrow_pos[2][0],arrow_pos[2][1],arrow[0]->width,arrow[0]->height,90.0,255); - gxDrawTextureRotate(arrow[0],arrow_pos[3][0],arrow_pos[3][1],arrow[0]->width,arrow[0]->height,270.0,255); -#endif - - /* update screen */ - gxSetScreen(); - - if (p&PAD_BUTTON_LEFT) - { - /* decrement option 1 value */ - *option_1 -= step; - if (*option_1 < min) - *option_1 = max; - modified = 1; - } - else if (p&PAD_BUTTON_RIGHT) - { - /* decrement option 1 value */ - *option_1 += step; - if (*option_1 > max) - *option_1 = min; - modified = 1; - } - else if (p&PAD_BUTTON_UP) - { - /* decrement option 2 value */ - *option_2 -= step; - if (*option_2 < min) - *option_2 = max; - modified = 1; - } - else if (p&PAD_BUTTON_DOWN) - { - /* increment option 2 value */ - *option_2 += step; - if (*option_2 > max) - *option_2 = min; - modified = 1; - } - else if (p & PAD_BUTTON_B) - { - quit = 1; - } - - if (modified) - { - modified = 0; - /* play sound effect */ - ASND_SetVoice(ASND_GetFirstUnusedVoice(),VOICE_MONO_16BIT,22050,0,(u8 *)button_over_pcm,button_over_pcm_size, - ((int)config.sfx_volume * 255) / 100,((int)config.sfx_volume * 255) / 100,NULL); - } - } - - /* slide out */ - yoffset = 0; ; - while (yoffset < (ywindow + window->height)) - { - /* draw parent menu */ - GUI_DrawMenu(parent); - - /* draw window */ - gxDrawTexture(window,xwindow,ywindow-yoffset,window->width,window->height,225); - - /* update display */ - gxSetScreen(); - - /* slide speed */ - yoffset += 60; - } - - /* restore action button helper */ - if (parent->helpers[1]) - parent->helpers[1]->data = Key_A_png; - - /* final position */ - GUI_DrawMenu(parent); - gxSetScreen(); - - /* close textures */ - gxTextureClose(&arrow[0]); - gxTextureClose(&arrow[1]); - gxTextureClose(&window); -} - -/* Interactive Message Box */ -/* Message Box displays a message until a specific action is completed */ - -/* Message Box LWP Thread */ -static void *MsgBox_Thread(gui_message *message_box) -{ - while (message_box->refresh) - { - /* draw parent menu */ - if (message_box->parent) - { - GUI_DrawMenu(message_box->parent); - } - else - { - gxClearScreen(bg_color); - } - - /* draw window */ - gxDrawTexture(message_box->window,166,160,message_box->window->width,message_box->window->height,230); - gxDrawTexture(message_box->top,166,160,message_box->top->width,message_box->top->height,255); - - /* draw title */ - if (message_box->title) - FONT_writeCenter(message_box->title,20,166,166+message_box->window->width,160+(message_box->top->height-20)/2+20,(GXColor)WHITE); - - /* draw box message */ - if (message_box->msg) - FONT_writeCenter(message_box->msg,18,166,166+message_box->window->width,248,(GXColor)WHITE); - - /* draw throbber */ - if (message_box->throbber) - gxDrawTextureRotate(message_box->throbber,166+(message_box->window->width-message_box->throbber->width)/2,160+message_box->window->height-message_box->throbber->height-20,message_box->throbber->width,message_box->throbber->height,(message_box->progress * 360.0) / 100.0, 255); - - /* draw exit message */ - if (message_box->buttonA) - { - FONT_writeCenter("Press to continue.",18,166,166+message_box->window->width,248+22,(GXColor)WHITE); - gxDrawTexture(message_box->buttonA, 166+116, 248+4+(18-message_box->buttonA->height)/2,message_box->buttonA->width, message_box->buttonA->height,255); - } - - /* update display */ - gxSetScreen(); - - /* update progression */ - message_box->progress++; - if (message_box->progress > 100) - message_box->progress = 0; - usleep(10); - } - - return 0; -} - -/* update current Message Box */ -void GUI_MsgBoxUpdate(char *title, char *msg) -{ - if (title) - strncpy(message_box.title,title,64); - if (msg) - strncpy(message_box.msg,msg,64); -} - -/* setup current Message Box */ -void GUI_MsgBoxOpen(char *title, char *msg, bool throbber) -{ - if (SILENT) - return; - - /* update text */ - GUI_MsgBoxUpdate(title,msg); - - /* ensure we are not already running */ - if (!message_box.refresh) - { - /* initialize default textures */ - message_box.window = gxTextureOpenPNG(Frame_s2_png,0); - message_box.top = gxTextureOpenPNG(Frame_s2_title_png,0); - if (throbber) - message_box.throbber = gxTextureOpenPNG(Frame_throbber_png,0); - - /* window position */ - int xwindow = 166; - int ywindow = 160; - int ypos = 248; - - /* disable helper comments */ - if (message_box.parent) - { - if (message_box.parent->helpers[0]) - message_box.parent->helpers[0]->data = 0; - if (message_box.parent->helpers[1]) - message_box.parent->helpers[1]->data = 0; - } - - /* slide in */ - int yoffset = ywindow + message_box.window->height; - while (yoffset > 0) - { - /* draw parent menu */ - if (message_box.parent) - { - GUI_DrawMenu(message_box.parent); - } - else - { - gxClearScreen(bg_color); - } - - /* draw window */ - gxDrawTexture(message_box.window,xwindow,ywindow-yoffset,message_box.window->width,message_box.window->height,230); - gxDrawTexture(message_box.top,xwindow,ywindow-yoffset,message_box.top->width,message_box.top->height,255); - - /* draw title */ - if (title) - FONT_writeCenter(title,20,xwindow,xwindow+message_box.window->width,ywindow+(message_box.top->height-20)/2+20-yoffset,(GXColor)WHITE); - - /* draw box message */ - if (msg) - FONT_writeCenter(msg,18,xwindow,xwindow+message_box.window->width,ypos-yoffset,(GXColor)WHITE); - - /* update display */ - gxSetScreen(); - - /* slide speed */ - yoffset -= 60; - } - - /* create LWP thread for MessageBox refresh */ - message_box.refresh = TRUE; - LWP_CreateThread (&msgboxthread, (void *)MsgBox_Thread, &message_box, NULL, 0, 70); - } -} - -/* Close current messagebox */ -void GUI_MsgBoxClose(void) -{ - if (message_box.refresh) - { - /* suspend MessageBox refresh */ - message_box.refresh = FALSE; - LWP_JoinThread(msgboxthread, NULL); - - /* window position */ - int xwindow = 166; - int ywindow = 160; - int ypos = 248; - - /* slide out */ - int yoffset = 0; - while (yoffset < (ywindow + message_box.window->height)) - { - /* draw parent menu */ - if (message_box.parent) - { - GUI_DrawMenu(message_box.parent); - } - else - { - gxClearScreen(bg_color); - } - - /* draw window */ - gxDrawTexture(message_box.window,xwindow,ywindow-yoffset,message_box.window->width,message_box.window->height,230); - gxDrawTexture(message_box.top,xwindow,ywindow-yoffset,message_box.top->width,message_box.top->height,255); - - /* draw title */ - if (message_box.title) - FONT_writeCenter(message_box.title,20,xwindow,xwindow+message_box.window->width,ywindow+(message_box.top->height-20)/2+20-yoffset,(GXColor)WHITE); - - /* draw text */ - if (message_box.msg) - FONT_writeCenter(message_box.msg,18,xwindow,xwindow+message_box.window->width,ypos-yoffset,(GXColor)WHITE); - - /* update display */ - gxSetScreen(); - - /* slide speed */ - yoffset += 60; - } - - if (message_box.parent) - { - /* restore helper comment */ - if (message_box.parent->helpers[0]) - message_box.parent->helpers[0]->data = Key_B_png; - if (message_box.parent->helpers[1]) - message_box.parent->helpers[1]->data = Key_A_png; - - /* final position */ - GUI_DrawMenu(message_box.parent); - } - else - { - gxClearScreen(bg_color); - } - - gxSetScreen(); - - /* clear all textures */ - gxTextureClose(&message_box.window); - gxTextureClose(&message_box.top); - gxTextureClose(&message_box.buttonA); - gxTextureClose(&message_box.throbber); - } -} - -void GUI_WaitPrompt(char *title, char *msg) -{ - if (SILENT) - return; - - /* clear unused texture */ - gxTextureClose(&message_box.throbber); - - /* open or update message box */ - GUI_MsgBoxOpen(title, msg, 0); - - /* allocate texture */ - message_box.buttonA = gxTextureOpenPNG(Key_A_png,0); - - /* wait for button A */ - while (m_input.keys & PAD_BUTTON_A) - VIDEO_WaitVSync(); - while (!(m_input.keys & PAD_BUTTON_A)) - VIDEO_WaitVSync(); - - /* always close message box */ - GUI_MsgBoxClose(); -} - -/* Basic Fading */ -void GUI_FadeOut() -{ - int alpha = 0; - while (alpha < 256) - { - gxDrawRectangle(0, 0, 640, 480, alpha, (GXColor)BLACK); - gxSetScreen(); - alpha +=3; - } -} diff --git a/genplus-gx/gx/gui/gui.h b/genplus-gx/gx/gui/gui.h deleted file mode 100644 index 3f53a471be..0000000000 --- a/genplus-gx/gx/gui/gui.h +++ /dev/null @@ -1,245 +0,0 @@ -/**************************************************************************** - * gui.c - * - * generic GUI Engine (using GX rendering) - * - * Copyright Eke-Eke (2009-2010) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifndef _GUI_H -#define _GUI_H - -#define BG_COLOR_MAX 15 - -/*****************************************************************************/ -/* GUI Buttons state */ -/*****************************************************************************/ -#define BUTTON_VISIBLE 0x01 -#define BUTTON_ACTIVE 0x02 -#define BUTTON_SELECTED 0x04 -#define BUTTON_OVER_SFX 0x08 -#define BUTTON_SELECT_SFX 0x10 -#define BUTTON_FADE 0x20 -#define BUTTON_SLIDE_LEFT 0x40 -#define BUTTON_SLIDE_RIGHT 0x80 -#define BUTTON_SLIDE_TOP 0x100 -#define BUTTON_SLIDE_BOTTOM 0x200 - -/*****************************************************************************/ -/* GUI Image state */ -/*****************************************************************************/ -#define IMAGE_VISIBLE 0x01 -#define IMAGE_REPEAT 0x02 -#define IMAGE_FADE 0x04 -#define IMAGE_SLIDE_LEFT 0x08 -#define IMAGE_SLIDE_RIGHT 0x10 -#define IMAGE_SLIDE_TOP 0x20 -#define IMAGE_SLIDE_BOTTOM 0x40 - -/*****************************************************************************/ -/* Generic GUI structures */ -/*****************************************************************************/ - -/* Item descriptor*/ -typedef struct -{ - gx_texture *texture; /* temporary texture data */ - const u8 *data; /* pointer to png image data (items icon only) */ - char text[64]; /* item string (items list only) */ - char comment[64]; /* item comment */ - u16 x; /* item image or text X position (upper left corner) */ - u16 y; /* item image or text Y position (upper left corner) */ - u16 w; /* item image or text width */ - u16 h; /* item image or text height */ -} gui_item; - -/* Button Data descriptor */ -typedef struct -{ - gx_texture *texture[2]; /* temporary texture datas */ - const u8 *image[2]; /* pointer to png image datas (default) */ -} butn_data; - -/* Button descriptor */ -typedef struct -{ - butn_data *data; /* pointer to button image/texture data */ - u16 state; /* button state (ACTIVE,VISIBLE,SELECTED...) */ - u8 shift[4]; /* direction offsets */ - u16 x; /* button image X position (upper left corner) */ - u16 y; /* button image Y position (upper left corner) */ - u16 w; /* button image pixels width */ - u16 h; /* button image pixels height */ -} gui_butn; - -/* Image descriptor */ -typedef struct -{ - gx_texture *texture; /* temporary texture data */ - const u8 *data; /* pointer to png image data */ - u8 state; /* image state (VISIBLE) */ - u16 x; /* image X position (upper left corner) */ - u16 y; /* image Y position (upper left corner) */ - u16 w; /* image width */ - u16 h; /* image height */ - u8 alpha; /* alpha transparency */ -} gui_image; - -/* Menu descriptor */ -typedef struct -{ - char title[64]; /* menu title */ - s8 selected; /* index of selected item */ - s8 offset; /* items list offset */ - u8 max_items; /* total number of items */ - u8 max_buttons; /* total number of buttons */ - u8 max_images; /* total number of background images */ - u8 screenshot; /* game screen background */ - gui_item *items; /* menu items */ - gui_butn *buttons; /* menu buttons */ - gui_image *bg_images; /* background images */ - gui_item *helpers[2]; /* left & right key comments */ - gui_butn *arrows[2]; /* arrows buttons */ - void (*cb)(void); /* specific draw callback */ -} gui_menu; - -typedef struct -{ - u32 progress; /* progress counter */ - bool refresh; /* messagebox current state */ - gui_menu *parent; /* parent menu */ - char title[64]; /* box title */ - char msg[64]; /* box message */ - gx_texture *window; /* pointer to box texture */ - gx_texture *top; /* pointer to box title texture */ - gx_texture *buttonA; /* pointer to button A texture */ - gx_texture *throbber; /* pointer to throbber texture */ -} gui_message; - -/* Menu inputs */ -struct t_input_menu -{ - u16 keys; -#ifdef HW_RVL - struct ir_t ir; -#endif -} m_input; - -/* Optionbox callback */ -typedef void (*optioncallback)(void); - -/* Generic textures*/ -#ifdef HW_RVL -extern gx_texture *w_pointer; -#endif - -/* Generic backgrounds */ -extern const u8 Bg_layer_png[]; -extern const u8 Bg_overlay_png[]; -extern const u8 Banner_main_png[]; -extern const u8 Banner_bottom_png[]; -extern const u8 Banner_top_png[]; -extern const u8 Main_logo_png[]; - -/* Generic frames */ -extern const u8 Frame_s1_png[]; -extern const u8 Frame_s2_png[]; -extern const u8 Frame_s3_png[]; -extern const u8 Frame_s1_title_png[]; -extern const u8 Frame_s2_title_png[]; -extern const u8 Frame_throbber_png[]; - -/* Generic Buttons */ -extern const u8 Button_text_png[]; -extern const u8 Button_text_over_png[]; -extern const u8 Button_icon_png[]; -extern const u8 Button_icon_over_png[]; -extern const u8 Button_icon_sm_png[]; -extern const u8 Button_icon_sm_over_png[]; -extern const u8 Button_up_png[]; -extern const u8 Button_up_over_png[]; -extern const u8 Button_down_png[]; -extern const u8 Button_down_over_png[]; -extern const u8 Button_arrow_png[]; -extern const u8 Button_arrow_over_png[]; -extern const u8 Button_digit_png[]; -extern const u8 Button_digit_over_png[]; - -/* Generic images*/ -#ifdef HW_RVL -#define Key_A_png Key_A_wii_png -#define Key_B_png Key_B_wii_png -extern const u8 generic_point_png[]; -extern const u8 Key_A_wii_png[]; -extern const u8 Key_B_wii_png[]; -#else -#define Key_A_png Key_A_gcn_png -#define Key_B_png Key_B_gcn_png -extern const u8 Key_A_gcn_png[]; -extern const u8 Key_B_gcn_png[]; -#endif -extern const u8 Star_full_png[]; -extern const u8 Star_empty_png[]; -extern const u8 Overlay_bar_png[]; - -/* Generic Sounds */ -extern const u8 button_over_pcm[]; -extern const u8 button_select_pcm[]; -extern const u8 intro_pcm[]; -extern const u32 button_select_pcm_size; -extern const u32 button_over_pcm_size; -extern const u32 intro_pcm_size; - -extern u8 SILENT; - -extern void GUI_InitMenu(gui_menu *menu); -extern void GUI_DeleteMenu(gui_menu *menu); -extern void GUI_DrawMenu(gui_menu *menu); -extern void GUI_DrawMenuFX(gui_menu *menu, u8 speed, u8 out); -extern void GUI_SlideMenuTitle(gui_menu *m, int title_offset); -extern int GUI_UpdateMenu(gui_menu *menu); -extern int GUI_RunMenu(gui_menu *menu); -extern void GUI_TextWindow(gui_menu *parent, char *title, char items[][64], u8 nb_items, u8 fontsize); -extern int GUI_OptionWindow(gui_menu *parent, char *title, char *items[], u8 nb_items); -extern void GUI_OptionBox(gui_menu *parent, optioncallback cb, char *title, void *option, float step, float min, float max, u8 type); -extern void GUI_OptionBox2(gui_menu *parent, char *text_1, char *text_2, s16 *option_1, s16 *option_2, s16 step, s16 min, s16 max); -extern void GUI_MsgBoxOpen(char *title, char *msg, bool throbber); -extern void GUI_MsgBoxUpdate(char *title, char *msg); -extern void GUI_MsgBoxClose(void); -extern void GUI_WaitPrompt(char *title, char *msg); -extern void GUI_FadeOut(); -extern GXColor *GUI_GetBgColor(void); -extern void GUI_SetBgColor(u8 color); - -#endif diff --git a/genplus-gx/gx/gui/legal.c b/genplus-gx/gx/gui/legal.c deleted file mode 100644 index c3d49da8c6..0000000000 --- a/genplus-gx/gx/gui/legal.c +++ /dev/null @@ -1,172 +0,0 @@ -/**************************************************************************** - * legal.c - * - * Genesis Plus GX Disclaimer - * - * Copyright Eke-Eke (2009-2012) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#include "shared.h" -#include "font.h" -#include "gui.h" - -extern const u8 Bg_intro_c1_png[]; -extern const u8 Bg_intro_c2_png[]; -extern const u8 Bg_intro_c3_png[]; -extern const u8 Bg_intro_c4_png[]; - -/* - * This is the legal stuff - which must be shown at program startup - * Any derivative work MUST include the same textual output. - * - */ - -static void show_disclaimer(int ypos) -{ - FONT_writeCenter ("DISCLAIMER",22,0,640,ypos,(GXColor)WHITE); - ypos += 32; - FONT_writeCenter ("This is a free software, and you are welcome",20,0,640,ypos,(GXColor)WHITE); - ypos += 20; - FONT_writeCenter ("to redistribute it under the conditions of the",20,0,640,ypos,(GXColor)WHITE); - ypos += 20; - FONT_writeCenter ("license that you should have received with this",20,0,640,ypos,(GXColor)WHITE); - ypos += 20; - FONT_writeCenter ("program. You may not sell, lease, rent or generally",20,0,640,ypos,(GXColor)WHITE); - ypos += 20; - FONT_writeCenter ("use this software in any commercial product or activity.",20,0,640,ypos,(GXColor)WHITE); - ypos += 20; - FONT_writeCenter ("Authors can not be held responsible for any damage or",20,0,640,ypos,(GXColor)WHITE); - ypos += 20; - FONT_writeCenter ("or dysfunction that could occur while using this port.",20,0,640,ypos,(GXColor)WHITE); - ypos += 20; - FONT_writeCenter ("You may not distribute this software with any ROM image",20,0,640,ypos,(GXColor)WHITE); - ypos += 20; - FONT_writeCenter ("unless you have the legal right to distribute them.",20,0,640,ypos,(GXColor)WHITE); - ypos += 20; - FONT_writeCenter ("This software is not endorsed by or affiliated",20,0,640,ypos,(GXColor)WHITE); - ypos += 20; - FONT_writeCenter ("with Sega Enterprises Ltd or Nintendo Co Ltd.",20,0,640,ypos,(GXColor)WHITE); - ypos += 20; - FONT_writeCenter ("All trademarks and registered trademarks are",20,0,640,ypos,(GXColor)WHITE); - ypos += 20; - FONT_writeCenter ("the property of their respective owners.",20,0,640,ypos,(GXColor)WHITE); - ypos += 38; -} - -void legal () -{ - int count = 2000; - int vis = 0; - -#ifdef HW_RVL - gx_texture *button = gxTextureOpenPNG(Key_A_wii_png,0); -#else - gx_texture *button = gxTextureOpenPNG(Key_A_gcn_png,0); -#endif - gx_texture *logo = gxTextureOpenPNG(Bg_intro_c4_png,0); - - gxClearScreen((GXColor)BLACK); - show_disclaimer(56); - gxDrawTexture(logo, (640-logo->width)/2, 480-24-logo->height, logo->width, logo->height,255); - gxSetScreen(); - sleep(1); - - while (!m_input.keys && count) - { - gxClearScreen((GXColor)BLACK); - show_disclaimer(56); - if (count%25 == 0) vis^=1; - if (vis) - { - FONT_writeCenter("Press button to continue.",24,0,640,366,(GXColor)SKY_BLUE); - gxDrawTexture(button, 220, 366-24+(24-button->height)/2, button->width, button->height,255); - } - gxDrawTexture(logo, (640-logo->width)/2, 480-24-logo->height, logo->width, logo->height,255); - gxSetScreen(); - count--; - } - - gxTextureClose(&button); - gxTextureClose(&logo); - - if (count > 0) - { - ASND_Pause(0); - int voice = ASND_GetFirstUnusedVoice(); - ASND_SetVoice(voice,VOICE_MONO_16BIT,44100,0,(u8 *)button_select_pcm,button_select_pcm_size,200,200,NULL); - GUI_FadeOut(); - ASND_Pause(1); - return; - } - - gxClearScreen((GXColor)BLACK); - gx_texture *texture = gxTextureOpenPNG(Bg_intro_c1_png,0); - if (texture) - { - gxDrawTexture(texture, (640-texture->width)/2, (480-texture->height)/2, texture->width, texture->height,255); - if (texture->data) free(texture->data); - free(texture); - } - gxSetScreen(); - - sleep (1); - - gxClearScreen((GXColor)WHITE); - texture = gxTextureOpenPNG(Bg_intro_c2_png,0); - if (texture) - { - gxDrawTexture(texture, (640-texture->width)/2, (480-texture->height)/2, texture->width, texture->height,255); - if (texture->data) free(texture->data); - free(texture); - } - gxSetScreen(); - - sleep (1); - - gxClearScreen((GXColor)BLACK); - texture = gxTextureOpenPNG(Bg_intro_c3_png,0); - if (texture) - { - gxDrawTexture(texture, (640-texture->width)/2, (480-texture->height)/2, texture->width, texture->height,255); - if (texture->data) free(texture->data); - free(texture); - } - gxSetScreen(); - - ASND_Pause(0); - int voice = ASND_GetFirstUnusedVoice(); - ASND_SetVoice(voice,VOICE_MONO_16BIT,44100,0,(u8 *)intro_pcm,intro_pcm_size,200,200,NULL); - sleep (2); - ASND_Pause(1); -} diff --git a/genplus-gx/gx/gui/menu.c b/genplus-gx/gx/gui/menu.c deleted file mode 100644 index 1ca3651e32..0000000000 --- a/genplus-gx/gx/gui/menu.c +++ /dev/null @@ -1,3683 +0,0 @@ -/**************************************************************************** - * menu.c - * - * Genesis Plus GX menu - * - * Copyright Eke-Eke (2009-2013) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#include "shared.h" -#include "font.h" -#include "gui.h" -#include "filesel.h" -#include "cheats.h" -#include "file_load.h" -#include "file_slot.h" - -#ifdef HW_RVL -#include -#endif - -#include -#include - -/* Credits */ -extern const u8 Bg_credits_png[]; - -/* Main menu */ -extern const u8 Main_load_png[]; -extern const u8 Main_options_png[]; -extern const u8 Main_quit_png[]; -extern const u8 Main_file_png[]; -extern const u8 Main_reset_png[]; -extern const u8 Main_cheats_png[]; -extern const u8 Main_showinfo_png[]; -extern const u8 Main_takeshot_png[]; -#ifdef HW_RVL -extern const u8 Main_play_wii_png[]; -#else -extern const u8 Main_play_gcn_png[]; -#endif - -/* Options menu */ -extern const u8 Option_menu_png[]; -extern const u8 Option_ctrl_png[]; -extern const u8 Option_sound_png[]; -extern const u8 Option_video_png[]; -extern const u8 Option_system_png[]; - -/* Load ROM menu */ -extern const u8 Load_recent_png[]; -extern const u8 Load_md_png[]; -extern const u8 Load_ms_png[]; -extern const u8 Load_gg_png[]; -extern const u8 Load_sg_png[]; -extern const u8 Load_cd_png[]; - -/* Save Manager menu */ -extern const u8 Button_load_png[]; -extern const u8 Button_load_over_png[]; -extern const u8 Button_save_png[]; -extern const u8 Button_save_over_png[]; -extern const u8 Button_special_png[]; -extern const u8 Button_special_over_png[]; -extern const u8 Button_delete_png[]; -extern const u8 Button_delete_over_png[]; - -/* Controller Settings */ -extern const u8 Ctrl_4wayplay_png[]; -extern const u8 Ctrl_gamepad_md_png[]; -extern const u8 Ctrl_gamepad_ms_png[]; -extern const u8 Ctrl_justifiers_png[]; -extern const u8 Ctrl_menacer_png[]; -extern const u8 Ctrl_mouse_png[]; -extern const u8 Ctrl_xe_a1p_png[]; -extern const u8 Ctrl_activator_png[]; -extern const u8 Ctrl_lightphaser_png[]; -extern const u8 Ctrl_paddle_png[]; -extern const u8 Ctrl_sportspad_png[]; -extern const u8 Ctrl_none_png[]; -extern const u8 Ctrl_teamplayer_png[]; -extern const u8 Ctrl_pad3b_png[]; -extern const u8 Ctrl_pad6b_png[]; -extern const u8 Ctrl_config_png[]; -extern const u8 ctrl_option_off_png[]; -extern const u8 ctrl_option_on_png[]; -extern const u8 ctrl_gamecube_png[]; -#ifdef HW_RVL -extern const u8 ctrl_classic_png[]; -extern const u8 ctrl_nunchuk_png[]; -extern const u8 ctrl_wiimote_png[]; -#endif - -/* Generic images */ -extern const u8 Button_sm_blue_png[]; -extern const u8 Button_sm_grey_png[]; -extern const u8 Button_sm_yellow_png[]; - -/* Exit callback */ -void (*reload)(void); - - -/*****************************************************************************/ -/* Specific Menu Callbacks */ -/*****************************************************************************/ -static void ctrlmenu_cb(void); -static void savemenu_cb(void); -static void mainmenu_cb(void); - -/*****************************************************************************/ -/* Generic Buttons data */ -/*****************************************************************************/ -static butn_data arrow_up_data = -{ - {NULL,NULL}, - {Button_up_png,Button_up_over_png} -}; - -static butn_data arrow_down_data = -{ - {NULL,NULL}, - {Button_down_png,Button_down_over_png} -}; - -static butn_data button_text_data = -{ - {NULL,NULL}, - {Button_text_png,Button_text_over_png} -}; - -static butn_data button_icon_data = -{ - {NULL,NULL}, - {Button_icon_png,Button_icon_over_png} -}; - -static butn_data button_icon_sm_data = -{ - {NULL,NULL}, - {Button_icon_sm_png,Button_icon_sm_over_png} -}; - -static butn_data button_player_data = -{ - {NULL,NULL}, - {Button_sm_blue_png,Button_sm_yellow_png} -}; - -static butn_data button_player_none_data = -{ - {NULL,NULL}, - {Button_sm_grey_png,NULL} -}; - -static butn_data button_load_data = -{ - {NULL,NULL}, - {Button_load_png,Button_load_over_png} -}; - -static butn_data button_save_data = -{ - {NULL,NULL}, - {Button_save_png,Button_save_over_png} -}; - -static butn_data button_special_data = -{ - {NULL,NULL}, - {Button_special_png,Button_special_over_png} -}; - -static butn_data button_delete_data = -{ - {NULL,NULL}, - {Button_delete_png,Button_delete_over_png} -}; - -/*****************************************************************************/ -/* Generic GUI items */ -/*****************************************************************************/ -static gui_item action_cancel = -{ - NULL,Key_B_png,"","Back",10,422,28,28 -}; - -static gui_item action_select = -{ - NULL,Key_A_png,"","",602,422,28,28 -}; - -/*****************************************************************************/ -/* GUI backgrounds images */ -/*****************************************************************************/ -static gui_image bg_main[4] = -{ - {NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, - {NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, - {NULL,Banner_main_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,0,340,640,140,255}, - {NULL,Main_logo_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,202,362,232,56,255} -}; - -static gui_image bg_misc[5] = -{ - {NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, - {NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, - {NULL,Banner_top_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,0,0,640,108,255}, - {NULL,Banner_bottom_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,0,380,640,100,255}, - {NULL,Main_logo_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,466,40,152,44,255} -}; - -static gui_image bg_ctrls[8] = -{ - {NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, - {NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, - {NULL,Banner_top_png,IMAGE_VISIBLE,0,0,640,108,255}, - {NULL,Banner_bottom_png,IMAGE_VISIBLE,0,380,640,100,255}, - {NULL,Main_logo_png,IMAGE_VISIBLE,466,40,152,44,255}, - {NULL,Frame_s2_png,IMAGE_VISIBLE,38,72,316,168,128}, - {NULL,Frame_s2_png,IMAGE_VISIBLE,38,242,316,168,128}, - {NULL,Frame_s3_png,IMAGE_SLIDE_RIGHT,400,134,292,248,128} -}; - -static gui_image bg_list[6] = -{ - {NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, - {NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, - {NULL,Banner_top_png,IMAGE_VISIBLE,0,0,640,108,255}, - {NULL,Banner_bottom_png,IMAGE_VISIBLE,0,380,640,100,255}, - {NULL,Main_logo_png,IMAGE_VISIBLE,466,40,152,44,255}, - {NULL,Frame_s1_png,IMAGE_VISIBLE,8,70,372,336,76} -}; - -static gui_image bg_saves[8] = -{ - {NULL,NULL,0,0,0,0,0,255}, - {NULL,Bg_layer_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, - {NULL,Bg_overlay_png,IMAGE_VISIBLE|IMAGE_REPEAT,0,0,640,480,255}, - {NULL,Banner_top_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,0,0,640,108,255}, - {NULL,Banner_bottom_png,IMAGE_VISIBLE|IMAGE_SLIDE_BOTTOM,0,380,640,100,255}, - {NULL,Main_logo_png,IMAGE_VISIBLE|IMAGE_SLIDE_TOP,466,40,152,44,255}, - {NULL,Frame_s1_png,IMAGE_VISIBLE,8,70,372,336,76}, - {NULL,Frame_s1_png,IMAGE_SLIDE_RIGHT,468,108,372,296,76} -}; - -/*****************************************************************************/ -/* Menu Items description */ -/*****************************************************************************/ - -/* Main menu */ -static gui_item items_main[10] = -{ - {NULL,Main_load_png ,"","",114,162,80,92}, - {NULL,Main_options_png ,"","",290,166,60,88}, - {NULL,Main_quit_png ,"","",460,170,52,84}, - {NULL,Main_file_png ,"","",114,216,80,92}, - {NULL,Main_reset_png ,"","",294,227,52,80}, - {NULL,Main_cheats_png ,"","",454,218,64,92}, - {NULL,NULL ,"","", 10,334,84,32}, -#ifdef HW_RVL - {NULL,Main_play_wii_png,"","", 10,372,84,32}, -#else - {NULL,Main_play_gcn_png,"","", 10,372,84,32}, -#endif - {NULL,Main_takeshot_png,"","",546,334,84,32}, - {NULL,Main_showinfo_png,"","",546,372,84,32} -}; - -/* Controllers menu */ -static gui_item items_ctrls[13] = -{ - {NULL,NULL,"","", 0, 0, 0, 0}, - {NULL,NULL,"","", 0, 0, 0, 0}, - {NULL,NULL,"","",305, 0, 24, 0}, - {NULL,NULL,"","",305, 0, 24, 0}, - {NULL,NULL,"","",305, 0, 24, 0}, - {NULL,NULL,"","",305, 0, 24, 0}, - {NULL,NULL,"","",305, 0, 24, 0}, - {NULL,NULL,"","",305, 0, 24, 0}, - {NULL,NULL,"","",305, 0, 24, 0}, - {NULL,NULL,"","",305, 0, 24, 0}, - {NULL,NULL,"","", 0, 0, 0, 0}, - {NULL,NULL,"","", 0, 0, 0, 0}, - {NULL,Ctrl_config_png,"Keys\nConfig","Configure Controller Keys",530,306,32,32} -}; - -/* Load menu */ -static gui_item items_load[6] = -{ - {NULL,Load_recent_png,"","Load recently played games", 119,144,72, 92}, - {NULL,Load_md_png, "","Load Mega Drive/Genesis games", 278,141,84, 92}, - {NULL,Load_cd_png, "","Load Sega/Mega CD games", 454,141,64, 92}, - {NULL,Load_ms_png, "","Load Master System games", 114,284,84, 96}, - {NULL,Load_gg_png, "","Load Game Gear games", 278,283,84,100}, - {NULL,Load_sg_png, "","Load SG-1000 games", 454,281,64, 96} -}; - -/* Option menu */ -static gui_item items_options[5] = -{ - {NULL,Option_system_png,"","System settings", 114,142,80,92}, - {NULL,Option_video_png, "","Video settings", 288,150,64,84}, - {NULL,Option_sound_png, "","Audio settings", 464,154,44,80}, - {NULL,Option_ctrl_png, "","Controllers settings", 192,286,88,92}, - {NULL,Option_menu_png, "","Menu settings", 370,286,60,92} -}; - -/* Audio options */ -static gui_item items_audio[13] = -{ - {NULL,NULL,"Master System FM: AUTO", "Enable/disable YM2413 chip", 56,132,276,48}, - {NULL,NULL,"High-Quality FM: ON", "Adjust YM2612/YM2413 resampling quality", 56,132,276,48}, - {NULL,NULL,"FM Resolution: MAX", "Adjust YM2612 DAC precision", 56,132,276,48}, - {NULL,NULL,"FM Volume: 1.00", "Adjust YM2612/YM2413 output level", 56,132,276,48}, - {NULL,NULL,"PSG Volume: 2.50", "Adjust SN76489 output level", 56,132,276,48}, - {NULL,NULL,"PSG Noise Boost: OFF", "Boost SN76489 Noise Channel", 56,132,276,48}, - {NULL,NULL,"Audio Out: STEREO", "Select audio mixing output type", 56,132,276,48}, - {NULL,NULL,"Filtering: 3-BAND EQ", "Setup Audio filtering", 56,132,276,48}, - {NULL,NULL,"Low Gain: 1.00", "Adjust EQ Low Band Gain", 56,132,276,48}, - {NULL,NULL,"Mid Gain: 1.00", "Adjust EQ Mid Band Gain", 56,132,276,48}, - {NULL,NULL,"High Gain: 1.00", "Adjust EQ High Band Gain", 56,132,276,48}, - {NULL,NULL,"Low Freq: 200 Hz", "Adjust EQ Lowest Frequency", 56,132,276,48}, - {NULL,NULL,"High Freq: 20000 Hz", "Adjust EQ Highest Frequency", 56,132,276,48} -}; - -/* System options */ -static gui_item items_system[10] = -{ - {NULL,NULL,"Console Hardware: AUTO", "Select system hardware model", 56,132,276,48}, - {NULL,NULL,"Console Region: AUTO", "Select system region", 56,132,276,48}, - {NULL,NULL,"VDP Mode: AUTO", "Select VDP mode", 56,132,276,48}, - {NULL,NULL,"System Clock: AUTO", "Select system clock frequency", 56,132,276,48}, - {NULL,NULL,"System Boot: BIOS&CART", "Select system booting method", 56,132,276,48}, - {NULL,NULL,"System Lockups: ON", "Enable/disable original system lock-ups", 56,132,276,48}, - {NULL,NULL,"68k Address Error: ON", "Enable/disable 68k address error exceptions", 56,132,276,48}, - {NULL,NULL,"Lock-on: OFF", "Select Lock-On cartridge type", 56,132,276,48}, - {NULL,NULL,"Cartridge Swap: OFF", "Enable/disable cartridge hot swap", 56,132,276,48}, - {NULL,NULL,"SVP Cycles: 1500", "Adjust SVP chip emulation speed", 56,132,276,48} -}; - -/* Video options */ -#ifdef HW_RVL -static gui_item items_video[13] = -#else -static gui_item items_video[11] = -#endif -{ - {NULL,NULL,"Display: PROGRESSIVE", "Select video mode", 56,132,276,48}, - {NULL,NULL,"TV mode: 50/60Hz", "Select video refresh rate", 56,132,276,48}, - {NULL,NULL,"VSYNC: AUTO", "Enable/disable sync with Video Hardware", 56,132,276,48}, - {NULL,NULL,"GX Bilinear Filter: OFF", "Enable/disable texture hardware filtering", 56,132,276,48}, - {NULL,NULL,"GX Deflickering Filter: OFF","Enable/disable GX hardware filtering", 56,132,276,48}, -#ifdef HW_RVL - {NULL,NULL,"VI Trap Filter: ON", "Enable/disable video hardware filtering", 56,132,276,48}, - {NULL,NULL,"VI Gamma Correction: 1.0", "Adjust video hardware gamma correction", 56,132,276,48}, -#endif - {NULL,NULL,"NTSC Filter: COMPOSITE", "Enable/disable NTSC software filtering", 56,132,276,48}, - {NULL,NULL,"Borders: OFF", "Enable/disable overscan emulation", 56,132,276,48}, - {NULL,NULL,"GG screen: ORIGINAL", "Enable/disable Game Gear extended screen", 56,132,276,48}, - {NULL,NULL,"Aspect: ORIGINAL (4:3)", "Select display aspect ratio", 56,132,276,48}, - {NULL,NULL,"Screen Position (+0,+0)", "Adjust display position", 56,132,276,48}, - {NULL,NULL,"Screen Scaling (+0,+0)", "Adjust display scaling", 56,132,276,48} -}; - -/* Menu options */ -static gui_item items_prefs[11] = -{ - {NULL,NULL,"Auto ROM Load: OFF", "Enable/disable automatic ROM loading on startup", 56,132,276,48}, - {NULL,NULL,"Auto Cheats: OFF", "Enable/disable automatic cheats activation", 56,132,276,48}, - {NULL,NULL,"Auto Saves: OFF", "Enable/disable automatic saves", 56,132,276,48}, - {NULL,NULL,"ROM Load Device: SD", "Configure default device for ROM files", 56,132,276,48}, - {NULL,NULL,"Saves Device: FAT", "Configure default device for Save files", 56,132,276,48}, - {NULL,NULL,"SFX Volume: 100", "Adjust sound effects volume", 56,132,276,48}, - {NULL,NULL,"BGM Volume: 100", "Adjust background music volume", 56,132,276,48}, - {NULL,NULL,"BG Overlay: ON", "Enable/disable background overlay", 56,132,276,48}, - {NULL,NULL,"Screen Width: 658", "Adjust menu screen width in pixels", 56,132,276,48}, - {NULL,NULL,"Show CD Leds: OFF", "Enable/disable CD leds display", 56,132,276,48}, - {NULL,NULL,"Show FPS: OFF", "Enable/disable FPS counter", 56,132,276,48}, -}; - -/* Save Manager */ -static gui_item items_saves[9] = -{ - {NULL,NULL,"","" ,0,0,0,0}, - {NULL,NULL,"","" ,0,0,0,0}, - {NULL,NULL,"","" ,0,0,0,0}, - {NULL,NULL,"","" ,0,0,0,0}, - {NULL,NULL,"","" ,0,0,0,0}, - {NULL,NULL,"","Load file" ,0,0,0,0}, - {NULL,NULL,"","Set as default file",0,0,0,0}, - {NULL,NULL,"","Delete file" ,0,0,0,0}, - {NULL,NULL,"","Save file" ,0,0,0,0} -}; - -/*****************************************************************************/ -/* Menu Buttons description */ -/*****************************************************************************/ - -/* Generic Buttons for list menu */ -static gui_butn arrow_up = {&arrow_up_data,BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,0,0,0},14,76,360,32}; -static gui_butn arrow_down = {&arrow_down_data,BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,0,0,0},14,368,360,32}; - -/* Generic list menu */ -static gui_butn buttons_list[4] = -{ - {&button_text_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,1,0,0},56,132,276,48}, - {&button_text_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,1,0,0},56,188,276,48}, - {&button_text_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,1,0,0},56,244,276,48}, - {&button_text_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,1,0,0},56,300,276,48} -}; - -/* Main menu */ -static gui_butn buttons_main[10] = -{ - {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,0,0,1}, 80,140,148,132}, - {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,0,1,1},246,140,148,132}, - {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,0,1,0},412,140,148,132}, - {&button_icon_data, BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,4,0,1}, 80,194,148,132}, - {&button_icon_data, BUTTON_OVER_SFX ,{3,4,1,1},246,194,148,132}, - {&button_icon_data, BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,3,1,0},412,194,148,132}, - {NULL , BUTTON_OVER_SFX ,{3,1,0,2}, 10,334, 84, 32}, - {NULL , BUTTON_OVER_SFX ,{4,0,0,2}, 10,372, 84, 32}, - {NULL , BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,1,1,0},546,334, 84, 32}, - {NULL , BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,0,2,0},546,372, 84, 32} -}; - -/* Controllers Menu */ -static gui_butn buttons_ctrls[13] = -{ - {&button_icon_data ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX ,{0,1,0,2}, 60, 88,148,132}, - {&button_icon_data ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX ,{1,0,0,5}, 60,258,148,132}, - {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,1,2,0},250, 79, 84, 32}, - {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,1,3,0},250,117, 84, 32}, - {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,1,4,0},250,155, 84, 32}, - {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,1,5,0},250,193, 84, 32}, - {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,1,5,0},250,249, 84, 32}, - {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,1,6,0},250,287, 84, 32}, - {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,1,7,0},250,325, 84, 32}, - {NULL ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{1,0,8,0},250,363, 84, 32}, - {&button_icon_sm_data ,BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX ,{0,1,1,0},436,168,160, 52}, - {&button_icon_sm_data ,BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX ,{1,1,0,0},436,232,160, 52}, - {&button_icon_sm_data ,BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX|BUTTON_SELECT_SFX ,{1,0,0,0},436,296,160, 52} -}; - -/* Load Game menu */ -static gui_butn buttons_load[6] = -{ - {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,3,0,1}, 80,120,148,132}, - {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,3,1,1},246,120,148,132}, - {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,3,1,0},412,120,148,132}, - {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,0,0,1}, 80,264,148,132}, - {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,0,1,1},246,264,148,132}, - {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,0,1,0},412,264,148,132} -}; - -/* Options menu */ -static gui_butn buttons_options[5] = -{ - {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,3,0,1}, 80,120,148,132}, - {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,3,1,1},246,120,148,132}, - {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{0,2,1,1},412,120,148,132}, - {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{3,0,1,1},162,264,148,132}, - {&button_icon_data,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX|BUTTON_SELECT_SFX,{2,0,1,0},330,264,148,132} -}; - -/* Save Manager Menu */ -static gui_butn buttons_saves[9] = -{ - {&button_text_data ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{0,1,0,0}, 56,102,276,48}, - {&button_text_data ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,1,0,0}, 56,158,276,48}, - {&button_text_data ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,1,0,0}, 56,214,276,48}, - {&button_text_data ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,1,0,0}, 56,270,276,48}, - {&button_text_data ,BUTTON_VISIBLE|BUTTON_ACTIVE|BUTTON_OVER_SFX,{1,0,0,0}, 56,326,276,48}, - {&button_load_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{0,1,0,0},530,130, 56,56}, - {&button_special_data,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{1,1,0,0},530,196, 56,56}, - {&button_delete_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{1,1,0,0},530,262, 56,56}, - {&button_save_data ,BUTTON_ACTIVE|BUTTON_SLIDE_RIGHT|BUTTON_OVER_SFX,{1,0,0,0},530,328, 56,56} -}; - -/*****************************************************************************/ -/* Menu descriptions */ -/*****************************************************************************/ - -/* Main menu */ -static gui_menu menu_main = -{ - "", - 0,0, - 10,10,4,0, - items_main, - buttons_main, - bg_main, - {NULL,NULL}, - {NULL,NULL}, - NULL -}; - -/* Main menu */ -gui_menu menu_ctrls = -{ - "Controller Settings", - 0,0, - 13,13,8,0, - items_ctrls, - buttons_ctrls, - bg_ctrls, - {&action_cancel, &action_select}, - {NULL,NULL}, - ctrlmenu_cb -}; - -/* Load Game menu */ -static gui_menu menu_load = -{ - "Load Game", - 0,0, - 6,6,5,0, - items_load, - buttons_load, - bg_misc, - {&action_cancel, &action_select}, - {NULL,NULL}, - NULL -}; - -/* Options menu */ -static gui_menu menu_options = -{ - "Settings", - 0,0, - 5,5,5,0, - items_options, - buttons_options, - bg_misc, - {&action_cancel, &action_select}, - {NULL,NULL}, - NULL -}; - -/* System Options menu */ -static gui_menu menu_system = -{ - "System Settings", - 0,0, - 10,4,6,0, - items_system, - buttons_list, - bg_list, - {&action_cancel, &action_select}, - {&arrow_up,&arrow_down}, - NULL -}; - -/* Video Options menu */ -static gui_menu menu_video = -{ - "Video Settings", - 0,0, - 10,4,6,0, - items_video, - buttons_list, - bg_list, - {&action_cancel, &action_select}, - {&arrow_up,&arrow_down}, - NULL -}; - -/* Sound Options menu */ -static gui_menu menu_audio = -{ - "Audio Settings", - 0,0, - 9,4,6,0, - items_audio, - buttons_list, - bg_list, - {&action_cancel, &action_select}, - {&arrow_up,&arrow_down}, - NULL -}; - -/* Sound Options menu */ -static gui_menu menu_prefs = -{ - "Menu Settings", - 0,0, - 11,4,6,0, - items_prefs, - buttons_list, - bg_list, - {&action_cancel, &action_select}, - {&arrow_up,&arrow_down}, - NULL -}; - - -/* Save Manager menu */ -static gui_menu menu_saves = -{ - "Save Manager", - 0,0, - 9,9,8,0, - items_saves, - buttons_saves, - bg_saves, - {&action_cancel, &action_select}, - {NULL,NULL}, - savemenu_cb -}; - -/**************************************************************************** - * GUI Settings menu - * - ****************************************************************************/ -static void update_screen_w(void) -{ - vmode->viWidth = config.screen_w; - vmode->viXOrigin = (VI_MAX_WIDTH_NTSC -config.screen_w)/2; - VIDEO_Configure(vmode); - VIDEO_Flush(); -} - -static void update_bgm(void) -{ - SetVolumeOgg(((int)config.bgm_volume * 255) / 100); -} - -static void prefmenu () -{ - int ret, quit = 0; - gui_menu *m = &menu_prefs; - gui_item *items = m->items; - - sprintf (items[0].text, "Auto ROM Load: %s", config.autoload ? "ON":"OFF"); - sprintf (items[1].text, "Auto Cheats: %s", config.autocheat ? "ON":"OFF"); - if (config.s_auto == 3) sprintf (items[2].text, "Auto Saves: ALL"); - else if (config.s_auto == 2) sprintf (items[2].text, "Auto Saves: STATE ONLY"); - else if (config.s_auto == 1) sprintf (items[2].text, "Auto Saves: SRAM ONLY"); - else sprintf (items[2].text, "Auto Saves: NONE"); -#ifdef HW_RVL - if (config.l_device == 1) sprintf (items[3].text, "ROM Load Device: USB"); - else if (config.l_device == 2) sprintf (items[3].text, "ROM Load Device: DVD"); -#else - if (config.l_device == 1) sprintf (items[3].text, "ROM Load Device: DVD"); -#endif - else sprintf (items[3].text, "ROM Load Device: SD"); - if (config.s_device == 1) sprintf (items[4].text, "Saves Device: MCARD A"); - else if (config.s_device == 2) sprintf (items[4].text, "Saves Device: MCARD B"); - else sprintf (items[4].text, "Saves Device: FAT"); - sprintf (items[5].text, "SFX Volume: %1.1f", config.sfx_volume); - sprintf (items[6].text, "BGM Volume: %1.1f", config.bgm_volume); - sprintf (items[7].text, "BG Overlay: %s", config.bg_overlay ? "ON":"OFF"); - sprintf (items[8].text, "Screen Width: %d", config.screen_w); - sprintf (items[9].text, "Show CD Leds: %s", config.cd_leds ? "ON":"OFF"); - sprintf (items[10].text, "Show FPS: %s", config.fps ? "ON":"OFF"); - - GUI_InitMenu(m); - GUI_SlideMenuTitle(m,strlen("Menu ")); - - while (quit == 0) - { - ret = GUI_RunMenu(m); - - switch (ret) - { - case 0: /* Auto load last ROM file on startup */ - config.autoload ^= 1; - sprintf (items[0].text, "Auto ROM Load: %s", config.autoload ? "ON":"OFF"); - break; - - case 1: /* Cheats automatic activation */ - config.autocheat ^= 1; - sprintf (items[1].text, "Auto Cheats: %s", config.autocheat ? "ON":"OFF"); - break; - - case 2: /*** Auto load/save STATE & SRAM files ***/ - config.s_auto = (config.s_auto + 1) % 4; - if (config.s_auto == 3) sprintf (items[2].text, "Auto Saves: ALL"); - else if (config.s_auto == 2) sprintf (items[2].text, "Auto Saves: STATE ONLY"); - else if (config.s_auto == 1) sprintf (items[2].text, "Auto Saves: SRAM ONLY"); - else sprintf (items[2].text, "Auto Saves: NONE"); - break; - - case 3: /*** Default ROM device ***/ -#ifdef HW_RVL - config.l_device = (config.l_device + 1) % 3; - if (config.l_device == 1) sprintf (items[3].text, "ROM Load Device: USB"); - else if (config.l_device == 2) sprintf (items[3].text, "ROM Load Device: DVD"); -#else - config.l_device ^= 1; - if (config.l_device == 1) sprintf (items[3].text, "ROM Load Device: DVD"); -#endif - else sprintf (items[3].text, "ROM Load Device: SD"); - break; - - case 4: /*** Default saves device ***/ - config.s_device = (config.s_device + 1) % 3; - if (config.s_device == 1) sprintf (items[4].text, "Saves Device: MCARD A"); - else if (config.s_device == 2) sprintf (items[4].text, "Saves Device: MCARD B"); - else sprintf (items[4].text, "Saves Device: FAT"); - break; - - case 5: /*** Sound effects volume ***/ - GUI_OptionBox(m,0,"SFX Volume",(void *)&config.sfx_volume,10.0,0.0,100.0,0); - sprintf (items[5].text, "SFX Volume: %1.1f", config.sfx_volume); - break; - - case 6: /*** Background music volume ***/ - GUI_OptionBox(m,update_bgm,"BGM Volume",(void *)&config.bgm_volume,10.0,0.0,100.0,0); - sprintf (items[6].text, "BGM Volume: %1.1f", config.bgm_volume); - break; - - case 7: /*** Background overlay ***/ - config.bg_overlay ^= 1; - if (config.bg_overlay) - { - bg_main[1].state |= IMAGE_VISIBLE; - bg_misc[1].state |= IMAGE_VISIBLE; - bg_ctrls[1].state |= IMAGE_VISIBLE; - bg_list[1].state |= IMAGE_VISIBLE; - bg_saves[2].state |= IMAGE_VISIBLE; - sprintf (items[7].text, "BG Overlay: ON"); - } - else - { - bg_main[1].state &= ~IMAGE_VISIBLE; - bg_misc[1].state &= ~IMAGE_VISIBLE; - bg_ctrls[1].state &= ~IMAGE_VISIBLE; - bg_list[1].state &= ~IMAGE_VISIBLE; - bg_saves[2].state &= ~IMAGE_VISIBLE; - sprintf (items[7].text, "BG Overlay: OFF"); - } - break; - - case 8: /*** Screen Width ***/ - GUI_OptionBox(m,update_screen_w,"Screen Width",(void *)&config.screen_w,2,640,VI_MAX_WIDTH_NTSC,1); - sprintf (items[8].text, "Screen Width: %d", config.screen_w); - break; - - case 9: /*** CD LEDS ***/ - config.cd_leds ^= 1; - sprintf (items[9].text, "Show CD Leds: %s", config.cd_leds ? "ON":"OFF"); - break; - - case 10: /*** FPS counter ***/ - config.fps ^= 1; - sprintf (items[10].text, "Show FPS: %s", config.fps ? "ON":"OFF"); - break; - - case -1: - quit = 1; - break; - } - } - - /* stop DVD drive when not in use */ - if (config.l_device != 2) - { -#ifdef HW_RVL - DI_StopMotor(); -#else - vu32* const dvd = (u32*)0xCC006000; - dvd[0] = 0x2e; - dvd[1] = 0; - dvd[2] = 0xe3000000; - dvd[3] = 0; - dvd[4] = 0; - dvd[5] = 0; - dvd[6] = 0; - dvd[7] = 1; - while (dvd[7] & 1); - dvd[0] = 0x14; - dvd[1] = 0; -#endif - } - - GUI_DeleteMenu(m); -} - -/**************************************************************************** - * Audio Settings menu - * - ****************************************************************************/ -static void soundmenu () -{ - int ret, quit = 0; - float fm_volume = (float)config.fm_preamp/100.0; - float psg_volume = (float)config.psg_preamp/100.0; - gui_menu *m = &menu_audio; - gui_item *items = m->items; - - if (config.ym2413 == 0) sprintf (items[0].text, "Master System FM: OFF"); - else if (config.ym2413 == 1) sprintf (items[0].text, "Master System FM: ON"); - else sprintf (items[0].text, "Master System FM: AUTO"); - - if (config.hq_fm) sprintf (items[1].text, "High-Quality FM: ON"); - else sprintf (items[1].text, "High-Quality FM: OFF"); - - if (config.dac_bits < 14) sprintf (items[2].text, "FM Resolution: %d bits", config.dac_bits); - else sprintf (items[2].text, "FM Resolution: MAX"); - - sprintf (items[3].text, "FM Volume: %1.2f", fm_volume); - sprintf (items[4].text, "PSG Volume: %1.2f", psg_volume); - sprintf (items[5].text, "PSG Noise Boost: %s", config.psgBoostNoise ? "ON":"OFF"); - sprintf (items[6].text, "Audio Out: %s", config.mono ? "MONO":"STEREO"); - - if (config.filter == 2) - { - float lg = (float)config.lg/100.0; - float mg = (float)config.mg/100.0; - float hg = (float)config.hg/100.0; - - sprintf(items[7].text, "Filtering: 3-BAND EQ"); - sprintf(items[8].text, "Low Gain: %1.2f", lg); - strcpy(items[8].comment, "Adjust EQ Low Band Gain"); - sprintf(items[9].text, "Middle Gain: %1.2f", mg); - sprintf(items[10].text, "High Gain: %1.2f", hg); - sprintf(items[11].text, "Low Freq: %d", config.low_freq); - sprintf(items[12].text, "High Freq: %d", config.high_freq); - m->max_items = 13; - } - else if (config.filter == 1) - { - int16 lp_range = (config.lp_range * 100 + 0xffff) / 0x10000; - sprintf (items[7].text, "Filtering: LOW-PASS"); - sprintf (items[8].text, "Low-Pass Rate: %d %%", lp_range); - strcpy (items[9].comment, "Adjust Low Pass filter"); - m->max_items = 9; - } - else - { - sprintf (items[7].text, "Filtering: OFF"); - m->max_items = 8; - } - - GUI_InitMenu(m); - GUI_SlideMenuTitle(m,strlen("Audio ")); - - while (quit == 0) - { - ret = GUI_RunMenu(m); - - switch (ret) - { - case 0: - { - config.ym2413++; - if (config.ym2413 > 2) config.ym2413 = 0; - if (config.ym2413 == 0) sprintf (items[0].text, "Master System FM: OFF"); - else if (config.ym2413 == 1) sprintf (items[0].text, "Master System FM: ON"); - else sprintf (items[0].text, "Master System FM: AUTO"); - - /* Automatic detection */ - if ((config.ym2413 & 2) && system_hw && ((system_hw & SYSTEM_PBC) != SYSTEM_MD)) - { - /* detect if game is using YM2413 */ - sms_cart_init(); - - /* restore SRAM */ - slot_autoload(0,config.s_device); - } - break; - } - - case 1: - { - config.hq_fm ^= 1; - if (config.hq_fm) sprintf (items[1].text, "High-Quality FM: ON"); - else sprintf (items[1].text, "High-Quality FM: OFF"); - break; - } - - case 2: - { - config.dac_bits++; - if (config.dac_bits > 14) config.dac_bits = 7; - if (config.dac_bits < 14) sprintf (items[2].text, "FM Resolution: %d bits", config.dac_bits); - else sprintf (items[2].text, "FM Resolution: MAX"); - YM2612Config(config.dac_bits); - break; - } - - case 3: - { - GUI_OptionBox(m,0,"FM Volume",(void *)&fm_volume,0.01,0.0,5.0,0); - sprintf (items[3].text, "FM Volume: %1.2f", fm_volume); - config.fm_preamp = (int)(fm_volume * 100.0 + 0.5); - break; - } - - case 4: - { - GUI_OptionBox(m,0,"PSG Volume",(void *)&psg_volume,0.01,0.0,5.0,0); - sprintf (items[4].text, "PSG Volume: %1.2f", psg_volume); - config.psg_preamp = (int)(psg_volume * 100.0 + 0.5); - if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) - { - SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, 0xff); - } - else - { - SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, io_reg[6]); - } - break; - } - - case 5: - { - config.psgBoostNoise ^= 1; - sprintf (items[5].text, "PSG Noise Boost: %s", config.psgBoostNoise ? "ON":"OFF"); - if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) - { - SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, 0xff); - } - else - { - SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, io_reg[6]); - } - break; - } - - case 6: - { - config.mono ^= 1; - sprintf (items[6].text, "Audio Out: %s", config.mono ? "MONO":"STEREO"); - break; - } - - case 7: - { - config.filter = (config.filter + 1) % 3; - if (config.filter == 2) - { - float lg = (float)config.lg/100.0; - sprintf (items[7].text, "Filtering: 3-BAND EQ"); - sprintf (items[8].text, "Low Gain: %1.2f", lg); - strcpy (items[8].comment, "Adjust EQ Low Band Gain"); - m->max_items = 13; - audio_set_equalizer(); - } - else if (config.filter == 1) - { - int lp_range = (config.lp_range * 100 + 0xffff) / 0x10000; - sprintf (items[7].text, "Filtering: LOW-PASS"); - sprintf (items[8].text, "Low-Pass Rate: %d %%", lp_range); - strcpy (items[8].comment, "Adjust Low Pass filter"); - m->max_items = 9; - } - else - { - sprintf (items[7].text, "Filtering: OFF"); - m->max_items = 8; - } - - while ((m->offset + 4) > m->max_items) - { - m->offset--; - m->selected++; - } - break; - } - - case 8: - { - if (config.filter == 1) - { - int16 lp_range = (config.lp_range * 100 + 0xffff) / 0x10000; - GUI_OptionBox(m,0,"Low-Pass Rate",(void *)&lp_range,1,0,100,1); - sprintf (items[8].text, "Low-Pass Rate: %d %%", lp_range); - config.lp_range = (lp_range * 0x10000) / 100; - } - else - { - float lg = (float)config.lg/100.0; - GUI_OptionBox(m,0,"Low Gain",(void *)&lg,0.01,0.0,2.0,0); - sprintf (items[8].text, "Low Gain: %1.2f", lg); - config.lg = (int)(lg * 100.0); - audio_set_equalizer(); - } - break; - } - - case 9: - { - float mg = (float)config.mg/100.0; - GUI_OptionBox(m,0,"Middle Gain",(void *)&mg,0.01,0.0,2.0,0); - sprintf (items[9].text, "Middle Gain: %1.2f", mg); - config.mg = (int)(mg * 100.0); - audio_set_equalizer(); - break; - } - - case 10: - { - float hg = (float)config.hg/100.0; - GUI_OptionBox(m,0,"High Gain",(void *)&hg,0.01,0.0,2.0,0); - sprintf (items[10].text, "High Gain: %1.2f", hg); - config.hg = (int)(hg * 100.0); - audio_set_equalizer(); - break; - } - - case 11: - { - GUI_OptionBox(m,0,"Low Frequency",(void *)&config.low_freq,10,0,config.high_freq,1); - sprintf (items[11].text, "Low Freq: %d", config.low_freq); - audio_set_equalizer(); - break; - } - - case 12: - { - GUI_OptionBox(m,0,"High Frequency",(void *)&config.high_freq,100,config.low_freq,30000,1); - sprintf (items[12].text, "High Freq: %d", config.high_freq); - audio_set_equalizer(); - break; - } - - case -1: - { - quit = 1; - break; - } - } - } - - GUI_DeleteMenu(m); -} - -/**************************************************************************** - * System Settings menu - * - ****************************************************************************/ -static const uint16 vc_table[4][2] = -{ - /* NTSC, PAL */ - {0xDA , 0xF2}, /* Mode 4 (192 lines) */ - {0xEA , 0x102}, /* Mode 5 (224 lines) */ - {0xDA , 0xF2}, /* Mode 4 (192 lines) */ - {0x106, 0x10A} /* Mode 5 (240 lines) */ -}; - -static void systemmenu () -{ - int ret, quit = 0; - int reinit = 0; - gui_menu *m = &menu_system; - gui_item *items = m->items; - - if (config.system == 0) - sprintf (items[0].text, "Console Type: AUTO"); - else if (config.system == SYSTEM_SG) - sprintf (items[0].text, "Console Type: SG-1000"); - else if (config.system == SYSTEM_MARKIII) - sprintf (items[0].text, "Console Type: MARK-III"); - else if (config.system == SYSTEM_SMS) - sprintf (items[0].text, "Console Type: SMS"); - else if (config.system == SYSTEM_SMS2) - sprintf (items[0].text, "Console Type: SMS II"); - else if (config.system == SYSTEM_GG) - sprintf (items[0].text, "Console Type: GG"); - else if (config.system == SYSTEM_MD) - sprintf (items[0].text, "Console Type: MD"); - - if (config.region_detect == 0) - sprintf (items[1].text, "Console Region: AUTO"); - else if (config.region_detect == 1) - sprintf (items[1].text, "Console Region: USA"); - else if (config.region_detect == 2) - sprintf (items[1].text, "Console Region: EUROPE"); - else if (config.region_detect == 3) - sprintf (items[1].text, "Console Region: JAPAN"); - - if (config.vdp_mode == 0) - sprintf (items[2].text, "VDP Mode: AUTO"); - else if (config.vdp_mode == 1) - sprintf (items[2].text, "VDP Mode: NTSC"); - else if (config.vdp_mode == 2) - sprintf (items[2].text, "VDP Mode: PAL"); - - if (config.master_clock == 0) - sprintf (items[3].text, "System Clock: AUTO"); - else if (config.master_clock == 1) - sprintf (items[3].text, "System Clock: NTSC"); - else if (config.master_clock == 2) - sprintf (items[3].text, "System Clock: PAL"); - - sprintf (items[4].text, "System Boot: %s", (config.bios & 1) ? ((config.bios & 2) ? "BIOS&CART" : "BIOS ONLY") : "CART"); - sprintf (items[5].text, "System Lockups: %s", config.force_dtack ? "OFF" : "ON"); - sprintf (items[6].text, "68k Address Error: %s", config.addr_error ? "ON" : "OFF"); - - if (config.lock_on == TYPE_GG) - sprintf (items[7].text, "Lock-On: GAME GENIE"); - else if (config.lock_on == TYPE_AR) - sprintf (items[7].text, "Lock-On: ACTION REPLAY"); - else if (config.lock_on == TYPE_SK) - sprintf (items[7].text, "Lock-On: SONIC&KNUCKLES"); - else - sprintf (items[7].text, "Lock-On: OFF"); - - sprintf (items[8].text, "Cartridge Swap: %s", (config.hot_swap & 1) ? "ON":"OFF"); - - if (svp) - { - sprintf (items[9].text, "SVP Cycles: %d", SVP_cycles); - m->max_items = 10; - } - else - { - m->max_items = 9; - } - - GUI_InitMenu(m); - GUI_SlideMenuTitle(m,strlen("System ")); - - while (quit == 0) - { - ret = GUI_RunMenu(m); - - switch (ret) - { - case 0: /*** Force System Hardware ***/ - { - if (config.system == SYSTEM_MD) - { - config.system = 0; - sprintf (items[0].text, "Console Type: AUTO"); - - /* Default system hardware (auto) */ - if (system_hw) system_hw = romtype; - } - else if (config.system == 0) - { - config.system = SYSTEM_SG; - sprintf (items[0].text, "Console Type: SG-1000"); - if (system_hw) system_hw = SYSTEM_SG; - } - else if (config.system == SYSTEM_SG) - { - config.system = SYSTEM_MARKIII; - sprintf (items[0].text, "Console Type: MARK-III"); - if (system_hw) system_hw = SYSTEM_MARKIII; - } - else if (config.system == SYSTEM_MARKIII) - { - config.system = SYSTEM_SMS; - sprintf (items[0].text, "Console Type: SMS"); - if (system_hw) system_hw = SYSTEM_SMS; - } - else if (config.system == SYSTEM_SMS) - { - config.system = SYSTEM_SMS2; - sprintf (items[0].text, "Console Type: SMS II"); - if (system_hw) system_hw = SYSTEM_SMS2; - } - else if (config.system == SYSTEM_SMS2) - { - config.system = SYSTEM_GG; - sprintf (items[0].text, "Console Type: GG"); - - if (romtype == SYSTEM_GG) - { - /* Game Gear mode */ - if (system_hw) system_hw = SYSTEM_GG; - } - else - { - /* Game Gear in MS compatibility mode */ - if (system_hw) system_hw = SYSTEM_GGMS; - } - } - else if (config.system == SYSTEM_GG) - { - config.system = SYSTEM_MD; - sprintf (items[0].text, "Console Type: MD"); - - if (romtype & SYSTEM_MD) - { - /* Default mode */ - if (system_hw) system_hw = romtype; - } - else - { - /* Mega Drive in MS compatibility mode */ - if (system_hw) system_hw = SYSTEM_PBC; - } - } - - if (system_hw) - { - /* restore previous input settings */ - if (old_system[0] != -1) - { - input.system[0] = old_system[0]; - } - if (old_system[1] != -1) - { - input.system[1] = old_system[1]; - } - - /* reinitialize audio streams */ - audio_init(snd.sample_rate, snd.frame_rate); - - /* force hard reset */ - system_init(); - system_reset(); - - /* restore SRAM */ - slot_autoload(0,config.s_device); - } - - break; - } - - case 1: /*** Force Region ***/ - { - config.region_detect = (config.region_detect + 1) % 4; - if (config.region_detect == 0) - sprintf (items[1].text, "Console Region: AUTO"); - else if (config.region_detect == 1) - sprintf (items[1].text, "Console Region: USA"); - else if (config.region_detect == 2) - sprintf (items[1].text, "Console Region: EUR"); - else if (config.region_detect == 3) - sprintf (items[1].text, "Console Region: JAPAN"); - - /* force system reinitialization + region BIOS */ - reinit = 2; - break; - } - - case 2: /*** Force VDP mode ***/ - { - config.vdp_mode = (config.vdp_mode + 1) % 3; - if (config.vdp_mode == 0) - sprintf (items[2].text, "VDP Mode: AUTO"); - else if (config.vdp_mode == 1) - sprintf (items[2].text, "VDP Mode: NTSC"); - else if (config.vdp_mode == 2) - sprintf (items[2].text, "VDP Mode: PAL"); - - /* force system reinitialization */ - reinit = 1; - break; - } - - case 3: /*** Force Master Clock ***/ - { - config.master_clock = (config.master_clock + 1) % 3; - if (config.master_clock == 0) - sprintf (items[3].text, "System Clock: AUTO"); - else if (config.master_clock == 1) - sprintf (items[3].text, "System Clock: NTSC"); - else if (config.master_clock == 2) - sprintf (items[3].text, "System Clock: PAL"); - - /* force system reinitialization */ - reinit = 1; - break; - } - - case 4: /*** BIOS support ***/ - { - if (config.bios == 0) config.bios = 3; - else if (config.bios == 3) config.bios = 1; - else config.bios = 0; - sprintf (items[4].text, "System Boot: %s", (config.bios & 1) ? ((config.bios & 2) ? "BIOS&CART " : "BIOS ONLY") : "CART"); - if ((system_hw == SYSTEM_MD) || (system_hw & SYSTEM_GG) || (system_hw & SYSTEM_SMS)) - { - /* force hard reset */ - system_init(); - system_reset(); - - /* restore SRAM */ - slot_autoload(0,config.s_device); - } - break; - } - - case 5: /*** force DTACK ***/ - { - config.force_dtack ^= 1; - sprintf (items[5].text, "System Lockups: %s", config.force_dtack ? "OFF" : "ON"); - break; - } - - case 6: /*** 68k Address Error ***/ - { - config.addr_error ^= 1; - m68k.aerr_enabled = config.addr_error; - sprintf (items[6].text, "68k Address Error: %s", config.addr_error ? "ON" : "OFF"); - break; - } - - case 7: /*** Cart Lock-On ***/ - { - config.lock_on = (config.lock_on + 1) % (TYPE_SK + 1); - if (config.lock_on == TYPE_GG) - sprintf (items[7].text, "Lock-On: GAME GENIE"); - else if (config.lock_on == TYPE_AR) - sprintf (items[7].text, "Lock-On: ACTION REPLAY"); - else if (config.lock_on == TYPE_SK) - sprintf (items[7].text, "Lock-On: SONIC&KNUCKLES"); - else - sprintf (items[7].text, "Lock-On: OFF"); - - if ((system_hw == SYSTEM_MD) || (system_hw == SYSTEM_PICO)) - { - /* force hard reset */ - system_init(); - system_reset(); - - /* restore SRAM */ - slot_autoload(0,config.s_device); - - /* Action Replay switch */ - if (areplay_get_status() < 0) - { - menu_main.buttons[6].state &= ~(BUTTON_VISIBLE | BUTTON_ACTIVE); - menu_main.items[6].data = NULL; - menu_main.cb = NULL; - menu_main.buttons[3].shift[1] = 4; - menu_main.buttons[7].shift[0] = 4; - menu_main.buttons[8].shift[2] = 1; - } - else - { - menu_main.buttons[6].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); - menu_main.items[6].data = Button_sm_grey_png; - menu_main.cb = mainmenu_cb; - menu_main.buttons[3].shift[1] = 3; - menu_main.buttons[7].shift[0] = 1; - menu_main.buttons[8].shift[2] = 2; - } - } - break; - } - - case 8: /*** Cartridge Hot Swap ***/ - { - config.hot_swap ^= 1; - sprintf (items[8].text, "Cartridge Swap: %s", (config.hot_swap & 1) ? "ON":"OFF"); - break; - } - - case 9: /*** SVP cycles per line ***/ - { - GUI_OptionBox(m,0,"SVP Cycles",(void *)&SVP_cycles,1,1,1500,1); - sprintf (items[9].text, "SVP Cycles: %d", SVP_cycles); - break; - } - - case -1: - { - quit = 1; - break; - } - } - } - - if (reinit && system_hw) - { - /* reinitialize console region */ - get_region(NULL); - - /* framerate might have changed, reinitialize audio timings */ - audio_init(snd.sample_rate, get_framerate()); - - /* system with region BIOS should be reinitialized if region code has changed */ - if ((reinit & 2) && ((system_hw == SYSTEM_MCD) || ((system_hw & SYSTEM_SMS) && (config.bios & 1)))) - { - system_init(); - system_reset(); - - /* restore SRAM */ - slot_autoload(0,config.s_device); - } - else - { - /* reinitialize I/O region register */ - if (system_hw == SYSTEM_MD) - { - io_reg[0x00] = 0x20 | region_code | (config.bios & 1); - } - else if (system_hw == SYSTEM_MCD) - { - io_reg[0x00] = region_code | (config.bios & 1); - } - else - { - io_reg[0x00] = 0x80 | (region_code >> 1); - } - - /* reinitialize VDP */ - if (vdp_pal) - { - status |= 1; - lines_per_frame = 313; - } - else - { - status &= ~1; - lines_per_frame = 262; - } - - /* reinitialize VC max value */ - switch (bitmap.viewport.h) - { - case 192: - vc_max = vc_table[0][vdp_pal]; - break; - case 224: - vc_max = vc_table[1][vdp_pal]; - break; - case 240: - vc_max = vc_table[3][vdp_pal]; - break; - } - } - } - - GUI_DeleteMenu(m); -} - -/**************************************************************************** - * Video Settings menu - * - ****************************************************************************/ -#ifdef HW_RVL -#define VI_OFFSET 7 -static void update_gamma(void) -{ - VIDEO_SetGamma((int)(config.gamma * 10.0)); - VIDEO_Flush(); -} -#else -#define VI_OFFSET 5 -#endif - -static void videomenu () -{ - u16 state[2]; - int ret, quit = 0; - int reinit = 0; - gui_menu *m = &menu_video; - gui_item *items = m->items; - - if (config.render == 1) - sprintf (items[0].text,"Display: INTERLACED"); - else if (config.render == 2) - sprintf (items[0].text, "Display: PROGRESSIVE"); - else - sprintf (items[0].text, "Display: ORIGINAL"); - - if (config.tv_mode == 0) - sprintf (items[1].text, "TV Mode: 60HZ"); - else if (config.tv_mode == 1) - sprintf (items[1].text, "TV Mode: 50HZ"); - else - sprintf (items[1].text, "TV Mode: 50/60HZ"); - - if (config.vsync) - sprintf (items[2].text, "VSYNC: AUTO"); - else - sprintf (items[2].text, "VSYNC: OFF"); - - sprintf (items[3].text, "GX Bilinear Filter: %s", config.bilinear ? " ON" : "OFF"); - sprintf (items[4].text, "GX Deflickering Filter: %s", config.vfilter ? " ON" : "OFF"); - -#ifdef HW_RVL - sprintf (items[5].text, "VI Trap Filter: %s", config.trap ? " ON" : "OFF"); - sprintf (items[6].text, "VI Gamma Correction: %1.1f", config.gamma); -#endif - - if (config.ntsc == 1) - sprintf (items[VI_OFFSET].text, "NTSC Filter: COMPOSITE"); - else if (config.ntsc == 2) - sprintf (items[VI_OFFSET].text, "NTSC Filter: S-VIDEO"); - else if (config.ntsc == 3) - sprintf (items[VI_OFFSET].text, "NTSC Filter: RGB"); - else - sprintf (items[VI_OFFSET].text, "NTSC Filter: OFF"); - - if (config.overscan == 3) - sprintf (items[VI_OFFSET+1].text, "Borders: FULL"); - else if (config.overscan == 2) - sprintf (items[VI_OFFSET+1].text, "Borders: H ONLY"); - else if (config.overscan == 1) - sprintf (items[VI_OFFSET+1].text, "Borders: V ONLY"); - else - sprintf (items[VI_OFFSET+1].text, "Borders: NONE"); - - sprintf(items[VI_OFFSET+2].text, "GG Screen: %s", config.gg_extra ? "EXTENDED":"ORIGINAL"); - - if (config.aspect == 1) - sprintf (items[VI_OFFSET+3].text,"Aspect: ORIGINAL (4:3)"); - else if (config.aspect == 2) - sprintf (items[VI_OFFSET+3].text, "Aspect: ORIGINAL (16:9)"); - else - sprintf (items[VI_OFFSET+3].text, "Aspect: SCALED"); - - sprintf (items[VI_OFFSET+4].text, "Screen Position: (%s%02d,%s%02d)", - (config.xshift < 0) ? "":"+", config.xshift, - (config.yshift < 0) ? "":"+", config.yshift); - - sprintf (items[VI_OFFSET+5].text, "Screen Scaling: (%s%02d,%s%02d)", - (config.xscale < 0) ? "":"+", config.xscale, - (config.yscale < 0) ? "":"+", config.yscale); - - if (config.aspect) - m->max_items = VI_OFFSET+5; - else - m->max_items = VI_OFFSET+6; - - GUI_InitMenu(m); - GUI_SlideMenuTitle(m,strlen("Video ")); - - while (quit == 0) - { - ret = GUI_RunMenu(m); - - switch (ret) - { - case 0: /*** rendering ***/ - config.render = (config.render + 1) % 3; - if (config.render == 2) - { - /* progressive mode is only possible through component cable */ - if (!VIDEO_HaveComponentCable()) - { - config.render = 0; - } - } - if (config.render == 1) - sprintf (items[0].text,"Display: INTERLACED"); - else if (config.render == 2) - sprintf (items[0].text, "Display: PROGRESSIVE"); - else - sprintf (items[0].text, "Display: ORIGINAL"); - reinit = 1; - break; - - case 1: /*** tv mode ***/ - config.tv_mode = (config.tv_mode + 1) % 3; - if (config.tv_mode == 0) - sprintf (items[1].text, "TV Mode: 60HZ"); - else if (config.tv_mode == 1) - sprintf (items[1].text, "TV Mode: 50HZ"); - else - sprintf (items[1].text, "TV Mode: 50/60HZ"); - reinit = 1; - break; - - case 2: /*** VSYNC ***/ - config.vsync ^= 1; - if (config.vsync) - sprintf (items[2].text, "VSYNC: AUTO"); - else - sprintf (items[2].text, "VSYNC: OFF"); - reinit = 1; - break; - - case 3: /*** GX Texture filtering ***/ - config.bilinear ^= 1; - sprintf (items[3].text, "GX Bilinear Filter: %s", config.bilinear ? " ON" : "OFF"); - break; - - case 4: /*** GX Copy filtering (deflickering filter) ***/ - config.vfilter ^= 1; - sprintf (items[4].text, "GX Deflicker Filter: %s", config.vfilter ? " ON" : "OFF"); - break; - -#ifdef HW_RVL - case 5: /*** VIDEO Trap filtering ***/ - config.trap ^= 1; - sprintf (items[5].text, "VI Trap Filter: %s", config.trap ? " ON" : "OFF"); - break; - - case 6: /*** VIDEO Gamma correction ***/ - if (system_hw) - { - update_gamma(); - state[0] = m->arrows[0]->state; - state[1] = m->arrows[1]->state; - m->max_buttons = 0; - m->max_images = 0; - m->arrows[0]->state = 0; - m->arrows[1]->state = 0; - m->screenshot = 255; - strcpy(m->title,""); - GUI_OptionBox(m,update_gamma,"VI Gamma Correction",(void *)&config.gamma,0.1,0.1,3.0,0); - m->max_buttons = 4; - m->max_images = 6; - m->arrows[0]->state = state[0]; - m->arrows[1]->state = state[1]; - m->screenshot = 0; - strcpy(m->title,"Video Settings"); - sprintf (items[6].text, "VI Gamma Correction: %1.1f", config.gamma); - VIDEO_SetGamma(VI_GM_1_0); - VIDEO_Flush(); - } - else - { - GUI_WaitPrompt("Error","Please load a game first !\n"); - } - break; -#endif - - case VI_OFFSET: /*** NTSC filter ***/ - config.ntsc = (config.ntsc + 1) & 3; - if (config.ntsc == 1) - sprintf (items[VI_OFFSET].text, "NTSC Filter: COMPOSITE"); - else if (config.ntsc == 2) - sprintf (items[VI_OFFSET].text, "NTSC Filter: S-VIDEO"); - else if (config.ntsc == 3) - sprintf (items[VI_OFFSET].text, "NTSC Filter: RGB"); - else - sprintf (items[VI_OFFSET].text, "NTSC Filter: OFF"); - break; - - case VI_OFFSET+1: /*** overscan emulation ***/ - config.overscan = (config.overscan + 1) & 3; - if (config.overscan == 3) - sprintf (items[VI_OFFSET+1].text, "Borders: FULL"); - else if (config.overscan == 2) - sprintf (items[VI_OFFSET+1].text, "Borders: H ONLY"); - else if (config.overscan == 1) - sprintf (items[VI_OFFSET+1].text, "Borders: V ONLY"); - else - sprintf (items[VI_OFFSET+1].text, "Borders: NONE"); - break; - - case VI_OFFSET+2: /*** Game Gear extended screen */ - config.gg_extra ^= 1; - sprintf(items[VI_OFFSET+2].text, "GG Screen: %s", config.gg_extra ? "EXTENDED":"ORIGINAL"); - break; - - case VI_OFFSET+3: /*** aspect ratio ***/ - config.aspect = (config.aspect + 1) % 3; - if (config.aspect == 1) - sprintf (items[VI_OFFSET+3].text,"Aspect: ORIGINAL (4:3)"); - else if (config.aspect == 2) - sprintf (items[VI_OFFSET+3].text, "Aspect: ORIGINAL (16:9)"); - else - sprintf (items[VI_OFFSET+3].text, "Aspect: SCALED"); - - if (config.aspect) - { - /* disable items */ - m->max_items = VI_OFFSET+5; - - /* reset menu selection */ - if (m->offset > VI_OFFSET) - { - m->offset = VI_OFFSET; - m->selected = 3; - } - } - else - { - /* enable items */ - m->max_items = VI_OFFSET+6; - } - - break; - - case VI_OFFSET+4: /*** screen position ***/ - if (system_hw) - { - state[0] = m->arrows[0]->state; - state[1] = m->arrows[1]->state; - m->max_buttons = 0; - m->max_images = 0; - m->arrows[0]->state = 0; - m->arrows[1]->state = 0; - m->screenshot = 255; - strcpy(m->title,""); - GUI_OptionBox2(m,"X Offset","Y Offset",&config.xshift,&config.yshift,1,-99,99); - m->max_buttons = 4; - m->max_images = 6; - m->arrows[0]->state = state[0]; - m->arrows[1]->state = state[1]; - m->screenshot = 0; - strcpy(m->title,"Video Settings"); - sprintf (items[VI_OFFSET+4].text, "Screen Position: (%s%02d,%s%02d)", - (config.xshift < 0) ? "":"+", config.xshift, - (config.yshift < 0) ? "":"+", config.yshift); - } - else - { - GUI_WaitPrompt("Error","Please load a game first !\n"); - } - break; - - case VI_OFFSET+5: /*** screen scaling ***/ - if (system_hw) - { - state[0] = m->arrows[0]->state; - state[1] = m->arrows[1]->state; - m->max_buttons = 0; - m->max_images = 0; - m->arrows[0]->state = 0; - m->arrows[1]->state = 0; - m->screenshot = 255; - strcpy(m->title,""); - GUI_OptionBox2(m,"X Scale","Y Scale",&config.xscale,&config.yscale,1,-99,99); - m->max_buttons = 4; - m->max_images = 6; - m->arrows[0]->state = state[0]; - m->arrows[1]->state = state[1]; - m->screenshot = 0; - strcpy(m->title,"Video Settings"); - sprintf (items[VI_OFFSET+5].text, "Screen Scaling: (%s%02d,%s%02d)", - (config.xscale < 0) ? "":"+", config.xscale, - (config.yscale < 0) ? "":"+", config.yscale); - } - else - { - GUI_WaitPrompt("Error","Please load a game first !\n"); - } - break; - - case -1: - quit = 1; - break; - } - } - - if (reinit && system_hw) - { - /* framerate might have changed, reinitialize audio timings */ - audio_init(snd.sample_rate, get_framerate()); - } - - GUI_DeleteMenu(m); -} - -/**************************************************************************** - * Controllers Settings menu - ****************************************************************************/ -static int player = 0; -static void ctrlmenu_cb(void) -{ - int i, cnt = 1; - char msg[16]; - gui_menu *m = &menu_ctrls; - - if (m->bg_images[7].state & IMAGE_VISIBLE) - { - /* draw device port number */ - if (config.input[player].device != -1) - { - sprintf(msg,"%d",config.input[player].port + 1); - if (m->selected == 11) - FONT_write(msg,16,m->items[11].x+m->items[11].w+2,m->items[11].y+m->items[11].h+2,640,(GXColor)DARK_GREY); - else - FONT_write(msg,14,m->items[11].x+m->items[11].w,m->items[11].y+m->items[11].h,640,(GXColor)DARK_GREY); - } - } - - /* draw players index */ - for (i=2; iselected == i) - { - FONT_writeCenter("Player", 16, m->buttons[i].x + 2, m->buttons[i].x + 54, m->buttons[i].y + (m->buttons[i].h - 16)/2 + 16, (GXColor)DARK_GREY); - } - else - { - FONT_writeCenter("Player", 14, m->buttons[i].x + 4, m->buttons[i].x + 54, m->buttons[i].y + (m->buttons[i].h - 14)/2 + 14, (GXColor)DARK_GREY); - } - - if (input.dev[i-2] != NO_DEVICE) - { - sprintf(msg,"%d",cnt++); - if (m->selected == i) - { - FONT_writeCenter(msg,18,m->items[i].x+2,m->items[i].x+m->items[i].w+2,m->buttons[i].y+(m->buttons[i].h-18)/2+18,(GXColor)DARK_GREY); - } - else - { - FONT_writeCenter(msg,16,m->items[i].x,m->items[i].x+m->items[i].w,m->buttons[i].y+(m->buttons[i].h - 16)/2+16,(GXColor)DARK_GREY); - } - } - } -} - -/* Set menu elements depending on current system configuration */ -static void ctrlmenu_raz(void) -{ - int i,max = 0; - gui_menu *m = &menu_ctrls; - - /* update players buttons */ - for (i=0; ibuttons[i+2].data = &button_player_none_data; - m->buttons[i+2].state &= ~BUTTON_ACTIVE; - strcpy(m->items[i+2].comment,""); - } - else - { - m->buttons[i+2].data = &button_player_data; - m->buttons[i+2].state |= BUTTON_ACTIVE; - if ((cart.special & HW_J_CART) && (i > 4)) - sprintf(m->items[i+2].comment,"Configure Player %d (J-CART) settings", max + 1); - else - sprintf(m->items[i+2].comment,"Configure Player %d settings", max + 1); - max++; - } - } - - /* update buttons navigation */ - if (input.dev[0] != NO_DEVICE) - m->buttons[0].shift[3] = 2; - else if (input.dev[4] != NO_DEVICE) - m->buttons[0].shift[3] = 6; - else if (input.dev[5] != NO_DEVICE) - m->buttons[0].shift[3] = 7; - else - m->buttons[0].shift[3] = 0; - if (input.dev[4] != NO_DEVICE) - m->buttons[1].shift[3] = 5; - else if (input.dev[5] != NO_DEVICE) - m->buttons[1].shift[3] = 6; - else if (input.dev[0] != NO_DEVICE) - m->buttons[1].shift[3] = 1; - else - m->buttons[1].shift[3] = 0; - - if (input.dev[1] != NO_DEVICE) - m->buttons[2].shift[1] = 1; - else if (input.dev[4] != NO_DEVICE) - m->buttons[2].shift[1] = 4; - else if (input.dev[5] != NO_DEVICE) - m->buttons[2].shift[1] = 5; - else - m->buttons[2].shift[1] = 0; - - if (input.dev[4] != NO_DEVICE) - m->buttons[5].shift[1] = 1; - else if (input.dev[5] != NO_DEVICE) - m->buttons[5].shift[1] = 2; - else - m->buttons[5].shift[1] = 0; - - if (input.dev[3] != NO_DEVICE) - m->buttons[6].shift[0] = 1; - else if (input.dev[0] != NO_DEVICE) - m->buttons[6].shift[0] = 4; - else - m->buttons[6].shift[0] = 0; - - if (input.dev[5] != NO_DEVICE) - m->buttons[6].shift[1] = 1; - else - m->buttons[6].shift[1] = 0; - - if (input.dev[6] != NO_DEVICE) - m->buttons[7].shift[1] = 1; - else - m->buttons[7].shift[1] = 0; - - if (input.dev[7] != NO_DEVICE) - m->buttons[8].shift[1] = 1; - else - m->buttons[8].shift[1] = 0; - - if (input.dev[4] != NO_DEVICE) - m->buttons[7].shift[0] = 1; - else if (input.dev[3] != NO_DEVICE) - m->buttons[7].shift[0] = 2; - else if (input.dev[0] != NO_DEVICE) - m->buttons[7].shift[0] = 5; - else - m->buttons[7].shift[0] = 0; -} - -static void ctrlmenu(void) -{ - int old_player = -1; - int i = 0; - int update = 0; - gui_item *items = NULL; - u8 *special = NULL; - u32 exp; - u8 type = 0; - - /* System devices */ - gui_item items_sys[2][13] = - { - { - {NULL,Ctrl_none_png ,"","Select Port 1 device",110,130,48,72}, - {NULL,Ctrl_gamepad_md_png ,"","Select Port 1 device", 85,117,96,84}, - {NULL,Ctrl_mouse_png ,"","Select Port 1 device", 97,113,64,88}, - {NULL,Ctrl_menacer_png ,"","Select Port 1 device", 94,113,80,88}, - {NULL,Ctrl_justifiers_png ,"","Select Port 1 device", 88,117,80,84}, - {NULL,Ctrl_xe_a1p_png ,"","Select Port 1 device", 98,118,72,84}, - {NULL,Ctrl_activator_png ,"","Select Port 1 device", 94,121,72,80}, - {NULL,Ctrl_gamepad_ms_png ,"","Select Port 1 device", 91,125,84,76}, - {NULL,Ctrl_lightphaser_png,"","Select Port 1 device", 89,109,88,92}, - {NULL,Ctrl_paddle_png ,"","Select Port 1 device", 86,117,96,84}, - {NULL,Ctrl_sportspad_png ,"","Select Port 1 device", 95,117,76,84}, - {NULL,Ctrl_teamplayer_png ,"","Select Port 1 device", 94,109,80,92}, - {NULL,Ctrl_4wayplay_png ,"","Select Port 1 device", 98,110,72,92} - }, - { - {NULL,Ctrl_none_png ,"","Select Port 2 device",110,300,48,72}, - {NULL,Ctrl_gamepad_md_png ,"","Select Port 2 device", 85,287,96,84}, - {NULL,Ctrl_mouse_png ,"","Select Port 2 device", 97,283,64,88}, - {NULL,Ctrl_menacer_png ,"","Select Port 2 device", 94,283,80,88}, - {NULL,Ctrl_justifiers_png ,"","Select Port 2 device", 88,287,80,84}, - {NULL,Ctrl_xe_a1p_png ,"","Select Port 2 device", 98,288,72,84}, - {NULL,Ctrl_activator_png ,"","Select Port 2 device", 94,291,72,80}, - {NULL,Ctrl_gamepad_ms_png ,"","Select Port 2 device", 91,295,84,76}, - {NULL,Ctrl_lightphaser_png,"","Select Port 2 device", 89,279,88,92}, - {NULL,Ctrl_paddle_png ,"","Select Port 2 device", 86,287,96,84}, - {NULL,Ctrl_sportspad_png ,"","Select Port 2 device", 95,287,76,84}, - {NULL,Ctrl_teamplayer_png ,"","Select Port 2 device", 94,279,80,92}, - {NULL,Ctrl_4wayplay_png ,"","Select Port 2 device", 98,280,72,92} - } - }; - - /* Specific controller options */ - gui_item items_special[4][2] = - { - { - /* Gamepad option */ - {NULL,Ctrl_pad3b_png,"Pad\nType","Use 3-buttons Pad",528,180,44,28}, - {NULL,Ctrl_pad6b_png,"Pad\nType","Use 6-buttons Pad",528,180,44,28} - }, - { - /* Mouse option */ - {NULL,ctrl_option_off_png,"Invert\nMouse","Enable/Disable Y-Axis inversion",534,180,24,24}, - {NULL,ctrl_option_on_png ,"Invert\nMouse","Enable/Disable Y-Axis inversion",534,180,24,24}, - }, - { - /* Gun option */ - {NULL,ctrl_option_off_png,"Show\nCursor","Enable/Disable Lightgun cursor",534,180,24,24}, - {NULL,ctrl_option_on_png ,"Show\nCursor","Enable/Disable Lightgun cursor",534,180,24,24}, - }, - { - /* no option */ - {NULL,NULL,"No Option","",436,180,160,52}, - {NULL,NULL,"","",0,0,0,0}, - } - }; - - /* Player Configuration device items */ -#ifdef HW_RVL - gui_item items_device[5] = - { - {NULL,ctrl_option_off_png ,"Input\nDevice","Select Input Controller",534,244,24,24}, - {NULL,ctrl_gamecube_png ,"Input\nDevice","Select Input Controller",530,246,36,24}, - {NULL,ctrl_wiimote_png ,"Input\nDevice","Select Input Controller",526,250,40,12}, - {NULL,ctrl_nunchuk_png ,"Input\nDevice","Select Input Controller",532,242,32,32}, - {NULL,ctrl_classic_png ,"Input\nDevice","Select Input Controller",526,242,40,32}, - }; -#else - gui_item items_device[2] = - { - {NULL,ctrl_option_off_png ,"Input\nDevice","Select Input Controller",534,244,24,24}, - {NULL,ctrl_gamecube_png ,"Input\nDevice","Select Input Controller",530,246,36,24} - }; -#endif - - /* initialize menu */ - gui_menu *m = &menu_ctrls; - GUI_InitMenu(m); - - /* initialize custom buttons */ - button_player_data.texture[0] = gxTextureOpenPNG(button_player_data.image[0],0); - button_player_data.texture[1] = gxTextureOpenPNG(button_player_data.image[1],0); - button_player_none_data.texture[0] = gxTextureOpenPNG(button_player_none_data.image[0],0); - - /* initialize custom images */ - for (i=0; i<13; i++) - { - items_sys[1][i].texture = items_sys[0][i].texture = gxTextureOpenPNG(items_sys[0][i].data,0); - } - items_special[0][0].texture = gxTextureOpenPNG(items_special[0][0].data,0); - items_special[0][1].texture = gxTextureOpenPNG(items_special[0][1].data,0); - items_special[2][0].texture = items_special[1][0].texture = gxTextureOpenPNG(items_special[1][0].data,0); - items_special[2][1].texture = items_special[1][1].texture = gxTextureOpenPNG(items_special[1][1].data,0); - items_device[0].texture = items_special[1][0].texture; - items_device[1].texture = gxTextureOpenPNG(items_device[1].data,0); -#ifdef HW_RVL - items_device[2].texture = gxTextureOpenPNG(items_device[2].data,0); - items_device[3].texture = gxTextureOpenPNG(items_device[3].data,0); - items_device[4].texture = gxTextureOpenPNG(items_device[4].data,0); -#endif - - /* restore current menu elements */ - player = 0; - ctrlmenu_raz(); - memcpy(&m->items[0],&items_sys[0][input.system[0]],sizeof(gui_item)); - memcpy(&m->items[1],&items_sys[1][input.system[1]],sizeof(gui_item)); - - /* menu title slide effect */ - m->selected = 0; - GUI_SlideMenuTitle(m,strlen("Controller ")); - - while (update != -1) - { - /* draw menu */ - GUI_DrawMenu(m); - - /* update menu */ - update = GUI_UpdateMenu(m); - - if (update > 0) - { - switch (m->selected) - { - case 0: /* update port 1 system */ - { - /* fixed configurations */ - if (system_hw) - { - if (cart.special & HW_TEREBI_OEKAKI) - { - GUI_WaitPrompt("Error","Terebi Oekaki detected !"); - break; - } - else if (system_hw == SYSTEM_PICO) - { - GUI_WaitPrompt("Error","PICO hardware detected !"); - break; - } - } - - /* next connected device */ - input.system[0]++; - - /* allow only one connected mouse */ - if ((input.system[0] == SYSTEM_MOUSE) && (input.system[1] == SYSTEM_MOUSE)) - { - input.system[0] += 3; - } - - /* Menacer & Justifiers on Port B only */ - if (input.system[0] == SYSTEM_MENACER) - { - input.system[0] += 2; - } - - /* allow only one gun type */ - if ((input.system[0] == SYSTEM_LIGHTPHASER) && ((input.system[1] == SYSTEM_MENACER) || (input.system[1] == SYSTEM_JUSTIFIER))) - { - input.system[0]++; - } - - /* 4-wayplay uses both ports */ - if (input.system[0] == SYSTEM_WAYPLAY) - { - input.system[1] = SYSTEM_WAYPLAY; - } - - /* loop back */ - if (input.system[0] > SYSTEM_WAYPLAY) - { - input.system[0] = NO_SYSTEM; - input.system[1] = SYSTEM_MD_GAMEPAD; - } - - /* reset I/O ports */ - io_init(); - input_reset(); - - /* save current configuration */ - old_system[0] = input.system[0]; - old_system[1] = input.system[1]; - - /* update menu elements */ - ctrlmenu_raz(); - memcpy(&m->items[0],&items_sys[0][input.system[0]],sizeof(gui_item)); - memcpy(&m->items[1],&items_sys[1][input.system[1]],sizeof(gui_item)); - - if (m->bg_images[7].state & IMAGE_VISIBLE) - { - /* slide out configuration window */ - GUI_DrawMenuFX(m, 20, 1); - - /* remove configuration window */ - m->bg_images[7].state &= ~IMAGE_VISIBLE; - - /* disable configuration buttons */ - m->buttons[10].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); - m->buttons[11].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); - m->buttons[12].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); - - /* update directions */ - m->buttons[2].shift[3] = 0; - m->buttons[3].shift[3] = 0; - m->buttons[4].shift[3] = 0; - m->buttons[5].shift[3] = 0; - m->buttons[6].shift[3] = 0; - m->buttons[7].shift[3] = 0; - m->buttons[8].shift[3] = 0; - m->buttons[9].shift[3] = 0; - - /* update title */ - sprintf(m->title,"Controller Settings"); - } - break; - } - - case 1: /* update port 2 system */ - { - /* fixed configurations */ - if (system_hw) - { - if (cart.special & HW_J_CART) - { - GUI_WaitPrompt("Error","J-CART detected !"); - break; - } - else if (cart.special & HW_TEREBI_OEKAKI) - { - GUI_WaitPrompt("Error","Terebi Oekaki detected !"); - break; - } - else if (system_hw == SYSTEM_PICO) - { - GUI_WaitPrompt("Error","PICO hardware detected !"); - break; - } - } - - /* next connected device */ - input.system[1]++; - - /* allow only one connected mouse */ - if ((input.system[0] == SYSTEM_MOUSE) && (input.system[1] == SYSTEM_MOUSE)) - { - input.system[1]++; - } - - /* allow only one gun type */ - if ((input.system[0] == SYSTEM_LIGHTPHASER) && (input.system[1] == SYSTEM_MENACER)) - { - input.system[1] += 3; - } - - /* allow only one gun type */ - if ((input.system[0] == SYSTEM_LIGHTPHASER) && (input.system[1] == SYSTEM_JUSTIFIER)) - { - input.system[1] += 2; - } - - /* 4-wayplay uses both ports */ - if (input.system[1] == SYSTEM_WAYPLAY) - { - input.system[0] = SYSTEM_WAYPLAY; - } - - /* loop back */ - if (input.system[1] > SYSTEM_WAYPLAY) - { - input.system[1] = NO_SYSTEM; - input.system[0] = SYSTEM_MD_GAMEPAD; - } - - /* reset I/O ports */ - io_init(); - input_reset(); - - /* save current configuration */ - old_system[0] = input.system[0]; - old_system[1] = input.system[1]; - - /* update menu elements */ - ctrlmenu_raz(); - memcpy(&m->items[0],&items_sys[0][input.system[0]],sizeof(gui_item)); - memcpy(&m->items[1],&items_sys[1][input.system[1]],sizeof(gui_item)); - - if (m->bg_images[7].state & IMAGE_VISIBLE) - { - /* slide out configuration window */ - GUI_DrawMenuFX(m, 20, 1); - - /* remove configuration window */ - m->bg_images[7].state &= ~IMAGE_VISIBLE; - - /* disable configuration buttons */ - m->buttons[10].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); - m->buttons[11].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); - m->buttons[12].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); - - /* update directions */ - m->buttons[2].shift[3] = 0; - m->buttons[3].shift[3] = 0; - m->buttons[4].shift[3] = 0; - m->buttons[5].shift[3] = 0; - m->buttons[6].shift[3] = 0; - m->buttons[7].shift[3] = 0; - m->buttons[8].shift[3] = 0; - m->buttons[9].shift[3] = 0; - - /* update title */ - sprintf(m->title,"Controller Settings"); - } - - break; - } - - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - { - /* remove duplicate assigned inputs */ - for (i=0; iselected-2); i++) - { - if (input.dev[i] != NO_DEVICE) player ++; - } - - if (m->bg_images[7].state & IMAGE_VISIBLE) - { - /* if already displayed, do nothing */ - if (old_player == player) break; - - /* slide out configuration window */ - GUI_DrawMenuFX(m, 20, 1); - } - else - { - /* append configuration window */ - m->bg_images[7].state |= IMAGE_VISIBLE; - - /* enable configuration buttons */ - m->buttons[10].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); - m->buttons[11].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); - m->buttons[12].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); - - /* update directions */ - m->buttons[2].shift[3] = 8; - m->buttons[3].shift[3] = 7; - m->buttons[4].shift[3] = 6; - m->buttons[5].shift[3] = 5; - m->buttons[6].shift[3] = 4; - m->buttons[7].shift[3] = 3; - m->buttons[8].shift[3] = 2; - m->buttons[9].shift[3] = 1; - } - - /* emulated device type */ - type = input.dev[m->selected - 2]; - - /* retrieve current player informations */ - switch (type) - { - case DEVICE_PAD3B: - case DEVICE_PAD6B: - { - items = items_special[0]; - special = &config.input[player].padtype; - break; - } - - case DEVICE_MOUSE: - { - items = items_special[1]; - special = &config.invert_mouse; - break; - } - - case DEVICE_LIGHTGUN: - { - items = items_special[2]; - - if ((input.system[1] == SYSTEM_MENACER) || (input.system[1] == SYSTEM_JUSTIFIER)) - { - /* Menacer & Justifiers affected to devices 4 & 5 */ - special = &config.gun_cursor[m->selected & 1]; - } - else - { - /* Lightphasers affected to devices 0 & 4 */ - special = &config.gun_cursor[m->selected >> 2]; - } - break; - } - - default: - { - items = items_special[3]; - special = NULL; - break; - } - } - - if (special) - { - memcpy(&m->items[10],&items[*special],sizeof(gui_item)); - } - else - { - memcpy(&m->items[10],&items[0],sizeof(gui_item)); - } - - memcpy(&m->items[11],&items_device[config.input[player].device + 1],sizeof(gui_item)); - - /* slide in configuration window */ - m->buttons[10].shift[2] = 10 - m->selected; - m->buttons[11].shift[2] = 11 - m->selected; - m->buttons[12].shift[2] = 12 - m->selected; - m->selected = 10; - GUI_DrawMenuFX(m, 20, 0); - - /* some devices require analog sticks */ - if ((type == DEVICE_XE_A1P) && ((config.input[player].device == -1) || (config.input[player].device == 1))) - { - GUI_WaitPrompt("Warning","One Analog Stick required !"); - } - else if ((type == DEVICE_ACTIVATOR) && ((config.input[player].device != 0) && (config.input[player].device != 3))) - { - GUI_WaitPrompt("Warning","Two Analog Sticks required !"); - } - - /* update title */ - if ((cart.special & HW_J_CART) && (player > 1)) - { - sprintf(m->title,"Controller Settings (Player %d) (J-CART)",player+1); - } - else - { - sprintf(m->title,"Controller Settings (Player %d)",player+1); - } - break; - } - - case 10: /* specific option */ - { - if (special) - { - /* switch option */ - *special ^= 1; - - /* specific case: controller type */ - if (type < 2) - { - /* re-initialize emulated device */ - input_init(); - input_reset(); - - /* update emulated device type */ - type = *special; - } - - /* update menu items */ - memcpy(&m->items[10],&items[*special],sizeof(gui_item)); - } - break; - } - - case 11: /* input controller selection */ - { - /* no input device */ - if (config.input[player].device < 0) - { - /* always try gamecube controllers first */ - config.input[player].device = 0; - config.input[player].port = 0; - } - else - { - /* try next port */ - config.input[player].port ++; - } - - /* autodetect connected gamecube controllers */ - if (config.input[player].device == 0) - { - /* find first connected controller */ - exp = 0; - while ((config.input[player].port < 4) && !exp) - { - VIDEO_WaitVSync (); - exp = PAD_ScanPads() & (1<= 4) - { -#ifdef HW_RVL - /* test wiimote */ - config.input[player].port = 0; - config.input[player].device = 1; -#else - /* no input controller left */ - config.input[player].device = -1; - config.input[player].port = player%4; -#endif - } - } - -#ifdef HW_RVL - /* autodetect connected wiimotes (without nunchuk) */ - if (config.input[player].device == 1) - { - /* test current port */ - exp = 255; - if (config.input[player].port < 4) - { - WPAD_Probe(config.input[player].port,&exp); - } - - /* find first connected controller */ - while ((config.input[player].port < 4) && (exp == 255)) - { - /* try next port */ - config.input[player].port ++; - if (config.input[player].port < 4) - { - exp = 255; - WPAD_Probe(config.input[player].port,&exp); - } - } - - /* no more wiimote */ - if (config.input[player].port >= 4) - { - /* test wiimote+nunchuk */ - config.input[player].port = 0; - config.input[player].device = 2; - } - } - - /* autodetect connected wiimote+nunchuk */ - if (config.input[player].device == 2) - { - /* test current port */ - exp = 255; - if (config.input[player].port < 4) - { - WPAD_Probe(config.input[player].port,&exp); - } - - /* find first connected controller */ - while ((config.input[player].port < 4) && (exp != WPAD_EXP_NUNCHUK)) - { - /* try next port */ - config.input[player].port ++; - if (config.input[player].port < 4) - { - exp = 255; - WPAD_Probe(config.input[player].port,&exp); - } - } - - /* no more wiimote+nunchuk */ - if (config.input[player].port >= 4) - { - /* test classic controllers */ - config.input[player].port = 0; - config.input[player].device = 3; - } - } - - /* autodetect connected classic controllers */ - if (config.input[player].device == 3) - { - /* test current port */ - exp = 255; - if (config.input[player].port < 4) - { - WPAD_Probe(config.input[player].port,&exp); - } - - /* find first connected controller */ - while ((config.input[player].port<4) && (exp != WPAD_EXP_CLASSIC)) - { - /* try next port */ - config.input[player].port ++; - if (config.input[player].port < 4) - { - exp = 255; - WPAD_Probe(config.input[player].port,&exp); - } - } - - if (config.input[player].port >= 4) - { - /* no input controller left */ - config.input[player].device = -1; - config.input[player].port = player%4; - } - } -#endif - - /* update menu items */ - memcpy(&m->items[11],&items_device[config.input[player].device + 1],sizeof(gui_item)); - - break; - } - - case 12: /* Controller Keys Configuration */ - { - if (config.input[player].device >= 0) - { - GUI_MsgBoxOpen("Keys Configuration", "",0); - gx_input_Config(config.input[player].port, config.input[player].device, type); - GUI_MsgBoxClose(); - } - break; - } - } - } - - /* Close Window */ - else if (update < 0) - { - if (m->bg_images[7].state & IMAGE_VISIBLE) - { - /* slide out configuration window */ - GUI_DrawMenuFX(m, 20, 1); - - /* disable configuration window */ - m->bg_images[7].state &= ~IMAGE_VISIBLE; - - /* disable configuration buttons */ - m->buttons[10].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); - m->buttons[11].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); - m->buttons[12].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); - - /* clear directions */ - m->buttons[2].shift[3] = 0; - m->buttons[3].shift[3] = 0; - m->buttons[4].shift[3] = 0; - m->buttons[5].shift[3] = 0; - m->buttons[6].shift[3] = 0; - m->buttons[7].shift[3] = 0; - m->buttons[8].shift[3] = 0; - m->buttons[9].shift[3] = 0; - - /* update selector */ - m->selected -= m->buttons[m->selected].shift[2]; - - /* restore title */ - sprintf(m->title,"Controller Settings"); - - /* stay in menu */ - update = 0; - } - else - { - /* check we have at least one connected input before leaving */ - old_player = player; - player = 0; - for (i=0; ibg_images[7].state &= ~IMAGE_VISIBLE; - - /* disable configuration buttons */ - m->buttons[10].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); - m->buttons[11].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); - m->buttons[12].state &= (~BUTTON_VISIBLE & ~BUTTON_ACTIVE); - - /* clear directions */ - m->buttons[2].shift[3] = 0; - m->buttons[3].shift[3] = 0; - m->buttons[4].shift[3] = 0; - m->buttons[5].shift[3] = 0; - m->buttons[6].shift[3] = 0; - m->buttons[7].shift[3] = 0; - m->buttons[8].shift[3] = 0; - m->buttons[9].shift[3] = 0; - - /* clear menu items */ - memset(&m->items[0],0,sizeof(gui_item)); - memset(&m->items[1],0,sizeof(gui_item)); - memset(&m->items[10],0,sizeof(gui_item)); - memset(&m->items[11],0,sizeof(gui_item)); - - /* clear player buttons */ - m->buttons[2].data = NULL; - m->buttons[3].data = NULL; - m->buttons[4].data = NULL; - m->buttons[5].data = NULL; - m->buttons[6].data = NULL; - m->buttons[7].data = NULL; - m->buttons[8].data = NULL; - m->buttons[9].data = NULL; - - /* delete menu */ - GUI_DeleteMenu(m); - - /* delete custom buttons */ - gxTextureClose(&button_player_data.texture[0]); - gxTextureClose(&button_player_data.texture[1]); - gxTextureClose(&button_player_none_data.texture[0]); - - /* delete custom images */ - for (i=0; i<13; i++) - { - gxTextureClose(&items_sys[0][i].texture); - } - gxTextureClose(&items_special[0][0].texture); - gxTextureClose(&items_special[0][1].texture); - gxTextureClose(&items_special[1][0].texture); - gxTextureClose(&items_special[1][1].texture); - gxTextureClose(&items_device[1].texture); -#ifdef HW_RVL - gxTextureClose(&items_device[2].texture); - gxTextureClose(&items_device[3].texture); - gxTextureClose(&items_device[4].texture); -#endif -} - -/**************************************************************************** - * Main Option menu - * - ****************************************************************************/ -static void optionmenu(void) -{ - int ret, quit = 0; - gui_menu *m = &menu_options; - - GUI_InitMenu(m); - GUI_DrawMenuFX(m,30,0); - - while (quit == 0) - { - ret = GUI_RunMenu(m); - - switch (ret) - { - case 0: - GUI_DeleteMenu(m); - systemmenu(); - GUI_InitMenu(m); - break; - case 1: - GUI_DeleteMenu(m); - videomenu(); - GUI_InitMenu(m); - break; - case 2: - GUI_DeleteMenu(m); - soundmenu(); - GUI_InitMenu(m); - break; - case 3: - GUI_DeleteMenu(m); - ctrlmenu(); - GUI_InitMenu(m); - break; - case 4: - GUI_DeleteMenu(m); - prefmenu(); - GUI_InitMenu(m); - break; - case -1: - quit = 1; - break; - } - } - - config_save(); - GUI_DrawMenuFX(m,30,1); - GUI_DeleteMenu(m); -} - -/**************************************************************************** -* Save Manager menu -* -****************************************************************************/ -static t_slot slots[5]; -static void savemenu_cb(void) -{ - int i; - char msg[16]; - gx_texture *star = gxTextureOpenPNG(Star_full_png,0); - - if (sram.on) - { - FONT_write("Backup Memory",16,buttons_saves[0].x+16,buttons_saves[0].y+(buttons_saves[0].h-16)/2+16,buttons_saves[0].x+buttons_saves[0].w,(GXColor)DARK_GREY); - if (slots[0].valid) - { - sprintf(msg,"%d/%02d/%02d",slots[0].day,slots[0].month,slots[0].year); - FONT_alignRight(msg,12,buttons_saves[0].x+buttons_saves[0].w-16,buttons_saves[0].y+(buttons_saves[0].h-28)/2+12,(GXColor)DARK_GREY); - sprintf(msg,"%02d:%02d",slots[0].hour,slots[0].min); - FONT_alignRight(msg,12,buttons_saves[0].x+buttons_saves[0].w-16,buttons_saves[0].y+(buttons_saves[0].h-28)/2+28,(GXColor)DARK_GREY); - } - - if (sram.crc != crc32(0, &sram.sram[0], 0x10000)) - gxDrawTexture(star,22,buttons_saves[0].y+(buttons_saves[0].h-star->height)/2,star->width,star->height,255); - } - else - { - FONT_writeCenter("Backup Memory disabled",16,buttons_saves[0].x,buttons_saves[0].x+buttons_saves[0].w,buttons_saves[0].y+(buttons_saves[0].h-16)/2+16,(GXColor)DARK_GREY); - } - - for (i=1; i<5; i++) - { - if (slots[i].valid) - { - sprintf(msg,"Slot %d",i); - FONT_write(msg,16,buttons_saves[i].x+16,buttons_saves[i].y+(buttons_saves[i].h-16)/2+16,buttons_saves[i].x+buttons_saves[i].w,(GXColor)DARK_GREY); - sprintf(msg,"%d/%02d/%02d",slots[i].day,slots[i].month,slots[i].year); - FONT_alignRight(msg,12,buttons_saves[i].x+buttons_saves[i].w-16,buttons_saves[i].y+(buttons_saves[i].h-28)/2+12,(GXColor)DARK_GREY); - sprintf(msg,"%02d:%02d",slots[i].hour,slots[i].min); - FONT_alignRight(msg,12,buttons_saves[i].x+buttons_saves[i].w-16,buttons_saves[i].y+(buttons_saves[i].h-28)/2+28,(GXColor)DARK_GREY); - } - else - { - FONT_write("Empty Slot",16,buttons_saves[i].x+16,buttons_saves[i].y+(buttons_saves[i].h-16)/2+16,buttons_saves[i].x+buttons_saves[i].h,(GXColor)DARK_GREY); - } - - if (i == config.s_default) - gxDrawTexture(star,22,buttons_saves[i].y+(buttons_saves[i].h-star->height)/2,star->width,star->height,255); - } - gxTextureClose(&star); -} - -static int savemenu(void) -{ - int i, update = 0; - int ret = 0; - int slot = -1; - char filename[MAXPATHLEN]; - gui_menu *m = &menu_saves; - FILE *snap; - - GUI_InitMenu(m); - GUI_DrawMenuFX(m,30,0); - - m->bg_images[3].state &= ~IMAGE_SLIDE_TOP; - m->bg_images[4].state &= ~IMAGE_SLIDE_BOTTOM; - m->bg_images[5].state &= ~IMAGE_SLIDE_TOP; - - /* detect existing files */ - for (i=0; i<5; i++) - slot_autodetect(i, config.s_device, &slots[i]); - - /* SRAM disabled */ - if (sram.on) - { - m->buttons[0].state |= BUTTON_ACTIVE; - m->buttons[1].shift[0] = 1; - } - else - { - m->buttons[0].state &= ~BUTTON_ACTIVE; - m->buttons[1].shift[0] = 0; - if (m->selected == 0) - m->selected = 1; - } - - while (update != -1) - { - /* slot selection */ - if ((m->selected < 5) && (slot != m->selected)) - { - /* update slot */ - slot = m->selected; - - /* delete previous texture if any */ - gxTextureClose(&bg_saves[0].texture); - bg_saves[0].state &= ~IMAGE_VISIBLE; - bg_saves[1].state |= IMAGE_VISIBLE; - - /* state slot */ - if (!config.s_device && slot && slots[slot].valid) - { - /* open screenshot file */ - sprintf (filename, "%s/saves/%s__%d.png", DEFAULT_PATH, rom_filename, slot - 1); - snap = fopen(filename, "rb"); - if (snap) - { - /* load texture from file */ - bg_saves[0].texture = gxTextureOpenPNG(0,snap); - if (bg_saves[0].texture) - { - /* set menu background */ - bg_saves[0].w = bg_saves[0].texture->width * 2; - if (config.aspect & 2) bg_saves[0].w = (bg_saves[0].w * 3) / 4; - bg_saves[0].h = bg_saves[0].texture->height * 2; - bg_saves[0].x = (vmode->fbWidth - bg_saves[0].w) / 2; - bg_saves[0].y = (vmode->efbHeight - bg_saves[0].h) / 2; - bg_saves[0].state |= IMAGE_VISIBLE; - bg_saves[1].state &= ~IMAGE_VISIBLE; - } - fclose(snap); - } - } - } - - /* draw menu */ - GUI_DrawMenu(m); - - /* update menu */ - update = GUI_UpdateMenu(m); - - if (update > 0) - { - switch (m->selected) - { - case 0: - case 1: - case 2: - case 3: - case 4: /* Slot selection */ - { - /* enable right window */ - m->bg_images[7].state |= IMAGE_VISIBLE; - m->buttons[5].state |= BUTTON_VISIBLE; - m->buttons[6].state |= BUTTON_VISIBLE; - m->buttons[7].state |= BUTTON_VISIBLE; - m->buttons[8].state |= BUTTON_VISIBLE; - - /* only enable valid options */ - if (slots[slot].valid) - { - m->buttons[5].state |= BUTTON_ACTIVE; - m->buttons[7].state |= BUTTON_ACTIVE; - m->buttons[6].shift[0] = 1; - m->buttons[6].shift[1] = 1; - m->buttons[8].shift[0] = 1; - m->selected = 5; - } - else - { - m->buttons[5].state &= ~BUTTON_ACTIVE; - m->buttons[7].state &= ~BUTTON_ACTIVE; - m->buttons[6].shift[0] = 0; - m->buttons[6].shift[1] = 2; - m->buttons[8].shift[0] = (slot > 0) ? 2 : 0; - m->selected = 8; - } - - /* state slot 'only' button */ - if (slot > 0) - { - m->buttons[6].state |= BUTTON_ACTIVE; - m->buttons[5].shift[1] = 1; - m->buttons[7].shift[0] = 1; - } - else - { - m->buttons[6].state &= ~BUTTON_ACTIVE; - m->buttons[5].shift[1] = 2; - m->buttons[7].shift[0] = 2; - } - - /* disable left buttons */ - m->buttons[0].state &= ~BUTTON_ACTIVE; - m->buttons[1].state &= ~BUTTON_ACTIVE; - m->buttons[2].state &= ~BUTTON_ACTIVE; - m->buttons[3].state &= ~BUTTON_ACTIVE; - m->buttons[4].state &= ~BUTTON_ACTIVE; - - /* keep current selection highlighted */ - m->buttons[slot].state |= BUTTON_SELECTED; - - /* slide in window */ - GUI_DrawMenuFX(m, 20, 0); - - break; - } - - case 5: /* load file */ - { - if (slots[slot].valid) - { - ret = slot_load(slot,config.s_device); - - /* force exit */ - if (ret > 0) - { - GUI_DrawMenuFX(m, 20, 1); - m->buttons[slot].state &= ~BUTTON_SELECTED; - m->bg_images[7].state &= ~IMAGE_VISIBLE; - if (sram.on) - m->buttons[0].state |= BUTTON_ACTIVE; - m->buttons[1].state |= BUTTON_ACTIVE; - m->buttons[2].state |= BUTTON_ACTIVE; - m->buttons[3].state |= BUTTON_ACTIVE; - m->buttons[4].state |= BUTTON_ACTIVE; - m->buttons[5].state &= ~BUTTON_VISIBLE; - m->buttons[6].state &= ~BUTTON_VISIBLE; - m->buttons[7].state &= ~BUTTON_VISIBLE; - m->buttons[8].state &= ~BUTTON_VISIBLE; - m->selected = slot; - update = -1; - } - } - break; - } - - case 6: /* set default slot */ - { - config.s_default = slot; - config_save(); - break; - } - - case 7: /* delete file */ - { - if (slots[slot].valid) - { - if (slot_delete(slot,config.s_device) >= 0) - { - /* hide screenshot */ - gxTextureClose(&bg_saves[0].texture); - bg_saves[0].state &= ~IMAGE_VISIBLE; - slots[slot].valid = 0; - update = -1; - } - } - break; - } - - case 8: /* save file */ - { - ret = slot_save(slot,config.s_device); - - /* force exit */ - if (ret > 0) - { - GUI_DrawMenuFX(m, 20, 1); - m->buttons[slot].state &= ~BUTTON_SELECTED; - m->bg_images[7].state &= ~IMAGE_VISIBLE; - if (sram.on) - m->buttons[0].state |= BUTTON_ACTIVE; - m->buttons[1].state |= BUTTON_ACTIVE; - m->buttons[2].state |= BUTTON_ACTIVE; - m->buttons[3].state |= BUTTON_ACTIVE; - m->buttons[4].state |= BUTTON_ACTIVE; - m->buttons[5].state &= ~BUTTON_VISIBLE; - m->buttons[6].state &= ~BUTTON_VISIBLE; - m->buttons[7].state &= ~BUTTON_VISIBLE; - m->buttons[8].state &= ~BUTTON_VISIBLE; - m->selected = slot; - update = -1; - } - break; - } - - default: - break; - } - } - - if (update < 0) - { - /* close right window */ - if (m->bg_images[7].state & IMAGE_VISIBLE) - { - /* slide out window */ - GUI_DrawMenuFX(m, 20, 1); - - /* clear current selection */ - m->buttons[slot].state &= ~BUTTON_SELECTED; - - /* enable left buttons */ - if (sram.on) - m->buttons[0].state |= BUTTON_ACTIVE; - m->buttons[1].state |= BUTTON_ACTIVE; - m->buttons[2].state |= BUTTON_ACTIVE; - m->buttons[3].state |= BUTTON_ACTIVE; - m->buttons[4].state |= BUTTON_ACTIVE; - - /* disable right window */ - m->bg_images[7].state &= ~IMAGE_VISIBLE; - m->buttons[5].state &= ~BUTTON_VISIBLE; - m->buttons[6].state &= ~BUTTON_VISIBLE; - m->buttons[7].state &= ~BUTTON_VISIBLE; - m->buttons[8].state &= ~BUTTON_VISIBLE; - - /* stay in menu */ - m->selected = slot; - update = 0; - } - } - } - - /* leave menu */ - m->bg_images[3].state |= IMAGE_SLIDE_TOP; - m->bg_images[4].state |= IMAGE_SLIDE_BOTTOM; - m->bg_images[5].state |= IMAGE_SLIDE_TOP; - GUI_DrawMenuFX(m,30,1); - GUI_DeleteMenu(m); - return ret; -} - -/**************************************************************************** - * Load Game menu - * - ****************************************************************************/ -static int loadgamemenu () -{ - int ret, filetype; - gui_menu *m = &menu_load; - GUI_InitMenu(m); - GUI_DrawMenuFX(m,30,0); - - while (1) - { - ret = GUI_RunMenu(m); - - switch (ret) - { - /*** Button B ***/ - case -1: - GUI_DrawMenuFX(m,30,1); - GUI_DeleteMenu(m); - return 0; - - /*** Load from selected device */ - default: - { - /* ROM File type */ - filetype = ret - 1; - - /* Try to open current directory */ - if (ret > 0) - { - ret = OpenDirectory(config.l_device, filetype); - } - else - { - ret = OpenDirectory(TYPE_RECENT, filetype); - } - - if (ret) - { - GUI_DeleteMenu(m); - if (FileSelector(filetype)) - { - /* directly jump to game */ - return 1; - } - GUI_InitMenu(m); - } - break; - } - } - } - - return 0; -} - -/*************************************************************************** - * Show rom info screen - ***************************************************************************/ -static void showrominfo (void) -{ - char items[15][64]; - char msg[32]; - - /* fill ROM infos */ - sprintf (items[0], "Console Type: %s", rominfo.consoletype); - sprintf (items[1], "Copyright: %s", rominfo.copyright); - sprintf (items[2], "Company Name: %s", get_company()); - sprintf (items[3], "Domestic Name:"); - sprintf (items[4], "%s",rominfo.domestic); - sprintf (items[5], "International Name:"); - sprintf (items[6], "%s",rominfo.international); - sprintf (items[7], "Type: %s (%s)",rominfo.ROMType, strcmp(rominfo.ROMType, "AI") ? "Game" : "Educational"); - sprintf (items[8], "Product ID: %s", rominfo.product); - sprintf (items[9], "Checksum: %04x (%04x) (%s)", rominfo.checksum, rominfo.realchecksum, - (rominfo.checksum == rominfo.realchecksum) ? "GOOD" : "BAD"); - - sprintf (items[10], "Supports: "); - if (rominfo.peripherals & (1 << 1)) - { - strcat(items[10],get_peripheral(1)); - strcat(items[10],", "); - } - else if (rominfo.peripherals & (1 << 0)) - { - strcat(items[10],get_peripheral(0)); - strcat(items[10],", "); - } - if (rominfo.peripherals & (1 << 7)) - { - strcat(items[10],get_peripheral(7)); - strcat(items[10],", "); - } - if (rominfo.peripherals & (1 << 8)) - { - strcat(items[10],get_peripheral(8)); - strcat(items[10],", "); - } - if (rominfo.peripherals & (1 << 11)) - { - strcat(items[10],get_peripheral(11)); - strcat(items[10],", "); - } - if (rominfo.peripherals & (1 << 13)) - { - strcat(items[10],get_peripheral(13)); - strcat(items[10],", "); - } - if (strlen(items[10]) > 10) - items[10][strlen(items[10]) - 2] = 0; - - sprintf (items[11], "ROM end: $%06X", rominfo.romend); - - if (sram.custom) - sprintf (items[12], "Serial EEPROM"); - else if (sram.detected) - sprintf (items[12], "SRAM Start: $%06X", sram.start); - else - sprintf (items[12], "No Backup Memory specified"); - - if (sram.custom == 1) - sprintf (items[13], "Type: I2C (24Cxx)"); - else if (sram.custom == 2) - sprintf (items[13], "Type: SPI (25x512/95x512)"); - else if (sram.custom == 3) - sprintf (items[13], "Type: I2C (93C46)"); - else if (sram.detected) - sprintf (items[13], "SRAM End: $%06X", sram.end); - else if (sram.on) - sprintf (items[13], "SRAM enabled by default"); - else - sprintf (items[13], "SRAM disabled by default"); - - if (region_code == REGION_USA) - sprintf (items[14], "Region Code: %s (USA)", rominfo.country); - else if (region_code == REGION_EUROPE) - sprintf (items[14], "Region Code: %s (EUR)", rominfo.country); - else if (region_code == REGION_JAPAN_NTSC) - sprintf (items[14], "Region Code: %s (JPN)", rominfo.country); - else if (region_code == REGION_JAPAN_PAL) - sprintf (items[14], "Region Code: %s (JPN-PAL)", rominfo.country); - -#ifdef USE_BENCHMARK - /* ROM benchmark */ - if (!config.ntsc) - { - int frames = 0; - u64 start = gettime(); - do - { - system_frame(0); - audio_update(); - } - while (++frames < 300); - u64 end = gettime(); - sprintf(msg,"ROM Header Info (%d fps)", (300 * 1000000) / diff_usec(start,end)); - } - else -#endif - { - strcpy(msg,"ROM Header Info"); - } - - GUI_TextWindow(&menu_main, msg, items, 15, 15); -} - -/*************************************************************************** - * Show credits - ***************************************************************************/ -static void showcredits(void) -{ - int offset = 0; - - gx_texture *texture = gxTextureOpenPNG(Bg_credits_png,0); - s16 p = 0; - - while (!p) - { - gxClearScreen ((GXColor)BLACK); - if (texture) - gxDrawTexture(texture, (640-texture->width)/2, (480-texture->height)/2, texture->width, texture->height,255); - - FONT_writeCenter("Genesis Plus Core", 24, 0, 640, 480 - offset, (GXColor)LIGHT_BLUE); - FONT_writeCenter("improved emulation code, fixes & extra features by Eke-Eke", 18, 0, 640, 516 - offset, (GXColor)WHITE); - FONT_writeCenter("original 1.3 version by Charles MacDonald", 18, 0, 640, 534 - offset, (GXColor)WHITE); - FONT_writeCenter("original Z80 core by Juergen Buchmueller", 18, 0, 640, 552 - offset, (GXColor)WHITE); - FONT_writeCenter("original 68k core (Musashi) by Karl Stenerud", 18, 0, 640, 570 - offset, (GXColor)WHITE); - FONT_writeCenter("original YM2612/2413 cores by Jarek Burczynski, Tatsuyuki Satoh", 18, 0, 640, 588 - offset, (GXColor)WHITE); - FONT_writeCenter("original SN76489 core by Maxim", 18, 0, 640, 606 - offset, (GXColor)WHITE); - FONT_writeCenter("SVP core by Gravydas Ignotas (Notaz)", 18, 0, 640, 624 - offset, (GXColor)WHITE); - FONT_writeCenter("Blip Buffer Library & NTSC Video Filter by Shay Green (Blargg)", 18, 0, 640, 642 - offset, (GXColor)WHITE); - FONT_writeCenter("3-Band EQ implementation by Neil C", 18, 0, 640, 660 - offset, (GXColor)WHITE); - - FONT_writeCenter("Special thanks to ...", 20, 0, 640, 700 - offset, (GXColor)LIGHT_GREEN); - FONT_writeCenter("Nemesis, Tasco Deluxe, Bart Trzynadlowski, Jorge Cwik, Haze,", 18, 0, 640, 736 - offset, (GXColor)WHITE); - FONT_writeCenter("Stef Dallongeville, Notaz, AamirM, Steve Snake, Charles MacDonald", 18, 0, 640, 754 - offset, (GXColor)WHITE); - FONT_writeCenter("Spritesmind & SMS Power forums members for their technical help", 18, 0, 640, 772 - offset, (GXColor)WHITE); - - FONT_writeCenter("Gamecube & Wii port", 24, 0, 640, 830 - offset, (GXColor)LIGHT_BLUE); - FONT_writeCenter("porting code, GUI engine & design by Eke-Eke", 18, 0, 640, 866 - offset, (GXColor)WHITE); - FONT_writeCenter("original Gamecube port by Softdev, Honkeykong & Markcube", 18, 0, 640, 884 - offset, (GXColor)WHITE); - FONT_writeCenter("original icons, logo & button design by Low Lines", 18, 0, 640, 906 - offset, (GXColor)WHITE); - FONT_writeCenter("credit illustration by Orioto (Deviant Art)", 18, 0, 640, 924 - offset, (GXColor)WHITE); - FONT_writeCenter("memory card icon design by Brakken", 18, 0, 640, 942 - offset, (GXColor)WHITE); - FONT_writeCenter("libogc by Shagkur & various other contibutors", 18, 0, 640, 960 - offset, (GXColor)WHITE); - FONT_writeCenter("libfat by Chism", 18, 0, 640, 978 - offset, (GXColor)WHITE); - FONT_writeCenter("wiiuse by Michael Laforest (Para)", 18, 0, 640, 996 - offset, (GXColor)WHITE); - FONT_writeCenter("asndlib & OGG player by Francisco Muñoz (Hermes)", 18, 0, 640, 1014 - offset, (GXColor)WHITE); - FONT_writeCenter("zlib, libpng & libtremor by their respective authors", 18, 0, 640, 1032 - offset, (GXColor)WHITE); - FONT_writeCenter("devkitPPC by Wintermute", 18, 0, 640, 1050 - offset, (GXColor)WHITE); - - FONT_writeCenter("Special thanks to ...", 20, 0, 640, 1090 - offset, (GXColor)LIGHT_GREEN); - FONT_writeCenter("Softdev, Tmbinc, Costis, Emukiddid, Team Twiizer", 18, 0, 640, 1126 - offset, (GXColor)WHITE); - FONT_writeCenter("Brakken & former Tehskeen members for their support", 18, 0, 640, 1144 - offset, (GXColor)WHITE); - FONT_writeCenter("Anca, my wife, for her patience & various ideas", 18, 0, 640, 1162 - offset, (GXColor)WHITE); - - gxSetScreen(); - p = m_input.keys; - gxSetScreen(); - p |= m_input.keys; - offset ++; - if (offset > 1144) - offset = 0; - } - - gxTextureClose(&texture); -} - -static void exitmenu(void) -{ - char *items[3] = - { - "View Credits", -#ifdef HW_RVL - "Exit to System Menu", -#else - "Reset System", -#endif - "Return to Loader", - }; - - /* check if loader stub exists */ - int maxitems = reload ? 3 : 2; - - /* display option window */ - switch (GUI_OptionWindow(&menu_main, osd_version, items, maxitems)) - { - case 0: /* credits */ - GUI_DeleteMenu(&menu_main); - showcredits(); - GUI_InitMenu(&menu_main); - break; - - case 1: /* reset */ -#ifdef HW_RVL - gxTextureClose(&w_pointer); -#endif - GUI_DeleteMenu(&menu_main); - GUI_FadeOut(); - shutdown(); -#ifdef HW_RVL - SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); -#else - SYS_ResetSystem(SYS_HOTRESET,0,0); -#endif - break; - - case 2: /* exit to loader */ -#ifdef HW_RVL - gxTextureClose(&w_pointer); -#endif - GUI_DeleteMenu(&menu_main); - GUI_FadeOut(); - shutdown(); - SYS_ResetSystem(SYS_SHUTDOWN,0,0); - __lwp_thread_stopmultitasking(*reload); - break; - - default: - break; - } -} - -/**************************************************************************** - * Main Menu - * - ****************************************************************************/ - -static void mainmenu_cb(void) -{ - char temp[4]; - gui_menu *m = &menu_main; - int status = areplay_get_status(); - - /* Action Replay Switch current status */ - if (status == AR_SWITCH_TRAINER) strcpy(temp,"TM"); - else if (status == AR_SWITCH_ON) strcpy(temp,"ON"); - else strcpy(temp,"OFF"); - - /* Display informations */ - if (m->selected == 6) - { - FONT_writeCenter("Action\nReplay", 14, m->items[6].x, m->items[6].x + 54, m->items[6].y + (m->items[6].h - 28)/2 + 14, (GXColor)DARK_GREY); - FONT_writeCenter(temp, 11, m->items[6].x + 56 + 3, m->items[6].x + 78 + 2, m->items[6].y + (m->items[6].h - 11)/2 + 11, (GXColor)DARK_GREY); - } - else - { - FONT_writeCenter("Action\nReplay", 12, m->items[6].x + 4, m->items[6].x + 54, m->items[6].y + (m->items[6].h - 24)/2 + 12, (GXColor)DARK_GREY); - FONT_writeCenter(temp, 10, m->items[6].x + 56, m->items[6].x + 78, m->items[6].y + (m->items[6].h - 10)/2 + 10, (GXColor)DARK_GREY); - } -} - -void mainmenu(void) -{ - char filename[MAXPATHLEN]; - int status, quit = 0; - - /* Autosave Backup RAM */ - slot_autosave(0, config.s_device); - -#ifdef HW_RVL - /* Detect shutdown request */ - if (Shutdown) - { - GUI_FadeOut(); - shutdown(); - if (reload) - { - /* exit to loader if requested */ - SYS_ResetSystem(SYS_SHUTDOWN,0,0); - __lwp_thread_stopmultitasking(*reload); - } - else - { - /* shutdown system by default */ - SYS_ResetSystem(SYS_POWEROFF, 0, 0); - } - } - - /* Wiimote pointer */ - w_pointer = gxTextureOpenPNG(generic_point_png,0); -#endif - - gui_menu *m = &menu_main; - - /* Update main menu */ - if (!m->screenshot) - { - if (config.bg_overlay) - { - bg_main[1].state |= IMAGE_VISIBLE; - bg_misc[1].state |= IMAGE_VISIBLE; - bg_ctrls[1].state |= IMAGE_VISIBLE; - bg_list[1].state |= IMAGE_VISIBLE; - bg_saves[2].state |= IMAGE_VISIBLE; - } - else - { - bg_main[1].state &= ~IMAGE_VISIBLE; - bg_misc[1].state &= ~IMAGE_VISIBLE; - bg_ctrls[1].state &= ~IMAGE_VISIBLE; - bg_list[1].state &= ~IMAGE_VISIBLE; - bg_saves[2].state &= ~IMAGE_VISIBLE; - } - - if (system_hw) - { - m->screenshot = 128; - m->bg_images[0].state &= ~IMAGE_VISIBLE; - m->items[0].y -= 90; - m->items[1].y -= 90; - m->items[2].y -= 90; - m->buttons[0].y -= 90; - m->buttons[1].y -= 90; - m->buttons[2].y -= 90; - m->buttons[0].shift[1] = 3; - m->buttons[1].shift[1] = 3; - m->buttons[2].shift[1] = 3; - m->buttons[3].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); - m->buttons[4].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); - m->buttons[5].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); - m->buttons[7].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); - m->buttons[8].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); - m->buttons[9].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); - if (areplay_get_status() >= 0) - { - menu_main.buttons[6].state |= (BUTTON_VISIBLE | BUTTON_ACTIVE); - menu_main.items[6].data = Button_sm_grey_png; - menu_main.cb = mainmenu_cb; - menu_main.buttons[3].shift[1] = 3; - menu_main.buttons[7].shift[0] = 1; - menu_main.buttons[8].shift[2] = 2; - } - } - } - - GUI_InitMenu(m); - GUI_DrawMenuFX(m,10,0); - - while (quit == 0) - { - switch (GUI_RunMenu(m)) - { - /*** Load Game Menu ***/ - case 0: - { - GUI_DrawMenuFX(m,30,1); - GUI_DeleteMenu(m); - - if (loadgamemenu()) - { - /* restart emulation */ - reloadrom(); - - /* check current controller configuration */ - if (!gx_input_FindDevices()) - { - GUI_InitMenu(m); - GUI_DrawMenuFX(m,30,0); - GUI_WaitPrompt("Error","Invalid Controllers Settings"); - break; - } - - /* exit to game and reinitialize emulation */ - gxClearScreen((GXColor)BLACK); - gxSetScreen(); - quit = 1; - break; - } - - GUI_InitMenu(m); - GUI_DrawMenuFX(m,30,0); - break; - } - - /*** Options Menu */ - case 1: - { - GUI_DrawMenuFX(m,30,1); - GUI_DeleteMenu(m); - optionmenu(); - GUI_InitMenu(m); - GUI_DrawMenuFX(m,30,0); - break; - } - - /*** Exit Menu ***/ - case 2: - { - exitmenu(); - break; - } - - /*** Save Manager ***/ - case 3: - { - GUI_DrawMenuFX(m,30,1); - GUI_DeleteMenu(m); - - if (savemenu()) - { - /* check current controller configuration */ - if (!gx_input_FindDevices()) - { - GUI_InitMenu(m); - GUI_DrawMenuFX(m,30,0); - GUI_WaitPrompt("Error","Invalid Controllers Settings"); - break; - } - - /* exit to game */ - quit = 1; - break; - } - - GUI_InitMenu(m); - GUI_DrawMenuFX(m,30,0); - break; - } - - /*** Soft / Hard reset ***/ - case 4: - { - /* check current controller configuration */ - if (!gx_input_FindDevices()) - { - GUI_WaitPrompt("Error","Invalid Controllers Settings"); - break; - } - - /* reinitialize emulation */ - GUI_DrawMenuFX(m,10,1); - GUI_DeleteMenu(m); - gxClearScreen((GXColor)BLACK); - gxSetScreen(); - - if (system_hw & SYSTEM_MD) - { - /* Soft Reset */ - gen_reset(0); - } - else if (system_hw == SYSTEM_SMS) - { - /* assert RESET input (Master System model 1 only) */ - io_reg[0x0D] &= ~IO_RESET_HI; - } - else - { - /* Hard Reset */ - system_init(); - system_reset(); - - /* restore SRAM */ - slot_autoload(0,config.s_device); - } - - /* exit to game */ - quit = 1; - break; - } - - /*** Cheats menu ***/ - case 5: - { - GUI_DrawMenuFX(m,30,1); - GUI_DeleteMenu(m); - CheatMenu(); - GUI_InitMenu(m); - GUI_DrawMenuFX(m,30,0); - break; - } - - /*** Action Replay switch ***/ - case 6: - { - status = (areplay_get_status() + 1) % (AR_SWITCH_TRAINER + 1); - areplay_set_status(status); - status = areplay_get_status(); - GUI_DeleteMenu(m); - if (status == AR_SWITCH_TRAINER) m->items[6].data = Button_sm_blue_png; - else if (status == AR_SWITCH_ON) m->items[6].data = Button_sm_yellow_png; - else m->items[6].data = Button_sm_grey_png; - GUI_InitMenu(m); - break; - } - - /*** Return to Game ***/ - case 7: - case -1: - { - if (system_hw) - { - /* check current controller configuration */ - if (!gx_input_FindDevices()) - { - GUI_WaitPrompt("Error","Invalid Controllers Settings"); - break; - } - - /* exit to game */ - GUI_DrawMenuFX(m,10,1); - GUI_DeleteMenu(m); - quit = 1; - } - break; - } - - /*** Game Capture ***/ - case 8: - { - /* PNG filename */ - sprintf(filename,"%s/snaps/%s.png", DEFAULT_PATH, rom_filename); - - /* Save file and return */ - gxSaveScreenshot(filename); - break; - } - - /*** ROM information screen ***/ - case 9: - { - showrominfo(); - break; - } - } - } - - /*** Remove any still held buttons ***/ - while (PAD_ButtonsHeld(0)) - { - VIDEO_WaitVSync(); - PAD_ScanPads(); - } -#ifdef HW_RVL - while (WPAD_ButtonsHeld(0)) - { - VIDEO_WaitVSync(); - WPAD_ScanPads(); - } - gxTextureClose(&w_pointer); - - /* USB Mouse support */ - if ((input.system[0] == SYSTEM_MOUSE) || (input.system[1] == SYSTEM_MOUSE)) - { - MOUSE_Init(); - } - else - { - MOUSE_Deinit(); - } -#endif -} diff --git a/genplus-gx/gx/gui/menu.h b/genplus-gx/gx/gui/menu.h deleted file mode 100644 index e10c2255a3..0000000000 --- a/genplus-gx/gx/gui/menu.h +++ /dev/null @@ -1,46 +0,0 @@ -/**************************************************************************** - * menu.c - * - * Genesis Plus GX menus - * - * Copyright Eke-Eke (2009-2013) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifndef _MENU_H -#define _MENU_H - -extern void mainmenu(void); -extern void (*reload)(void); - -#endif diff --git a/genplus-gx/gx/gui/saveicon.h b/genplus-gx/gx/gui/saveicon.h deleted file mode 100644 index a0ae7547da..0000000000 --- a/genplus-gx/gx/gui/saveicon.h +++ /dev/null @@ -1,136 +0,0 @@ -/*********************************************************** - * Genesis Plus Save Icon - * Made by Brakken (http://www.tehskeen.com) - * - ************************************************************/ -unsigned short icon[1024] = { - - 0xFFFF, 0xFFFF, 0xFBDE, 0xFBDE, 0xFBDE, 0xFBDE, 0xFBDE, 0xEB5A, - 0xFBDE, 0xFBDE, 0xFBDE, 0xBDCD, 0xFBDE, 0xF7BD, 0xF7BD, 0xAD49, - 0xEB59, 0xB9AD, 0xC1EF, 0xC1EF, 0x9062, 0x8000, 0x8C41, 0x8C41, - 0x8000, 0x9CE6, 0xA0E6, 0xA507, 0x8400, 0x9CC5, 0xA0E6, 0xA0E6, - 0xC1EF, 0xC1EF, 0xC1EF, 0xC1EF, 0x8000, 0x8000, 0x8000, 0x8000, - 0x9083, 0x8C63, 0x8C63, 0x9484, 0x8C63, 0x9083, 0x9484, 0x94A4, - 0xC1EF, 0xC20F, 0xC20F, 0xBDCE, 0x8000, 0x8000, 0x8000, 0x8000, - 0x9083, 0x8821, 0x8842, 0x8842, 0x8842, 0xA107, 0xB58C, 0xAD6B, - 0xA529, 0x94A4, 0x9083, 0x94A4, 0x8000, 0x8000, 0x8400, 0x8400, - 0x8842, 0x8842, 0x8842, 0x8821, 0xB18B, 0xA949, 0xA108, 0xA107, - 0xA528, 0xB9AD, 0xC630, 0xCE51, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8821, 0x8821, 0x8821, 0x8400, 0xA108, 0xA529, 0xA108, 0xA529, - 0xCA30, 0xC630, 0xCA30, 0xFBDE, 0x8000, 0x8000, 0x8000, 0xAD27, - 0x8400, 0x9083, 0x8863, 0x8400, 0x9CE6, 0x8842, 0x8C63, 0x8C20, - 0xFBDE, 0xFBDE, 0xFFFF, 0xFFFF, 0xFBDE, 0xFBDE, 0xFBDE, 0xFBDE, - 0xDA92, 0xFBDE, 0xFBDE, 0xFBDE, 0xC1AB, 0xF7BD, 0xFBDE, 0xFBDE, - 0xF7BD, 0xF7BD, 0xF7BD, 0xA0E6, 0xF7BD, 0xF7BD, 0xF39C, 0x9484, - 0xF39C, 0xF39C, 0xDEF7, 0x8C41, 0xF39C, 0xEF7B, 0xD272, 0x8400, - 0x8C42, 0x9CE6, 0xA507, 0xA0E6, 0x8C63, 0x9CC5, 0xA107, 0x9CE6, - 0x9484, 0x98A5, 0x9CE6, 0x98C5, 0x9CC5, 0x98C5, 0xA0E7, 0x98C5, - 0x8C42, 0x9083, 0x94A5, 0x9083, 0x8C42, 0x9083, 0x9084, 0x8C62, - 0x8C62, 0x9083, 0x9084, 0x8C62, 0x8C63, 0x9083, 0x94A4, 0x8C63, - 0x8842, 0x9CC6, 0xA107, 0xA0E7, 0x8842, 0x8842, 0xA108, 0xA54A, - 0x8842, 0x8C63, 0xB5AD, 0xB5AD, 0x8C63, 0x8C62, 0x8842, 0x8C63, - 0x98C5, 0xA528, 0xB5AC, 0xB5AC, 0xA52A, 0xBDEF, 0xC631, 0xCA52, - 0xB9CE, 0xB9CE, 0xA94A, 0xAD6B, 0x8C63, 0x8821, 0x8821, 0x8821, - 0xA529, 0x98C5, 0x98C5, 0xA0E6, 0xC210, 0xA529, 0xA529, 0xA529, - 0xB5AD, 0xB5CD, 0xB5AD, 0xBDEF, 0x8400, 0x8821, 0x8C62, 0x8821, - 0xA0E7, 0x8842, 0x8842, 0x8C41, 0x9083, 0x8842, 0x8842, 0x8842, - 0x94A5, 0x8842, 0x8C62, 0x8C62, 0x8C42, 0x9083, 0x8C62, 0x8C62, - 0xB548, 0xF7BD, 0xF7BD, 0xF7BD, 0xA4C4, 0xF7BD, 0xF7BD, 0xF7BD, - 0x9461, 0xDED5, 0xF39C, 0xF39C, 0x8C20, 0xD271, 0xF39C, 0xF39C, - 0xEF7B, 0xEF7B, 0xC610, 0x8400, 0xEF7B, 0xEB5A, 0xB9AC, 0x8000, - 0xEB5A, 0xEB5A, 0xA528, 0x9CC5, 0xE739, 0xE739, 0x9CC6, 0x98A5, - 0x98C5, 0x98C5, 0xA0E6, 0x94A4, 0x94A4, 0x98C5, 0x94A5, 0x9484, - 0xA528, 0x98C5, 0x9CE6, 0xA0E7, 0x9CE6, 0xA4E6, 0x98A4, 0xA507, - 0x8C62, 0x9083, 0x9484, 0x9083, 0x94A4, 0x94A5, 0x98C5, 0x98C5, - 0xA107, 0xA107, 0xA107, 0xB18B, 0xA907, 0x9062, 0x9484, 0x9CE6, - 0x8842, 0x94A4, 0x9484, 0x9084, 0x8C62, 0x8C63, 0x9CC5, 0x9CC5, - 0x98C6, 0x8C63, 0x9484, 0xA0E6, 0x9CE6, 0x9084, 0x94A4, 0x90A5, - 0x8C63, 0x8C42, 0x8C62, 0x8C62, 0x8C63, 0xA108, 0xA94A, 0xA528, - 0x94A5, 0x8884, 0x8884, 0x8884, 0xB0A5, 0xBC84, 0xA483, 0xA484, - 0x8C63, 0x8C42, 0x8C63, 0x9083, 0xA94A, 0x9083, 0x8C62, 0x94A4, - 0x8884, 0x8063, 0x90A5, 0x94A4, 0xA483, 0xBC63, 0xA884, 0x8884, - 0x9083, 0x8C63, 0x8C42, 0x8C63, 0x9084, 0x8842, 0x9083, 0x9084, - 0x8C42, 0x8C62, 0x98C6, 0xAD6A, 0x9083, 0x8C63, 0x98C5, 0xA107, - 0x8400, 0xC1ED, 0xEF7B, 0xEF7B, 0x8400, 0xAD27, 0xEF7B, 0xEF7B, - 0x9CE6, 0x9CA4, 0xEB5A, 0xEB5A, 0x9CE6, 0x9062, 0xDAB4, 0xE739, - 0xE739, 0xE318, 0x9483, 0x8C63, 0xE318, 0xCE72, 0x9062, 0x9CC5, - 0xDEF7, 0xC20F, 0x8C41, 0x9CE6, 0xDAD6, 0xB9AC, 0x8C20, 0x9CC5, - 0xA0E6, 0xA528, 0x9CC5, 0xA528, 0xA508, 0x94A5, 0x98C6, 0xA108, - 0x9CE6, 0x9CC5, 0xA0E7, 0xA94A, 0xA0E6, 0xA0E7, 0xA507, 0xAD6B, - 0xA107, 0x98C6, 0x9CE6, 0x9083, 0x98C6, 0xA108, 0xA107, 0x98C5, - 0xB9CD, 0xB18B, 0xA107, 0x9CC6, 0xC210, 0xB9CE, 0xA528, 0x9CC6, - 0x98C5, 0x94A5, 0x9084, 0x8884, 0x9CC6, 0x9CE6, 0x9CC6, 0x94A5, - 0x9CE6, 0x9CE6, 0x9CE7, 0xA108, 0x98C5, 0x98C5, 0x98C6, 0x98C6, - 0xB0C6, 0xD0C6, 0xD0C6, 0xD0C6, 0x90A4, 0x90A4, 0x98A5, 0x9CA4, - 0x9CE6, 0x90A4, 0x9084, 0x9084, 0x98C6, 0x98C6, 0x98C6, 0x98C6, - 0xD0A5, 0xD0A5, 0xA484, 0x8483, 0x9484, 0x9083, 0x8C83, 0x9084, - 0x90A5, 0x94A5, 0x9CE6, 0x9CE6, 0x98C6, 0x98C6, 0x9CE6, 0x98C6, - 0x8C63, 0x9084, 0x9484, 0x9083, 0x98C5, 0x98C5, 0x94A4, 0x94A5, - 0x98C6, 0x98C6, 0x98C5, 0x98C5, 0x98C6, 0x98C6, 0x98C6, 0x98C6, - 0x9084, 0x8821, 0xCE51, 0xE739, 0x94A5, 0x8C20, 0xBDCE, 0xE318, - 0x98C5, 0x8821, 0xB18B, 0xE318, 0x98C6, 0x8842, 0xAD49, 0xDEF7, - 0xDAD6, 0xAD49, 0x8C41, 0xA508, 0xD6B5, 0xBDCC, 0x8C20, 0x8C41, - 0xD6B5, 0xD294, 0xB98A, 0xAD06, 0xD294, 0xCE73, 0xCE73, 0xCA52, - 0xA94A, 0xB5AD, 0xB18C, 0xAD6B, 0x9062, 0x9062, 0x9062, 0x9062, - 0xAD27, 0xAD06, 0xAD06, 0xAD06, 0xCA52, 0xC631, 0xC631, 0xC210, - 0xA94B, 0xB18C, 0xB58D, 0xAD6B, 0x9062, 0x9484, 0x98A4, 0x98A4, - 0xA906, 0xA906, 0xA506, 0xA907, 0xC210, 0xC210, 0xB9F0, 0xBDEF, - 0xA94B, 0xA94B, 0xA94B, 0xA94B, 0x98A5, 0x98A5, 0x98A4, 0x98A4, - 0xA907, 0xA907, 0xA907, 0xA506, 0xBDEF, 0xBDEF, 0xBDEF, 0xB1F2, - 0xA94B, 0xA94A, 0xA54A, 0xA529, 0x9484, 0x9484, 0x9483, 0x9483, - 0xA4E6, 0xA4E6, 0xA4E6, 0xA4E6, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, - 0xA529, 0xA529, 0xA529, 0xA108, 0x9062, 0x8C63, 0x9062, 0x9062, - 0xA4E6, 0x9CE6, 0xA0E6, 0xA506, 0xBDEF, 0xC210, 0xC210, 0xC210, - 0xA108, 0x9CE7, 0x9CE7, 0x98C6, 0x8C41, 0x8C42, 0x8C41, 0x8C41, - 0xA507, 0xA508, 0xAD27, 0xB127, 0xC631, 0xC631, 0xCA52, 0xCA52, - 0x98C6, 0x8C63, 0xA0E6, 0xDAD6, 0x8C41, 0x8400, 0xB548, 0xDAD6, - 0xB127, 0xB548, 0xD6B5, 0xD6B5, 0xCE73, 0xCE73, 0xD294, 0xD6B5, - 0xD294, 0xCA74, 0xBA56, 0xB635, 0x9A3B, 0x81FF, 0x81FF, 0x81FF, - 0x81FF, 0x8A1F, 0xA27F, 0xA27F, 0x81FF, 0xA27F, 0xFFFF, 0xFFFF, - 0xB635, 0xB214, 0xB214, 0xBE11, 0x81FF, 0x81FF, 0x81FF, 0x81FF, - 0xA27F, 0xA27F, 0xA27F, 0x8A1F, 0xFFFF, 0xFFFF, 0xFFFF, 0xDF7F, - 0xA1F7, 0x91FA, 0x81FF, 0x95F9, 0x81FF, 0x81FF, 0x8A1F, 0x81FF, - 0x81FF, 0xD75F, 0xBEFF, 0x81FF, 0x81FF, 0xFFFF, 0xBEFF, 0x81FF, - 0xB9CE, 0xB9CE, 0x8DFC, 0x81FF, 0xA9D2, 0xA9D2, 0x81FF, 0x9A5F, - 0x99D6, 0x99D6, 0x81FF, 0xBEFF, 0x99D6, 0x99D6, 0x81FF, 0xBEFF, - 0x85FD, 0x95F9, 0xB5CF, 0xB1F1, 0x81FF, 0x81FF, 0x95F9, 0x81FF, - 0xEFBF, 0x81FF, 0x85FD, 0x81FF, 0xFFFF, 0x81FF, 0x81FF, 0x81FF, - 0xA5F5, 0xA5F5, 0xB5F2, 0xB214, 0x81FF, 0x81FF, 0x81FF, 0x81FF, - 0xB2BF, 0xB2BF, 0x81FF, 0x9A5F, 0xDF7F, 0xDF7F, 0x81FF, 0xE79F, - 0xA218, 0xA218, 0xA218, 0xA639, 0x81FF, 0x81FF, 0x81FF, 0x81FF, - 0xBEFF, 0xBEFF, 0xBEFF, 0xBEFF, 0xF7DF, 0xDF7F, 0xDF7F, 0xDF7F, - 0xA639, 0xB657, 0xCA75, 0xD294, 0x81FF, 0x81FF, 0x861E, 0xCA95, - 0xBEFF, 0xAA9F, 0x81FF, 0xB658, 0xD75F, 0x8A1F, 0x81FF, 0xCA75, - 0x81FF, 0xA27F, 0xFFFF, 0xA27F, 0x81FF, 0xA27F, 0xFFFF, 0xFFFF, - 0x81FF, 0xA27F, 0xFFFF, 0xBADF, 0x81FF, 0xA27F, 0xFFFF, 0xA27F, - 0x81FF, 0x81FF, 0xCF3F, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xBADF, - 0xA27F, 0xA27F, 0xA27F, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x81FF, - 0x923F, 0xFFFF, 0xBEFF, 0x81FF, 0x81FF, 0xFFFF, 0xBEFF, 0x81FF, - 0x81FF, 0xFFFF, 0xCF3F, 0xA27F, 0x81FF, 0xFFFF, 0xFFFF, 0xFFFF, - 0x99D6, 0x99D6, 0x81FF, 0xBEFF, 0x81FF, 0x81FF, 0x81FF, 0xBEFF, - 0xA27F, 0xA27F, 0x9A5F, 0xBADF, 0xFFFF, 0xFFFF, 0xA27F, 0x81FF, - 0xFFFF, 0x81FF, 0x81FF, 0x81FF, 0xFFFF, 0x81FF, 0x81FF, 0x81FF, - 0xFFFF, 0xBEFF, 0xBEFF, 0xBEFF, 0xC71F, 0xDF7F, 0xDF7F, 0xDF7F, - 0xDF7F, 0xDF7F, 0x923F, 0xF7DF, 0xDF7F, 0xDF7F, 0x81FF, 0xAA9F, - 0xEFBF, 0xC71F, 0x81FF, 0x9A5F, 0xCF3F, 0x81FF, 0x8A1F, 0xD75F, - 0xE79F, 0xBEFF, 0xBEFF, 0xBEFF, 0xDF7F, 0xDF7F, 0xDF7F, 0xDF7F, - 0xBEFF, 0xBEFF, 0xBEFF, 0xC71F, 0xDF7F, 0xDF7F, 0xDF7F, 0xDF7F, - 0xBEFF, 0x81FF, 0x81FF, 0xB657, 0xFFFF, 0xC71F, 0x81FF, 0xA23A, - 0xFFFF, 0xC71F, 0x81FF, 0xA23A, 0xD75F, 0x8A1F, 0x81FF, 0xB658, - 0x81FF, 0x9A5F, 0xAA9F, 0x81FF, 0x921D, 0x81FF, 0x81FF, 0x85FE, - 0xD294, 0xBE55, 0xB657, 0xC653, 0xD294, 0xD294, 0xCE73, 0xCA52, - 0x8A1D, 0xB214, 0xB214, 0x8DFC, 0xBA34, 0xC631, 0xC210, 0xB612, - 0xC631, 0xC631, 0xC631, 0xC210, 0xCA52, 0xCA52, 0xC631, 0xC631, - 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x8DFC, 0x81FF, 0x81FF, 0x81FF, - 0xC210, 0xBE10, 0xBDEF, 0xBDEF, 0xC210, 0xC210, 0xC210, 0xBE10, - 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x8DFB, 0xA5D4, - 0xBDEF, 0xB9CE, 0xB9CE, 0xB9CE, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, - 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x99F8, 0x8DFB, 0x8DFB, 0x8DFB, - 0xB9CE, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, 0xBDEF, 0xBE10, 0xC210, - 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x95F9, 0xA5F5, 0xA1F7, 0x91FA, - 0xBDEF, 0xBE10, 0xC210, 0xC210, 0xC210, 0xC210, 0xC631, 0xC631, - 0x81FF, 0x81FF, 0x81FF, 0x81FF, 0x921C, 0x921C, 0x921C, 0x921C, - 0xC631, 0xC631, 0xCA52, 0xCA52, 0xC631, 0xCA52, 0xCA52, 0xCE73, - 0x81FF, 0x81FF, 0x9A3B, 0xD294, 0x961B, 0xAA39, 0xD294, 0xD294, - 0xCE73, 0xCE73, 0xD294, 0xD6B5, 0xCE73, 0xD294, 0xD6B5, 0xD6B5, -}; diff --git a/genplus-gx/gx/gx_audio.c b/genplus-gx/gx/gx_audio.c deleted file mode 100644 index b237c0e8d7..0000000000 --- a/genplus-gx/gx/gx_audio.c +++ /dev/null @@ -1,210 +0,0 @@ -/**************************************************************************** - * gx_audio.c - * - * Genesis Plus GX audio support - * - * Copyright Eke-Eke (2007-2013), based on original work from Softdev (2006) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#include "shared.h" - -/* Length is dimensionned for at least one frame of emulation */ -#define SOUND_BUFFER_LEN 4096 - -/* Number of sound buffers */ -#define SOUND_BUFFER_NUM 3 - -/* audio DMA status */ -u32 audioStarted; - -/* DMA soundbuffers (required to be 32-bytes aligned) */ -static u8 soundbuffer[SOUND_BUFFER_NUM][SOUND_BUFFER_LEN] ATTRIBUTE_ALIGN(32); - -/* Current work soundbuffer */ -static u8 mixbuffer; - -/* Background music */ -static u8 *Bg_music_ogg = NULL; -static u32 Bg_music_ogg_size = 0; - -/* Frame Sync */ -u32 audioSync; -static u32 audioWait; - -/***************************************************************************************/ -/* Audio engine */ -/***************************************************************************************/ - -/* Audio DMA callback */ -static void ai_callback(void) -{ - audioWait = 0; -} - -/* AUDIO engine initialization */ -void gx_audio_Init(void) -{ - /* Initialize AUDIO processing library (ASNDLIB) */ - /* AUDIO & DSP hardware are initialized */ - /* Default samplerate is set to 48kHz */ - ASND_Init(); - - /* Load background music from FAT device */ - char fname[MAXPATHLEN]; - sprintf(fname,"%s/Bg_music.ogg",DEFAULT_PATH); - FILE *f = fopen(fname,"rb"); - if (f) - { - struct stat filestat; - stat(fname, &filestat); - Bg_music_ogg_size = filestat.st_size; - Bg_music_ogg = memalign(32,Bg_music_ogg_size); - if (Bg_music_ogg) - { - fread(Bg_music_ogg,1,Bg_music_ogg_size,f); - } - fclose(f); - } - - /* emulation is synchronized with audio hardware by default */ - audioSync = 1; -} - -/* AUDIO engine shutdown */ -void gx_audio_Shutdown(void) -{ - PauseOgg(1); - StopOgg(); - ASND_Pause(1); - ASND_End(); - if (Bg_music_ogg) - { - free(Bg_music_ogg); - } -} - -/*** - gx_audio_Update - - This function retrieves samples for the frame then set the next DMA parameters - Parameters will be taken in account only when current DMA operation is over - ***/ -int gx_audio_Update(void) -{ - if (!audioWait) - { - /* Current available soundbuffer */ - s16 *sb = (s16 *)(soundbuffer[mixbuffer]); - - /* Retrieve audio samples (size must be multiple of 32 bytes) */ - int size = audio_update(sb) * 4; - - /* Update DMA settings */ - DCFlushRange((void *)sb, size); - AUDIO_InitDMA((u32) sb, size); - mixbuffer = (mixbuffer + 1) % SOUND_BUFFER_NUM; - audioWait = audioSync; - - /* Start Audio DMA */ - /* this is called once to kick-off DMA from external memory to audio interface */ - /* DMA operation is automatically restarted when all samples have been sent. */ - /* If DMA settings are not updated at that time, previous sound buffer will be used. */ - /* Therefore we need to make sure frame emulation is completed before current DMA is */ - /* completed, by synchronizing frame emulation with DMA start and also by syncing it */ - /* with Video Interrupt and outputing a suitable number of samples per frame. */ - if (!audioStarted) - { - /* restart audio DMA */ - AUDIO_StopDMA(); - AUDIO_StartDMA(); - audioStarted = 1; - } - - return SYNC_AUDIO; - } - - return SYNC_WAIT; -} - -/*** - gx_audio_Start - - This function restart the audio engine - This is called when coming back from Main Menu - ***/ -void gx_audio_Start(void) -{ - /* shutdown background music */ - PauseOgg(1); - StopOgg(); - - /* shutdown menu audio processing */ - ASND_Pause(1); - ASND_End(); - AUDIO_StopDMA(); - AUDIO_RegisterDMACallback(NULL); - DSP_Halt(); - - /* DMA Interrupt callback */ - AUDIO_RegisterDMACallback(ai_callback); - - /* reset emulation audio processing */ - memset(soundbuffer, 0, sizeof(soundbuffer)); - audioStarted = 0; - mixbuffer = 0; - audioWait = 0; -} - -/*** - gx_audio_Stop - - This function stops current Audio DMA process - This is called when going back to Main Menu - DMA need to be restarted when going back to the game (see above) - ***/ -void gx_audio_Stop(void) -{ - /* restart menu audio processing */ - DSP_Unhalt(); - ASND_Init(); - ASND_Pause(0); - - /* play background music */ - if (Bg_music_ogg && !Shutdown) - { - PauseOgg(0); - PlayOgg((char *)Bg_music_ogg, Bg_music_ogg_size, 0, OGG_INFINITE_TIME); - SetVolumeOgg(((int)config.bgm_volume * 255) / 100); - } -} diff --git a/genplus-gx/gx/gx_audio.h b/genplus-gx/gx/gx_audio.h deleted file mode 100644 index 174a3ca45b..0000000000 --- a/genplus-gx/gx/gx_audio.h +++ /dev/null @@ -1,52 +0,0 @@ -/**************************************************************************** - * gx_audio.c - * - * Genesis Plus GX audio support - * - * Copyright Eke-Eke (2007-2013), based on original work from Softdev (2006) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifndef _GC_AUDIO_H_ -#define _GC_AUDIO_H_ - -extern u32 audioStarted; -extern u32 audioSync; - -extern void gx_audio_Init(void); -extern void gx_audio_Shutdown(void); -extern void gx_audio_Start(void); -extern void gx_audio_Stop(void); -extern int gx_audio_Update(void); - -#endif diff --git a/genplus-gx/gx/gx_input.c b/genplus-gx/gx/gx_input.c deleted file mode 100644 index b175cb2500..0000000000 --- a/genplus-gx/gx/gx_input.c +++ /dev/null @@ -1,1641 +0,0 @@ -/**************************************************************************** - * gx_input.c - * - * Genesis Plus GX input support - * - * Copyright Eke-Eke (2007-2013) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#include "shared.h" -#include "font.h" -#include "gui.h" -#include "cheats.h" - -#ifdef HW_RVL -#include -#endif - -/* Analog sticks sensitivity */ -#define ANALOG_SENSITIVITY 30 - -/* Delay before held keys triggering */ -/* higher is the value, less responsive is the key update */ -#define HELD_DELAY 30 - -/* Direction & selection update speed when a key is being held */ -/* lower is the value, faster is the key update */ -#define HELD_SPEED 4 - - -/* Configurable keys */ -#define KEY_BUTTONA 0 -#define KEY_BUTTONB 1 -#define KEY_BUTTONC 2 -#define KEY_START 3 -#define KEY_BUTTONX 4 -#define KEY_BUTTONY 5 -#define KEY_BUTTONZ 6 -#define KEY_MODE 7 -#define KEY_MENU 8 - -#ifdef HW_RVL - -#define PAD_UP 0 -#define PAD_DOWN 1 -#define PAD_LEFT 2 -#define PAD_RIGHT 3 - -/* default directions mapping */ -static u32 wpad_dirmap[3][4] = -{ - {WPAD_BUTTON_RIGHT, WPAD_BUTTON_LEFT, WPAD_BUTTON_UP, WPAD_BUTTON_DOWN}, /* WIIMOTE */ - {WPAD_BUTTON_UP, WPAD_BUTTON_DOWN, WPAD_BUTTON_LEFT, WPAD_BUTTON_RIGHT}, /* WIIMOTE + NUNCHUK */ - {WPAD_CLASSIC_BUTTON_UP, WPAD_CLASSIC_BUTTON_DOWN, WPAD_CLASSIC_BUTTON_LEFT, WPAD_CLASSIC_BUTTON_RIGHT} /* CLASSIC */ -}; - -#define WPAD_BUTTONS_HELD (WPAD_BUTTON_UP | WPAD_BUTTON_DOWN | WPAD_BUTTON_LEFT | WPAD_BUTTON_RIGHT | \ - WPAD_BUTTON_MINUS | WPAD_BUTTON_PLUS | WPAD_BUTTON_A | WPAD_BUTTON_2 | \ - WPAD_CLASSIC_BUTTON_UP | WPAD_CLASSIC_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_RIGHT | \ - WPAD_CLASSIC_BUTTON_FULL_L | WPAD_CLASSIC_BUTTON_FULL_R | WPAD_CLASSIC_BUTTON_A) - -#endif - -#define PAD_BUTTONS_HELD (PAD_BUTTON_UP | PAD_BUTTON_DOWN | PAD_BUTTON_LEFT | PAD_BUTTON_RIGHT | \ - PAD_TRIGGER_L | PAD_TRIGGER_R | PAD_BUTTON_A) - -static char keyname[MAX_KEYS][16]; - -static int held_cnt = 0; -static int inputs_disabled = 0; - -/***************************************************************************************/ -/* Gamecube PAD support */ -/***************************************************************************************/ -static void pad_config(int chan, int first_key, int last_key) -{ - u16 p = 0; - char msg[64]; - - /* disable background PAD scanning */ - inputs_disabled = 1; - - /* Check if PAD is connected */ - VIDEO_WaitVSync(); - if (!(PAD_ScanPads() & (1< ANALOG_SENSITIVITY) - { - ConfigRequested = 1; - return; - } - - /* D-PAD */ - if ((p & PAD_BUTTON_UP) || (y > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_UP; - else if ((p & PAD_BUTTON_DOWN) || (y < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_DOWN; - if ((p & PAD_BUTTON_LEFT) || (x < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_LEFT; - else if ((p & PAD_BUTTON_RIGHT) || (x > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_RIGHT; - - /* Buttons */ - if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A; - if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B; - if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_C; - if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START; - - break; - } - - case DEVICE_XE_A1P: - { - /* Left Stick analog position [0-255] */ - input.analog[i][0] = (x + 128); - input.analog[i][1] = y ? (127 - y) : (128 - y); - - /* Right Stick analog position [0-255] */ - x = PAD_SubStickX(chan); - y = PAD_SubStickY(chan); - - /* Emulated stick is unidirectional but can be rotated */ - if (abs(x) > abs(y)) - { - input.analog[i+1][0] = (x + 128); - } - else - { - input.analog[i+1][0] = (y + 128); - } - - /* Buttons */ - if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_XE_A; - if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_XE_B; - if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_XE_C; - if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_XE_START; - if (p & pad_keymap[KEY_BUTTONX]) input.pad[i] |= INPUT_XE_D; - if (p & pad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_XE_E1; - if (p & pad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_XE_E2; - if (p & pad_keymap[KEY_MODE]) input.pad[i] |= INPUT_XE_SELECT; - - break; - } - - case DEVICE_SPORTSPAD: - { - /* Y analog position [0-255] */ - input.analog[i][1] = y ? (127 - y) : (128 - y); - - /* default inputs are checked below */ - } - - case DEVICE_PADDLE: - { - /* Default menu key (right analog stick) */ - if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY) - { - ConfigRequested = 1; - return; - } - - /* X analog position [0-255] */ - input.analog[i][0] = (x + 128); - - /* Buttons */ - if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_BUTTON1; - if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_BUTTON2; - if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START; - - break; - } - - case DEVICE_PAD2B: - { - /* Default menu key (right analog stick) */ - if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY) - { - ConfigRequested = 1; - return; - } - - /* D-PAD */ - if ((p & PAD_BUTTON_UP) || (y > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_UP; - else if ((p & PAD_BUTTON_DOWN) || (y < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_DOWN; - if ((p & PAD_BUTTON_LEFT) || (x < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_LEFT; - else if ((p & PAD_BUTTON_RIGHT) || (x > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_RIGHT; - - /* Buttons */ - if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_BUTTON1; - if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_BUTTON2; - if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START; - - break; - } - - case DEVICE_LIGHTGUN: - { - /* Default menu key (right analog stick) */ - if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY) - { - ConfigRequested = 1; - return; - } - - /* Gun screen position (x,y) */ - input.analog[i][0] += x / ANALOG_SENSITIVITY; - input.analog[i][1] -= y / ANALOG_SENSITIVITY; - - /* Limits */ - if (input.analog[i][0] < 0) input.analog[i][0] = 0; - else if (input.analog[i][0] > bitmap.viewport.w) input.analog[i][0] = bitmap.viewport.w; - if (input.analog[i][1] < 0) input.analog[i][1] = 0; - else if (input.analog[i][1] > bitmap.viewport.h) input.analog[i][1] = bitmap.viewport.h; - - /* Buttons */ - if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A; - if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B; - if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_C; - if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START; - - break; - } - - case DEVICE_MOUSE: - { - /* Default menu key (right analog stick) */ - if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY) - { - ConfigRequested = 1; - return; - } - - /* Mouse relative movement (-255,255) */ - input.analog[i][0] = (x / ANALOG_SENSITIVITY) * 2; - input.analog[i][1] = (y / ANALOG_SENSITIVITY) * 2; - - /* Y-Axis inversion */ - if (config.invert_mouse) - { - input.analog[i][1] = -input.analog[i][1]; - } - - /* Buttons */ - if (p & pad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_MOUSE_CENTER; - if (p & pad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_MOUSE_LEFT; - if (p & pad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_MOUSE_RIGHT; - if (p & pad_keymap[KEY_START]) input.pad[i] |= INPUT_START; - - break; - } - - case DEVICE_PICO: - { - /* Default menu key (right analog stick) */ - if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY) - { - ConfigRequested = 1; - return; - } - - /* D-PAD */ - if (p & PAD_BUTTON_UP) input.pad[0] |= INPUT_UP; - else if (p & PAD_BUTTON_DOWN) input.pad[0] |= INPUT_DOWN; - if (p & PAD_BUTTON_LEFT) input.pad[0] |= INPUT_LEFT; - else if (p & PAD_BUTTON_RIGHT) input.pad[0] |= INPUT_RIGHT; - - /* PEN screen position (x,y) */ - input.analog[0][0] += x / ANALOG_SENSITIVITY; - input.analog[0][1] -= y / ANALOG_SENSITIVITY; - - /* Limits */ - if (input.analog[0][0] < 0x17c) input.analog[0][0] = 0x17c; - else if (input.analog[0][0] > 0x3c) input.analog[0][0] = 0x3c; - if (input.analog[0][1] < 0x1fc) input.analog[0][1] = 0x1fc; - else if (input.analog[0][1] > 0x3f3) input.analog[0][1] = 0x3f3; - - /* PEN button */ - if (p & pad_keymap[KEY_BUTTONA]) input.pad[0] |= INPUT_PICO_RED; - - /* RED button */ - if (p & pad_keymap[KEY_BUTTONB]) input.pad[0] |= INPUT_PICO_PEN; - - /* PAGE index increment */ - if (p & pad_keymap[KEY_BUTTONC]) pico_current = (pico_current + 1) & 7; - - break; - } - - case DEVICE_TEREBI: - { - /* Default menu key (right analog stick) */ - if (PAD_SubStickX(chan) > ANALOG_SENSITIVITY) - { - ConfigRequested = 1; - return; - } - - /* PEN screen position (x,y) */ - input.analog[0][0] += x / ANALOG_SENSITIVITY; - input.analog[0][1] -= y / ANALOG_SENSITIVITY; - - /* Limits */ - if (input.analog[0][0] < 0) input.analog[0][0] = 0; - else if (input.analog[0][0] > 250) input.analog[0][0] = 250; - if (input.analog[0][1] < 0) input.analog[0][1] = 0; - else if (input.analog[0][1] > 250) input.analog[0][1] = 250; - - /* PEN button */ - if (p & pad_keymap[KEY_BUTTONA]) input.pad[0] |= INPUT_BUTTON1; - - break; - } - - case DEVICE_ACTIVATOR: - { - /* Left & right analog stick angle [0-360] */ - float ang; - - /* Left stick values */ - if ((abs(x) > ANALOG_SENSITIVITY) || (abs(y) > ANALOG_SENSITIVITY)) - { - /* Calculate angle (in degree) */ - ang = 90.0 - (atan((float)y / (float)x) * 180.0 / M_PI); - if (x < 0) ang += 180.0; - - /* 8 bottom sensors = 8 areas */ - if ((ang > 22.5) && (ang <= 67.5)) input.pad[i] |= INPUT_ACTIVATOR_2L; - else if ((ang > 67.5) && (ang <= 112.5)) input.pad[i] |= INPUT_ACTIVATOR_3L; - else if ((ang > 112.5) && (ang <= 157.5)) input.pad[i] |= INPUT_ACTIVATOR_4L; - else if ((ang > 157.5) && (ang <= 202.5)) input.pad[i] |= INPUT_ACTIVATOR_5L; - else if ((ang > 202.5) && (ang <= 247.5)) input.pad[i] |= INPUT_ACTIVATOR_6L; - else if ((ang > 247.5) && (ang <= 292.5)) input.pad[i] |= INPUT_ACTIVATOR_7L; - else if ((ang > 292.5) && (ang <= 337.5)) input.pad[i] |= INPUT_ACTIVATOR_8L; - else input.pad[i] |= INPUT_ACTIVATOR_1L; - } - - /* Right stick values */ - x = PAD_SubStickX(chan); - y = PAD_SubStickY(chan); - - if ((abs(x) > ANALOG_SENSITIVITY) || (abs(y) > ANALOG_SENSITIVITY)) - { - /* Calculate angle (in degree) */ - ang = 90.0 - (atan((float)y / (float)x) * 180.0 / M_PI); - if (x < 0) ang += 180.0; - - /* 8 top sensors = 8 areas */ - if ((ang > 22.5) && (ang <= 67.5)) input.pad[i] |= INPUT_ACTIVATOR_2U; - else if ((ang > 67.5) && (ang <= 112.5)) input.pad[i] |= INPUT_ACTIVATOR_3U; - else if ((ang > 112.5) && (ang <= 157.5)) input.pad[i] |= INPUT_ACTIVATOR_4U; - else if ((ang > 157.5) && (ang <= 202.5)) input.pad[i] |= INPUT_ACTIVATOR_5U; - else if ((ang > 202.5) && (ang <= 247.5)) input.pad[i] |= INPUT_ACTIVATOR_6U; - else if ((ang > 247.5) && (ang <= 292.5)) input.pad[i] |= INPUT_ACTIVATOR_7U; - else if ((ang > 292.5) && (ang <= 337.5)) input.pad[i] |= INPUT_ACTIVATOR_8U; - else input.pad[i] |= INPUT_ACTIVATOR_1U; - } - - break; - } - } -} - -/***************************************************************************************/ -/* Wii WPAD support */ -/***************************************************************************************/ -#ifdef HW_RVL - -static int wpad_StickX(WPADData *data, u8 right) -{ - struct joystick_t* js = NULL; - - switch (data->exp.type) - { - case WPAD_EXP_NUNCHUK: - js = right ? NULL : &data->exp.nunchuk.js; - break; - - case WPAD_EXP_CLASSIC: - js = right ? &data->exp.classic.rjs : &data->exp.classic.ljs; - break; - - default: - break; - } - - if (js) - { - /* raw X value */ - int x = js->pos.x; - - /* value returned is sometime above calibrated limits */ - if (x > js->max.x) return 127; - if (x < js->min.x) return -128; - - /* adjust against center position */ - x -= js->center.x; - - /* return interpolated range [-128;127] */ - if (x > 0) - { - return (int)(127.0 * ((float)x / (float)(js->max.x - js->center.x))); - } - { - return (int)(128.0 * ((float)x / (float)(js->center.x - js->min.x))); - } - } - - return 0; -} - -static int wpad_StickY(WPADData *data, u8 right) -{ - struct joystick_t* js = NULL; - - switch (data->exp.type) - { - case WPAD_EXP_NUNCHUK: - js = right ? NULL : &data->exp.nunchuk.js; - break; - - case WPAD_EXP_CLASSIC: - js = right ? &data->exp.classic.rjs : &data->exp.classic.ljs; - break; - - default: - break; - } - - if (js) - { - /* raw Y value */ - int y = js->pos.y; - - /* value returned is sometime above calibrated limits */ - if (y > js->max.y) return 127; - if (y < js->min.y) return -128; - - /* adjust against center position */ - y -= js->center.y; - - /* return interpolated range [-128;127] */ - if (y > 0) - { - return (int)(127.0 * ((float)y / (float)(js->max.y - js->center.y))); - } - { - return (int)(128.0 * ((float)y / (float)(js->center.y - js->min.y))); - } - } - - return 0; -} - -static void wpad_config(u8 exp, int chan, int first_key, int last_key) -{ - char msg[64]; - u32 p = 255; - - /* Disable background PAD scanning */ - inputs_disabled = 1; - - /* Check if device is connected */ - WPAD_Probe(chan, &p); - if (((exp > WPAD_EXP_NONE) && (p != exp)) || (p == 255)) - { - /* device not detected */ - if (exp == WPAD_EXP_NONE) sprintf(msg, "WIIMOTE #%d is not connected !", chan+1); - if (exp == WPAD_EXP_NUNCHUK) sprintf(msg, "NUNCHUK #%d is not connected !", chan+1); - if (exp == WPAD_EXP_CLASSIC) sprintf(msg, "CLASSIC #%d is not connected !", chan+1); - GUI_WaitPrompt("Error",msg); - - /* re-enable background PAD scanning and exit */ - inputs_disabled = 0; - return; - } - - /* Configure each keys */ - do - { - /* ignore unused keys */ - if (strcmp(keyname[first_key], "N.A")) - { - /* remove any pending buttons */ - while (WPAD_ButtonsHeld(chan)) - { - VIDEO_WaitVSync(); - WPAD_ScanPads(); - } - - /* configurable button */ - sprintf(msg,"Press key for %s\n(HOME to return)",keyname[first_key]); - GUI_MsgBoxUpdate(0,msg); - - /* wait for user input */ - p = 0; - while (!p) - { - VIDEO_WaitVSync(); - WPAD_ScanPads(); - p = WPAD_ButtonsDown(chan); - } - - /* detect pressed key */ - switch (exp) - { - /* Wiimote (TODO: add motion sensing !) */ - case WPAD_EXP_NONE: - { - if (p & WPAD_BUTTON_2) p = WPAD_BUTTON_2; - else if (p & WPAD_BUTTON_1) p = WPAD_BUTTON_1; - else if (p & WPAD_BUTTON_B) p = WPAD_BUTTON_B; - else if (p & WPAD_BUTTON_A) p = WPAD_BUTTON_A; - else if (p & WPAD_BUTTON_PLUS) p = WPAD_BUTTON_PLUS; - else if (p & WPAD_BUTTON_MINUS) p = WPAD_BUTTON_MINUS; - else first_key = MAX_KEYS; - break; - } - - /* Wiimote + Nunchuk (TODO: add motion sensing !) */ - case WPAD_EXP_NUNCHUK: - { - if (p & WPAD_BUTTON_2) p = WPAD_BUTTON_2; - else if (p & WPAD_BUTTON_1) p = WPAD_BUTTON_1; - else if (p & WPAD_BUTTON_B) p = WPAD_BUTTON_B; - else if (p & WPAD_BUTTON_A) p = WPAD_BUTTON_A; - else if (p & WPAD_BUTTON_PLUS) p = WPAD_BUTTON_PLUS; - else if (p & WPAD_BUTTON_MINUS) p= WPAD_BUTTON_MINUS; - else if (p & WPAD_NUNCHUK_BUTTON_Z) p = WPAD_NUNCHUK_BUTTON_Z; - else if (p & WPAD_NUNCHUK_BUTTON_C) p = WPAD_NUNCHUK_BUTTON_C; - else first_key = MAX_KEYS; - break; - } - - /* Classic Controller */ - case WPAD_EXP_CLASSIC: - { - if (p & WPAD_CLASSIC_BUTTON_X) p = WPAD_CLASSIC_BUTTON_X; - else if (p & WPAD_CLASSIC_BUTTON_A) p = WPAD_CLASSIC_BUTTON_A; - else if (p & WPAD_CLASSIC_BUTTON_Y) p = WPAD_CLASSIC_BUTTON_Y; - else if (p & WPAD_CLASSIC_BUTTON_B) p = WPAD_CLASSIC_BUTTON_B; - else if (p & WPAD_CLASSIC_BUTTON_ZL) p = WPAD_CLASSIC_BUTTON_ZL; - else if (p & WPAD_CLASSIC_BUTTON_ZR) p = WPAD_CLASSIC_BUTTON_ZR; - else if (p & WPAD_CLASSIC_BUTTON_PLUS) p = WPAD_CLASSIC_BUTTON_PLUS; - else if (p & WPAD_CLASSIC_BUTTON_MINUS) p = WPAD_CLASSIC_BUTTON_MINUS; - else if (p & WPAD_CLASSIC_BUTTON_FULL_L) p = WPAD_CLASSIC_BUTTON_FULL_L; - else if (p & WPAD_CLASSIC_BUTTON_FULL_R) p = WPAD_CLASSIC_BUTTON_FULL_R; - else first_key = MAX_KEYS; - break; - } - - default: - { - first_key = MAX_KEYS; - break; - } - } - - /* update key mapping */ - if (first_key < MAX_KEYS) - { - config.wpad_keymap[exp + (chan * 3)][first_key] = p; - } - } - } - while (first_key++ < last_key); - - /* remove any pending buttons */ - while (WPAD_ButtonsHeld(chan)) - { - VIDEO_WaitVSync(); - WPAD_ScanPads(); - } - - /* re-enable background PAD scanning and exit */ - inputs_disabled = 0; -} - -static void wpad_update(s8 chan, u8 i, u32 exp) -{ - /* WPAD data */ - WPADData *data = WPAD_Data(chan); - - /* WPAD status */ - u32 p = data->btns_h; - - /* Analog sticks */ - s8 x = 0; - s8 y = 0; - - if (exp != WPAD_EXP_NONE) - { - x = wpad_StickX(data,0); - y = wpad_StickY(data,0); - } - - /* Retrieve current key mapping */ - u32 *wpad_keymap = config.wpad_keymap[exp + (chan * 3)]; - - /* Emulated device */ - switch (input.dev[i]) - { - case DEVICE_PAD6B: - { - /* Extra buttons */ - if (p & wpad_keymap[KEY_BUTTONX]) input.pad[i] |= INPUT_X; - if (p & wpad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_Y; - if (p & wpad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_Z; - if (p & wpad_keymap[KEY_MODE]) input.pad[i] |= INPUT_MODE; - } - - case DEVICE_PAD3B: - { - /* D- PAD */ - if ((p & wpad_dirmap[exp][PAD_UP]) || (y > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_UP; - else if ((p & wpad_dirmap[exp][PAD_DOWN]) || (y < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_DOWN; - if ((p & wpad_dirmap[exp][PAD_LEFT]) || (x < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_LEFT; - else if ((p & wpad_dirmap[exp][PAD_RIGHT]) || (x > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_RIGHT; - - /* Buttons */ - if (p & wpad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A; - if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B; - if (p & wpad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_C; - if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; - - break; - } - - case DEVICE_XE_A1P: - { - /* Left Stick analog position [0-255] */ - input.analog[i][0] = (x + 128); - input.analog[i][1] = y ? (127 - y) : (128 - y); - - /* Right Stick analog position [0-255] */ - if (exp == WPAD_EXP_CLASSIC) - { - /* Classic Controller right stick */ - x = wpad_StickX(data,1); - y = wpad_StickY(data,1); - - /* Emulated stick is unidirectional but can be rotated */ - if (abs(x) > abs(y)) - { - input.analog[i+1][0] = (x + 128); - } - else - { - input.analog[i+1][0] = (y + 128); - } - } - else - { - /* Wiimote D-PAD */ - if ((p & wpad_dirmap[exp][PAD_DOWN]) || (p & wpad_dirmap[exp][PAD_LEFT])) input.analog[i+1][0]-=2; - else if ((p & wpad_dirmap[exp][PAD_UP]) || (p & wpad_dirmap[exp][PAD_RIGHT])) input.analog[i+1][0]+=2; - - /* Limits */ - if (input.analog[i+1][0] < 0) input.analog[i+1][0] = 0; - else if (input.analog[i+1][0] > 255) input.analog[i+1][0] = 255; - } - - /* Buttons */ - if (p & wpad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_XE_A; - if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_XE_B; - if (p & wpad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_XE_C; - if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_XE_START; - if (p & wpad_keymap[KEY_BUTTONX]) input.pad[i] |= INPUT_XE_D; - if (p & wpad_keymap[KEY_BUTTONY]) input.pad[i] |= INPUT_XE_E1; - if (p & wpad_keymap[KEY_BUTTONZ]) input.pad[i] |= INPUT_XE_E2; - if (p & wpad_keymap[KEY_MODE]) input.pad[i] |= INPUT_XE_SELECT; - - break; - } - - case DEVICE_SPORTSPAD: - { - /* X analog position [0-255] */ - if (p & wpad_dirmap[exp][PAD_LEFT]) input.analog[i][0]-=2; - else if (p & wpad_dirmap[exp][PAD_RIGHT]) input.analog[i][0]+=2; - else input.analog[i][0] = (x + 128); - - /* Y analog position [0-255] */ - if (p & wpad_dirmap[exp][PAD_UP]) input.analog[i][1]-=2; - else if (p & wpad_dirmap[exp][PAD_DOWN]) input.analog[i][1]+=2; - else input.analog[i][1] = y ? (127 - y) : (128 - y); - - /* Limits */ - if (input.analog[i][0] < 0) input.analog[i][0] = 0; - else if (input.analog[i][0] > 255) input.analog[i][0] = 255; - if (input.analog[i][1] < 0) input.analog[i][1] = 0; - else if (input.analog[i][1] > 255) input.analog[i][1] = 255; - - /* Buttons */ - if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_BUTTON1; - if (p & wpad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_BUTTON2; - if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; - - break; - } - - case DEVICE_PADDLE: - { - /* X analog position [0-255] */ - if (exp == WPAD_EXP_NONE) - { - /* Wiimote D-PAD */ - if (p & wpad_dirmap[exp][PAD_LEFT]) input.analog[i][0]-=2; - else if (p & wpad_dirmap[exp][PAD_RIGHT]) input.analog[i][0]+=2; - - /* Limits */ - if (input.analog[i][0] < 0) input.analog[i][0] = 0; - else if (input.analog[i][0] > 255) input.analog[i][0] = 255; - } - else - { - /* Left analog stick */ - input.analog[i][0] = (x + 128); - } - - /* Buttons */ - if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_BUTTON1; - if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; - - break; - } - - case DEVICE_PAD2B: - { - /* D-PAD */ - if ((p & wpad_dirmap[exp][PAD_UP]) || (y > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_UP; - else if ((p & wpad_dirmap[exp][PAD_DOWN]) || (y < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_DOWN; - if ((p & wpad_dirmap[exp][PAD_LEFT]) || (x < -ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_LEFT; - else if ((p & wpad_dirmap[exp][PAD_RIGHT]) || (x > ANALOG_SENSITIVITY)) input.pad[i] |= INPUT_RIGHT; - - /* Buttons */ - if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_BUTTON1; - if (p & wpad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_BUTTON2; - if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; - - break; - } - - case DEVICE_LIGHTGUN: - { - /* Gun screen position (x,y) */ - if (exp != WPAD_EXP_CLASSIC) - { - /* Wiimote IR */ - struct ir_t ir; - WPAD_IR(chan, &ir); - - if (ir.valid) - { - /* screen position */ - input.analog[i][0] = (ir.x * bitmap.viewport.w) / 640; - input.analog[i][1] = (ir.y * bitmap.viewport.h) / 480; - } - else - { - /* lightgun should point outside screen area */ - input.analog[i][0] = 512; - input.analog[i][1] = 512; - } - } - else - { - /* Classic Controller analog stick */ - input.analog[i][0] += x / ANALOG_SENSITIVITY; - input.analog[i][1] -= y / ANALOG_SENSITIVITY; - - /* Limits */ - if (input.analog[i][0] < 0) input.analog[i][0] = 0; - else if (input.analog[i][0] > bitmap.viewport.w) input.analog[i][0] = bitmap.viewport.w; - if (input.analog[i][1] < 0) input.analog[i][1] = 0; - else if (input.analog[i][1] > bitmap.viewport.h) input.analog[i][1] = bitmap.viewport.h; - } - - /* Buttons */ - if (p & wpad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_A; - if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_B; - if (p & wpad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_C; - if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; - - break; - } - - case DEVICE_MOUSE: - { - /* Mouse relative movement (-255,255) */ - input.analog[i][0] = (x / ANALOG_SENSITIVITY) * 2; - input.analog[i][1] = (y / ANALOG_SENSITIVITY) * 2; - - /* Wiimote IR (buggy) */ - if (exp != WPAD_EXP_CLASSIC) - { - struct ir_t ir; - WPAD_IR(chan, &ir); - - /* Only if Wiimote is pointed to screen */ - if(ir.smooth_valid) - { - input.analog[i][0] = (int)((ir.sx - 512) / 2 / ANALOG_SENSITIVITY); - input.analog[i][1] = (int)((ir.sy - 384) * 2 / 3 / ANALOG_SENSITIVITY); - } - } - - /* USB mouse support */ - if (MOUSE_IsConnected()) - { - /* read mouse data */ - mouse_event event; - MOUSE_GetEvent(&event); - MOUSE_FlushEvents(); - - /* mouse position (-127;+127) -> (-255;+255) */ - input.analog[i][0] = event.rx * 2; - input.analog[i][1] = event.ry * 2; - - /* mouse buttons */ - if (event.button & 1) input.pad[i] |= INPUT_MOUSE_RIGHT; - if (event.button & 2) input.pad[i] |= INPUT_MOUSE_CENTER; - if (event.button & 4) input.pad[i] |= INPUT_MOUSE_LEFT; - } - - /* Y-Axis inversion */ - if (config.invert_mouse) - { - input.analog[i][1] = -input.analog[i][1]; - } - - /* Buttons */ - if (p & wpad_keymap[KEY_BUTTONA]) input.pad[i] |= INPUT_MOUSE_CENTER; - if (p & wpad_keymap[KEY_BUTTONB]) input.pad[i] |= INPUT_MOUSE_LEFT; - if (p & wpad_keymap[KEY_BUTTONC]) input.pad[i] |= INPUT_MOUSE_RIGHT; - if (p & wpad_keymap[KEY_START]) input.pad[i] |= INPUT_START; - - break; - } - - case DEVICE_PICO: - { - /* D-PAD */ - if (p & PAD_BUTTON_UP) input.pad[i] |= INPUT_UP; - else if (p & PAD_BUTTON_DOWN) input.pad[i] |= INPUT_DOWN; - if (p & PAD_BUTTON_LEFT) input.pad[i] |= INPUT_LEFT; - else if (p & PAD_BUTTON_RIGHT) input.pad[i] |= INPUT_RIGHT; - - /* PEN screen position (x,y) */ - input.analog[0][0] += x / ANALOG_SENSITIVITY; - input.analog[0][1] -= y / ANALOG_SENSITIVITY; - - /* Limits */ - if (input.analog[0][0] < 0x17c) input.analog[0][0] = 0x17c; - else if (input.analog[0][0] > 0x3c) input.analog[0][0] = 0x3c; - if (input.analog[0][1] < 0x1fc) input.analog[0][1] = 0x1fc; - else if (input.analog[0][1] > 0x3f3) input.analog[0][1] = 0x3f3; - - /* Wiimote IR */ - if (exp != WPAD_EXP_CLASSIC) - { - struct ir_t ir; - WPAD_IR(chan, &ir); - if (ir.valid) - { - input.analog[0][0] = 0x3c + (ir.x * (0x17c - 0x3c + 1)) / 640; - input.analog[0][1] = 0x1fc + (ir.y * (0x3f3 - 0x1fc + 1)) / 480; - } - } - - /* PEN button */ - if (p & wpad_keymap[KEY_BUTTONA]) input.pad[0] |= INPUT_PICO_PEN; - - /* RED button */ - if (p & wpad_keymap[KEY_BUTTONB]) input.pad[0] |= INPUT_PICO_RED; - - /* PAGE index increment */ - if (p & wpad_keymap[KEY_BUTTONC]) pico_current = (pico_current + 1) & 7; - - break; - } - - case DEVICE_TEREBI: - { - /* PEN screen position (x,y) */ - input.analog[0][0] += x / ANALOG_SENSITIVITY; - input.analog[0][1] -= y / ANALOG_SENSITIVITY; - - /* Limits */ - if (input.analog[0][0] < 0) input.analog[0][0] = 0; - else if (input.analog[0][0] > 250) input.analog[0][0] = 250; - if (input.analog[0][1] < 0) input.analog[0][1] = 0; - else if (input.analog[0][1] > 250) input.analog[0][1] = 250; - - /* Wiimote IR */ - if (exp != WPAD_EXP_CLASSIC) - { - struct ir_t ir; - WPAD_IR(chan, &ir); - if (ir.valid) - { - input.analog[0][0] = (ir.x * 250) / 640; - input.analog[0][1] = (ir.y * 250) / 480; - } - } - - /* PEN button */ - if (p & wpad_keymap[KEY_BUTTONA]) input.pad[0] |= INPUT_BUTTON1; - - break; - } - - case DEVICE_ACTIVATOR: - { - /* Classic Controller only */ - if (exp == WPAD_EXP_CLASSIC) - { - /* Left stick */ - float mag = data->exp.classic.ljs.mag; - float ang = data->exp.classic.ljs.ang; - - if (mag > 0.5) - { - /* 8 bottom sensors = 8 areas */ - if ((ang > 22.5) && (ang <= 67.5)) input.pad[i] |= INPUT_ACTIVATOR_2L; - else if ((ang > 67.5) && (ang <= 112.5)) input.pad[i] |= INPUT_ACTIVATOR_3L; - else if ((ang > 112.5) && (ang <= 157.5)) input.pad[i] |= INPUT_ACTIVATOR_4L; - else if ((ang > 157.5) && (ang <= 202.5)) input.pad[i] |= INPUT_ACTIVATOR_5L; - else if ((ang > 202.5) && (ang <= 247.5)) input.pad[i] |= INPUT_ACTIVATOR_6L; - else if ((ang > 247.5) && (ang <= 292.5)) input.pad[i] |= INPUT_ACTIVATOR_7L; - else if ((ang > 292.5) && (ang <= 337.5)) input.pad[i] |= INPUT_ACTIVATOR_8L; - else input.pad[i] |= INPUT_ACTIVATOR_1L; - } - - /* Right stick */ - mag = data->exp.classic.rjs.mag; - ang = data->exp.classic.rjs.ang; - - if (mag > 0.5) - { - /* 8 top sensors = 8 areas */ - if ((ang > 22.5) && (ang <= 67.5)) input.pad[i] |= INPUT_ACTIVATOR_2U; - else if ((ang > 67.5) && (ang <= 112.5)) input.pad[i] |= INPUT_ACTIVATOR_3U; - else if ((ang > 112.5) && (ang <= 157.5)) input.pad[i] |= INPUT_ACTIVATOR_4U; - else if ((ang > 157.5) && (ang <= 202.5)) input.pad[i] |= INPUT_ACTIVATOR_5U; - else if ((ang > 202.5) && (ang <= 247.5)) input.pad[i] |= INPUT_ACTIVATOR_6U; - else if ((ang > 247.5) && (ang <= 292.5)) input.pad[i] |= INPUT_ACTIVATOR_7U; - else if ((ang > 292.5) && (ang <= 337.5)) input.pad[i] |= INPUT_ACTIVATOR_8U; - else input.pad[i] |= INPUT_ACTIVATOR_1U; - } - } - - break; - } - } -} -#endif - - -/***************************************************************************************/ -/* GX Input interface */ -/***************************************************************************************/ -void gx_input_Init(void) -{ - PAD_Init(); -#ifdef HW_RVL - WPAD_Init(); - WPAD_SetIdleTimeout(60); - WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR); - WPAD_SetVRes(WPAD_CHAN_ALL,640,480); -#endif -} - -int gx_input_FindDevices(void) -{ - int i; -#ifdef HW_RVL - u32 wpad; -#endif - int found = 0; - int player = 0; - - VIDEO_WaitVSync(); - u32 pad = PAD_ScanPads(); - - for (i=0; i 0) - { - wpad_update(config.input[player].port, i, config.input[player].device - 1); - } -#endif - - /* increment player index */ - player ++; - } - } - - /* Update RAM patches */ - RAMCheatUpdate(); -} - -/* Menu inputs update function */ -void gx_input_UpdateMenu(void) -{ - /* Check if inputs update are disabled */ - if (inputs_disabled) return; - - /* PAD status update */ - PAD_ScanPads(); - - /* PAD pressed keys */ - s16 pp = PAD_ButtonsDown(0); - - /* PAD held keys (direction/selection) */ - s16 hp = PAD_ButtonsHeld(0) & PAD_BUTTONS_HELD; - - /* PAD analog sticks (handled as PAD held direction keys) */ - s8 x = PAD_StickX(0); - s8 y = PAD_StickY(0); - if (x > ANALOG_SENSITIVITY) hp |= PAD_BUTTON_RIGHT; - else if (x < -ANALOG_SENSITIVITY) hp |= PAD_BUTTON_LEFT; - else if (y > ANALOG_SENSITIVITY) hp |= PAD_BUTTON_UP; - else if (y < -ANALOG_SENSITIVITY) hp |= PAD_BUTTON_DOWN; - -#ifdef HW_RVL - /* WPAD status update */ - WPAD_ScanPads(); - WPADData *data = WPAD_Data(0); - - /* WPAD pressed keys */ - u32 pw = data->btns_d; - - /* WPAD held keys (direction/selection) */ - u32 hw = data->btns_h & WPAD_BUTTONS_HELD; - - /* WPAD analog sticks (handled as PAD held direction keys) */ - x = wpad_StickX(data, 0); - y = wpad_StickY(data, 0); - if (x > ANALOG_SENSITIVITY) hp |= PAD_BUTTON_RIGHT; - else if (x < -ANALOG_SENSITIVITY) hp |= PAD_BUTTON_LEFT; - else if (y > ANALOG_SENSITIVITY) hp |= PAD_BUTTON_UP; - else if (y < -ANALOG_SENSITIVITY) hp |= PAD_BUTTON_DOWN; -#endif - - /* check if any direction/selection key is being held or just being pressed/released */ -#ifdef HW_RVL - if (pp||pw) held_cnt = 0; - else if (hp||hw) held_cnt++; - else held_cnt = 0; -#else - if (pp) held_cnt = 0; - else if (hp) held_cnt++; - else held_cnt = 0; -#endif - - /* initial delay (prevents triggering to start immediately) */ - if (held_cnt > HELD_DELAY) - { - /* key triggering */ - pp |= hp; -#ifdef HW_RVL - pw |= hw; -#endif - - /* delay until next triggering (adjusts direction/selection update speed) */ - held_cnt -= HELD_SPEED; - } - -#ifdef HW_RVL - /* Wiimote direction keys */ - WPAD_IR(0, &m_input.ir); - if (m_input.ir.valid) - { - /* Wiimote is handled vertically */ - if (pw & WPAD_BUTTON_UP) pp |= PAD_BUTTON_UP; - else if (pw & WPAD_BUTTON_DOWN) pp |= PAD_BUTTON_DOWN; - else if (pw & WPAD_BUTTON_LEFT) pp |= PAD_BUTTON_LEFT; - else if (pw & WPAD_BUTTON_RIGHT) pp |= PAD_BUTTON_RIGHT; - } - else - { - /* Wiimote is handled horizontally */ - if (pw & WPAD_BUTTON_UP) pp |= PAD_BUTTON_LEFT; - else if (pw & WPAD_BUTTON_DOWN) pp |= PAD_BUTTON_RIGHT; - else if (pw & WPAD_BUTTON_LEFT) pp |= PAD_BUTTON_DOWN; - else if (pw & WPAD_BUTTON_RIGHT) pp |= PAD_BUTTON_UP; - } - - /* Classic Controller direction keys */ - if (pw & WPAD_CLASSIC_BUTTON_UP) pp |= PAD_BUTTON_UP; - else if (pw & WPAD_CLASSIC_BUTTON_DOWN) pp |= PAD_BUTTON_DOWN; - else if (pw & WPAD_CLASSIC_BUTTON_LEFT) pp |= PAD_BUTTON_LEFT; - else if (pw & WPAD_CLASSIC_BUTTON_RIGHT) pp |= PAD_BUTTON_RIGHT; - - /* WPAD buttons */ - if (pw & WPAD_BUTTON_A) pp |= PAD_BUTTON_A; - if (pw & WPAD_BUTTON_B) pp |= PAD_BUTTON_B; - if (pw & WPAD_BUTTON_2) pp |= PAD_BUTTON_A; - if (pw & WPAD_BUTTON_1) pp |= PAD_BUTTON_B; - if (pw & WPAD_BUTTON_HOME) pp |= PAD_TRIGGER_Z; - if (pw & WPAD_BUTTON_PLUS) pp |= PAD_TRIGGER_L; - if (pw & WPAD_BUTTON_MINUS) pp |= PAD_TRIGGER_R; - if (pw & WPAD_CLASSIC_BUTTON_FULL_L) pp |= PAD_TRIGGER_L; - if (pw & WPAD_CLASSIC_BUTTON_FULL_R) pp |= PAD_TRIGGER_R; - if (pw & WPAD_CLASSIC_BUTTON_A) pp |= PAD_BUTTON_A; - if (pw & WPAD_CLASSIC_BUTTON_B) pp |= PAD_BUTTON_B; - if (pw & WPAD_CLASSIC_BUTTON_HOME) pp |= PAD_TRIGGER_Z; -#endif - - /* Update menu inputs */ - m_input.keys = pp; -} diff --git a/genplus-gx/gx/gx_input.h b/genplus-gx/gx/gx_input.h deleted file mode 100644 index 77143b465e..0000000000 --- a/genplus-gx/gx/gx_input.h +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** - * gx_input.c - * - * Genesis Plus GX input support - * - * Copyright Eke-Eke (2007-2013) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifndef _GC_INPUT_H_ -#define _GC_INPUT_H_ - -#define osd_input_update() gx_input_UpdateEmu() - -/* max. supported inputs */ -#ifdef HW_RVL -#define MAX_INPUTS 8 -#else -#define MAX_INPUTS 4 -#endif - -/* Configurable keys */ -#define MAX_KEYS 8 - - -/* Key configuration structure */ -typedef struct -{ - s8 device; - u8 port; - u8 padtype; -} t_input_config; - - -extern void gx_input_Init(void); -extern int gx_input_FindDevices(void); -extern void gx_input_SetDefault(void); -extern void gx_input_Config(u8 chan, u8 device, u8 type); -extern void gx_input_UpdateEmu(void); -extern void gx_input_UpdateMenu(void); - -#endif diff --git a/genplus-gx/gx/gx_video.c b/genplus-gx/gx/gx_video.c deleted file mode 100644 index 5521b238df..0000000000 --- a/genplus-gx/gx/gx_video.c +++ /dev/null @@ -1,2041 +0,0 @@ -/**************************************************************************** - * gx_video.c - * - * Genesis Plus GX video & rendering support - * - * Copyright Eke-Eke (2007-2013), based on original work from Softdev (2006) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#include "shared.h" -#include "font.h" -#include "md_ntsc.h" -#include "sms_ntsc.h" -#include "gx_input.h" - -#include -#include - -#define TEX_WIDTH 720 -#define TEX_HEIGHT 576 -#define TEX_SIZE (TEX_WIDTH * TEX_HEIGHT * 2) -#define DEFAULT_FIFO_SIZE 256 * 1024 -#define HASPECT 320 -#define VASPECT 240 - -/* libpng wrapper */ -typedef struct -{ - u8 *buffer; - u32 offset; -} png_image; - -extern const u8 Crosshair_p1_png[]; -extern const u8 Crosshair_p2_png[]; -extern const u8 CD_access_off_png[]; -extern const u8 CD_access_on_png[]; -extern const u8 CD_ready_off_png[]; -extern const u8 CD_ready_on_png[]; - -/*** VI ***/ -GXRModeObj *vmode; /* Default Video Mode */ -u8 *texturemem; /* Texture Data */ -u8 *screenshot; /* Texture Data */ - -/*** 50/60hz flag ***/ -u32 gc_pal; - -/*** NTSC Filters ***/ -sms_ntsc_t *sms_ntsc; -md_ntsc_t *md_ntsc; - -/*** GX FIFO ***/ -static u8 gp_fifo[DEFAULT_FIFO_SIZE] ATTRIBUTE_ALIGN (32); - -/*** GX Textures ***/ -static u32 vwidth, vheight; -static gx_texture *crosshair[2]; -static gx_texture *cd_leds[2][2]; - -/*** Framebuffers ***/ -static u32 *xfb[2]; -static u32 whichfb = 0; - -/*** Frame Sync ***/ -u32 videoSync; -static u32 videoWait; -static u32 frameCount; -static u64 starttime; - -/*** OSD ***/ -static u32 osd; -static char msg[16]; - -/***************************************************************************************/ -/* Emulation video modes */ -/***************************************************************************************/ -static GXRModeObj *rmode; - -/* 288 lines progressive (PAL 50Hz) */ -static GXRModeObj TV50hz_288p = -{ - VI_TVMODE_PAL_DS, // viDisplayMode - 640, // fbWidth - VI_MAX_HEIGHT_PAL/2, // efbHeight - VI_MAX_HEIGHT_PAL/2, // xfbHeight - 0, // viXOrigin - 0, // viYOrigin - VI_MAX_WIDTH_PAL, // viWidth - VI_MAX_HEIGHT_PAL, // viHeight - VI_XFBMODE_SF, // xFBmode - GX_FALSE, // field_rendering - GX_FALSE, // aa - - // sample points arranged in increasing Y order - { - {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each - {6,6},{6,6},{6,6}, // pix 1 - {6,6},{6,6},{6,6}, // pix 2 - {6,6},{6,6},{6,6} // pix 3 - }, - - // vertical filter[7], 1/64 units, 6 bits each - { - 0, // line n-1 - 0, // line n-1 - 21, // line n - 22, // line n - 21, // line n - 0, // line n+1 - 0 // line n+1 - } -}; - -/* 288 lines interlaced (PAL 50Hz) */ -static GXRModeObj TV50hz_288i = -{ - VI_TVMODE_PAL_INT, // viDisplayMode - 640, // fbWidth - VI_MAX_HEIGHT_PAL/2, // efbHeight - VI_MAX_HEIGHT_PAL/2, // xfbHeight - 0, // viXOrigin - 0, // viYOrigin - VI_MAX_WIDTH_PAL, // viWidth - VI_MAX_HEIGHT_PAL, // viHeight - VI_XFBMODE_SF, // xFBmode - GX_TRUE, // field_rendering - GX_FALSE, // aa - - // sample points arranged in increasing Y order - { - {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each - {6,6},{6,6},{6,6}, // pix 1 - {6,6},{6,6},{6,6}, // pix 2 - {6,6},{6,6},{6,6} // pix 3 - }, - - // vertical filter[7], 1/64 units, 6 bits each - { - 0, // line n-1 - 0, // line n-1 - 21, // line n - 22, // line n - 21, // line n - 0, // line n+1 - 0 // line n+1 - } -}; - -/* 576 lines interlaced (PAL 50Hz, scaled) */ -static GXRModeObj TV50hz_576i = -{ - VI_TVMODE_PAL_INT, // viDisplayMode - 640, // fbWidth - 480, // efbHeight - VI_MAX_HEIGHT_PAL, // xfbHeight - 0, // viXOrigin - 0, // viYOrigin - VI_MAX_WIDTH_PAL, // viWidth - VI_MAX_HEIGHT_PAL, // viHeight - VI_XFBMODE_DF, // xFBmode - GX_FALSE, // field_rendering - GX_FALSE, // aa - - // sample points arranged in increasing Y order - { - {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each - {6,6},{6,6},{6,6}, // pix 1 - {6,6},{6,6},{6,6}, // pix 2 - {6,6},{6,6},{6,6} // pix 3 - }, - - // vertical filter[7], 1/64 units, 6 bits each - { - 8, // line n-1 - 8, // line n-1 - 10, // line n - 12, // line n - 10, // line n - 8, // line n+1 - 8 // line n+1 - } -}; - -/* 240 lines progressive (NTSC or PAL 60Hz) */ -static GXRModeObj TV60hz_240p = -{ - VI_TVMODE_EURGB60_DS, // viDisplayMode - 640, // fbWidth - VI_MAX_HEIGHT_NTSC/2, // efbHeight - VI_MAX_HEIGHT_NTSC/2, // xfbHeight - 0, // viXOrigin - 0, // viYOrigin - VI_MAX_WIDTH_NTSC, // viWidth - VI_MAX_HEIGHT_NTSC, // viHeight - VI_XFBMODE_SF, // xFBmode - GX_FALSE, // field_rendering - GX_FALSE, // aa - - // sample points arranged in increasing Y order - { - {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each - {6,6},{6,6},{6,6}, // pix 1 - {6,6},{6,6},{6,6}, // pix 2 - {6,6},{6,6},{6,6} // pix 3 - }, - - // vertical filter[7], 1/64 units, 6 bits each - { - 0, // line n-1 - 0, // line n-1 - 21, // line n - 22, // line n - 21, // line n - 0, // line n+1 - 0 // line n+1 - } -}; - -/* 240 lines interlaced (NTSC or PAL 60Hz) */ -static GXRModeObj TV60hz_240i = -{ - VI_TVMODE_EURGB60_INT, // viDisplayMode - 640, // fbWidth - VI_MAX_HEIGHT_NTSC/2, // efbHeight - VI_MAX_HEIGHT_NTSC/2, // xfbHeight - 0, // viXOrigin - 0, // viYOrigin - VI_MAX_WIDTH_NTSC, // viWidth - VI_MAX_HEIGHT_NTSC, // viHeight - VI_XFBMODE_SF, // xFBmode - GX_TRUE, // field_rendering - GX_FALSE, // aa - - // sample points arranged in increasing Y order - { - {3,2},{9,6},{3,10}, // pix 0, 3 sample points, 1/12 units, 4 bits each - {3,2},{9,6},{3,10}, // pix 1 - {9,2},{3,6},{9,10}, // pix 2 - {9,2},{3,6},{9,10} // pix 3 - }, - - // vertical filter[7], 1/64 units, 6 bits each - { - 0, // line n-1 - 0, // line n-1 - 21, // line n - 22, // line n - 21, // line n - 0, // line n+1 - 0 // line n+1 - } -}; - -/* 480 lines interlaced (NTSC or PAL 60Hz) */ -static GXRModeObj TV60hz_480i = -{ - VI_TVMODE_EURGB60_INT,// viDisplayMode - 640, // fbWidth - VI_MAX_HEIGHT_NTSC, // efbHeight - VI_MAX_HEIGHT_NTSC, // xfbHeight - 0, // viXOrigin - 0, // viYOrigin - VI_MAX_WIDTH_NTSC, // viWidth - VI_MAX_HEIGHT_NTSC, // viHeight - VI_XFBMODE_DF, // xFBmode - GX_FALSE, // field_rendering - GX_FALSE, // aa - - // sample points arranged in increasing Y order - { - {6,6},{6,6},{6,6}, // pix 0, 3 sample points, 1/12 units, 4 bits each - {6,6},{6,6},{6,6}, // pix 1 - {6,6},{6,6},{6,6}, // pix 2 - {6,6},{6,6},{6,6} // pix 3 - }, - - // vertical filter[7], 1/64 units, 6 bits each - { - 8, // line n-1 - 8, // line n-1 - 10, // line n - 12, // line n - 10, // line n - 8, // line n+1 - 8 // line n+1 - } -}; - -/* TV modes pointer table */ -static GXRModeObj *tvmodes[6] = -{ - /* 60hz modes */ - &TV60hz_240p, - &TV60hz_240i, - &TV60hz_480i, - - /* 50Hz modes */ - &TV50hz_288p, - &TV50hz_288i, - &TV50hz_576i -}; - -/***************************************************************************************/ -/* GX rendering engine */ -/***************************************************************************************/ - -typedef struct tagcamera -{ - guVector pos; - guVector up; - guVector view; -} camera; - -/*** Square Matrix - This structure controls the size of the image on the screen. - Think of the output as a -80 x 80 by -60 x 60 graph. -***/ -static s16 square[] ATTRIBUTE_ALIGN (32) = -{ - /* - * X, Y, Z - * Values set are for roughly 4:3 aspect - */ - -HASPECT, VASPECT, 0, // 0 - HASPECT, VASPECT, 0, // 1 - HASPECT, -VASPECT, 0, // 2 - -HASPECT, -VASPECT, 0, // 3 -}; - -static camera cam = { - {0.0F, 0.0F, -100.0F}, - {0.0F, -1.0F, 0.0F}, - {0.0F, 0.0F, 0.0F} -}; - -/*** GX Display List ***/ -static u8 d_list[32] ATTRIBUTE_ALIGN(32) = -{ - GX_QUADS | GX_VTXFMT0, /* textured quad rendering (Vertex Format 0) */ - 0x00, 0x04, /* one quad = 4x vertex */ - 0x03, 0x00, 0x00, 0x00, 0x00, /* top left corner */ - 0x02, 0x00, 0x01, 0x00, 0x00, /* top right corner */ - 0x01, 0x00, 0x01, 0x00, 0x01, /* bottom right corner */ - 0x00, 0x00, 0x00, 0x00, 0x01, /* bottom left corner */ - 0x00, 0x00, 0x00, 0x00, 0x00, /* padding */ - 0x00, 0x00, 0x00, 0x00 -}; - -/* VSYNC callback */ -static void vi_callback(u32 cnt) -{ - videoWait = 0; -} - -/* Initialize GX */ -static void gxStart(void) -{ - /*** Clear out FIFO area ***/ - memset(&gp_fifo, 0, DEFAULT_FIFO_SIZE); - - /*** GX default ***/ - GX_Init(&gp_fifo, DEFAULT_FIFO_SIZE); - GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); - GX_SetCullMode(GX_CULL_NONE); - GX_SetClipMode(GX_CLIP_DISABLE); - GX_SetDispCopyGamma(GX_GM_1_0); - GX_SetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE); - GX_SetColorUpdate(GX_TRUE); - GX_SetAlphaUpdate(GX_FALSE); - - /* Modelview */ - Mtx view; - memset (&view, 0, sizeof (Mtx)); - guLookAt(view, &cam.pos, &cam.up, &cam.view); - GX_LoadPosMtxImm(view, GX_PNMTX0); - GX_Flush(); -} - -/* Reset GX rendering */ -static void gxResetRendering(u8 type) -{ - GX_ClearVtxDesc(); - - if (type) - { - /* uses direct positionning, alpha blending & color channel (menu rendering) */ - GX_SetBlendMode(GX_BM_BLEND,GX_BL_SRCALPHA,GX_BL_INVSRCALPHA,GX_LO_CLEAR); - GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XY, GX_S16, 0); - GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); - GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); - GX_SetVtxDesc(GX_VA_POS, GX_DIRECT); - GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); - GX_SetVtxDesc (GX_VA_CLR0, GX_DIRECT); - /* - Color.out = Color.rasterized*Color.texture - Alpha.out = Alpha.rasterized*Alpha.texture - */ - GX_SetTevOp (GX_TEVSTAGE0, GX_MODULATE); - GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); - GX_SetNumTexGens(1); - GX_SetNumChans(1); - } - else - { - /* uses array positionning, no alpha blending, no color channel (video emulation) */ - GX_SetBlendMode(GX_BM_NONE,GX_BL_SRCALPHA,GX_BL_INVSRCALPHA,GX_LO_CLEAR); - GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0); - GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_S16, 0); - GX_SetVtxDesc(GX_VA_POS, GX_INDEX8); - GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); - GX_SetArray(GX_VA_POS, square, 3 * sizeof (s16)); - /* - Color.out = Color.texture - Alpha.out = Alpha.texture - */ - GX_SetTevOp (GX_TEVSTAGE0, GX_REPLACE); - GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLORNULL); - GX_SetNumTexGens(1); - GX_SetNumChans(0); - } - - GX_Flush(); -} - -/* Reset GX rendering mode */ -static void gxResetMode(GXRModeObj *tvmode, int vfilter_enabled) -{ - Mtx44 p; - f32 yScale = GX_GetYScaleFactor(tvmode->efbHeight, tvmode->xfbHeight); - u16 xfbHeight = GX_SetDispCopyYScale(yScale); - u16 xfbWidth = VIDEO_PadFramebufferWidth(tvmode->fbWidth); - - GX_SetCopyClear((GXColor)BLACK,0x00ffffff); - GX_SetViewport(0.0F, 0.0F, tvmode->fbWidth, tvmode->efbHeight, 0.0F, 1.0F); - GX_SetScissor(0, 0, tvmode->fbWidth, tvmode->efbHeight); - GX_SetDispCopySrc(0, 0, tvmode->fbWidth, tvmode->efbHeight); - GX_SetDispCopyDst(xfbWidth, xfbHeight); - GX_SetCopyFilter(tvmode->aa, tvmode->sample_pattern, (tvmode->xfbMode == VI_XFBMODE_SF) ? GX_FALSE : vfilter_enabled, tvmode->vfilter); - GX_SetFieldMode(tvmode->field_rendering, ((tvmode->viHeight == 2 * tvmode->xfbHeight) ? GX_ENABLE : GX_DISABLE)); - guOrtho(p, tvmode->efbHeight/2, -(tvmode->efbHeight/2), -(tvmode->fbWidth/2), tvmode->fbWidth/2, 100, 1000); - GX_LoadProjectionMtx(p, GX_ORTHOGRAPHIC); - GX_Flush(); -} - -/* Update Aspect Ratio */ -static void gxSetAspectRatio(int *xscale, int *yscale) -{ - /* Vertical Scaling is disabled by default */ - *yscale = (bitmap.viewport.h + (2 * bitmap.viewport.y)) / 2; - - /* Original aspect ratio */ - if (config.aspect) - { - /* Adjust vertical scaling when input & output video heights are different */ - if (vdp_pal && (!gc_pal || config.render)) - { - *yscale = *yscale * VI_MAX_HEIGHT_NTSC / VI_MAX_HEIGHT_PAL; - } - else if (!vdp_pal && gc_pal && !config.render) - { - *yscale = *yscale * VI_MAX_HEIGHT_PAL / VI_MAX_HEIGHT_NTSC; - } - - /* Horizontal Scaling */ - /* Wii/Gamecube pixel clock = 13.5 Mhz */ - /* "H32" pixel clock = Master Clock / 10 = 5.3693175 Mhz (NTSC) or 5.3203424 (PAL) */ - /* "H40" pixel clock = Master Clock / 8 = 6,711646875 Mhz (NTSC) or 6,650428 Mhz (PAL) */ - if (config.overscan & 2) - { - /* Horizontal borders are emulated */ - if (reg[12] & 1) - { - /* 348 "H40" pixels = 348 * Wii/GC pixel clock / "H40" pixel clock = approx. 700 (NTSC) or 707 (PAL) Wii/GC pixels */ - *xscale = (system_clock == MCLOCK_NTSC) ? 350 : 354; - } - else - { - /* 284 "H32" pixels = 284 * Wii/GC pixel clock / "H40" pixel clock = approx. 714 (NTSC) or 721 (PAL) Wii/GC pixels */ - *xscale = (system_clock == MCLOCK_NTSC) ? 357 : 361; - } - } - else - { - /* Horizontal borders are simulated */ - if ((system_hw == SYSTEM_GG) && !config.gg_extra) - { - /* 160 "H32" pixels = 160 * Wii/GC pixel clock / "H32" pixel clock = approx. 403 Wii/GC pixels (NTSC only) */ - *xscale = 202; - } - else - { - /* 320 "H40" pixels = 256 "H32" pixels = 256 * Wii/GC pixel clock / "H32" pixel clock = approx. 644 (NTSC) or 650 (PAL) Wii/GC pixels */ - *xscale = (system_clock == MCLOCK_NTSC) ? 322 : 325; - } - } - - /* Aspect correction for widescreen TV */ - if (config.aspect & 2) - { - /* Keep 4:3 aspect ratio on 16:9 output */ - *xscale = (*xscale * 3) / 4; - } - } - - /* Manual aspect ratio */ - else - { - /* By default, disable horizontal scaling */ - *xscale = bitmap.viewport.w + (2 * bitmap.viewport.x); - - /* Keep original aspect ratio in H32 modes */ - if (!(reg[12] & 1)) - { - *xscale = (*xscale * 320) / 256; - } - - /* Game Gear specific: if borders are disabled, upscale to fullscreen */ - if ((system_hw == SYSTEM_GG) && !config.gg_extra) - { - if (!(config.overscan & 1)) - { - /* Active area height = approx. 224 non-interlaced lines (60hz) */ - *yscale = 112; - } - - if (!(config.overscan & 2)) - { - /* Active area width = approx. 640 pixels */ - *xscale = 320; - } - } - - /* By default, keep NTSC aspect ratio */ - if (gc_pal && !config.render) - { - /* Upscale PAL output */ - *yscale = *yscale * VI_MAX_HEIGHT_PAL / VI_MAX_HEIGHT_NTSC; - } - - /* Add user scaling */ - *xscale += config.xscale; - *yscale += config.yscale; - } -} - -/* Reset GX/VI hardware scaler */ -static void gxResetScaler(u32 width) -{ - int xscale = 0; - int yscale = 0; - int offset = 0; - - /* retrieve screen aspect ratio */ - gxSetAspectRatio(&xscale, &yscale); - - /* default EFB width */ - rmode->fbWidth = 640; - - /* no filtering, disable GX horizontal scaling */ - if (!config.bilinear && !config.ntsc) - { - if ((width <= 320) && (width <= xscale)) - rmode->fbWidth = width * 2; - else if (width <= 640) - rmode->fbWidth = width; - } - - /* configure VI width */ - if ((xscale * 2) > rmode->fbWidth) - { - /* max width = 720 pixels */ - if (xscale > 360) - { - /* save offset for later */ - offset = ((xscale - 360) * rmode->fbWidth) / rmode->viWidth; - - /* maximal width */ - xscale = 360; - } - - /* enable VI upscaling */ - rmode->viWidth = xscale * 2; - rmode->viXOrigin = (720 - (xscale * 2)) / 2; - - /* default GX horizontal scaling */ - xscale = (rmode->fbWidth / 2); - - /* handle additional upscaling */ - if (offset) - { - /* no filtering, reduce EFB width to increase VI upscaling */ - if (!config.bilinear && !config.ntsc) - rmode->fbWidth -= (offset * 2); - - /* increase GX horizontal scaling */ - else - xscale += offset; - } - } - else - { - /* VI horizontal scaling is disabled */ - rmode->viWidth = rmode->fbWidth; - rmode->viXOrigin = (720 - rmode->fbWidth) / 2; - } - - /* Adjust screen position */ - int xshift = (config.xshift * rmode->fbWidth) / rmode->viWidth; - int yshift = (config.yshift * rmode->efbHeight) / rmode->viHeight; - - /* Double Resolution modes (480i/576i/480p) */ - if (config.render) - { - yscale = yscale * 2; - } - - /* Set GX scaler (Vertex Position matrix) */ - square[6] = square[3] = xshift + xscale; - square[0] = square[9] = xshift - xscale; - square[4] = square[1] = yshift + yscale; - square[7] = square[10] = yshift - yscale; - DCFlushRange(square, 32); - GX_InvVtxCache(); -} - -static void gxDrawCrosshair(gx_texture *texture, int x, int y) -{ - /* adjust texture dimensions to XFB->VI scaling */ - int w = (texture->width * rmode->fbWidth) / (rmode->viWidth); - int h = (texture->height * rmode->efbHeight) / (rmode->viHeight); - - /* Aspect correction for widescreen TV */ - if (config.aspect & 2) w = (w * 3) / 4; - - /* EFB scale & shift */ - int xwidth = square[3] - square[9]; - int ywidth = square[4] - square[10]; - - /* adjust texture coordinates to EFB */ - x = (((x + bitmap.viewport.x) * xwidth) / vwidth) + square[9] - w/2; - y = (((y + bitmap.viewport.y) * ywidth) / vheight) + square[10] - h/2; - - /* load texture object */ - GXTexObj texObj; - GX_InitTexObj(&texObj, texture->data, texture->width, texture->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); - GX_LoadTexObj(&texObj, GX_TEXMAP0); - GX_InvalidateTexAll(); - - /* Draw textured quad */ - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - GX_Position2s16(x,y+h); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(0.0, 1.0); - GX_Position2s16(x+w,y+h); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(1.0, 1.0); - GX_Position2s16(x+w,y); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(1.0, 0.0); - GX_Position2s16(x,y); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(0.0, 0.0); - GX_End(); -} - -static void gxDrawCdLeds(gx_texture *texture_l, gx_texture *texture_r) -{ - /* adjust texture dimensions to XFB->VI scaling */ - int w = (texture_l->width * rmode->fbWidth) / (rmode->viWidth); - int h = (texture_l->height * rmode->efbHeight) / (rmode->viHeight); - - /* Aspect correction for widescreen TV */ - if (config.aspect & 2) w = (w * 3) / 4; - - /* EFB scale & shift */ - int xwidth = square[3] - square[9]; - int ywidth = square[4] - square[10]; - - /* adjust texture coordinates to EFB */ - int xl = ((bitmap.viewport.x * xwidth) / vwidth) + square[9] + 8; - int xr = (((bitmap.viewport.x + bitmap.viewport.w) * xwidth) / vwidth) + square[9] - 8 - w; - int y = (((bitmap.viewport.y + bitmap.viewport.h - 4) * ywidth) / vheight) + square[10] - h; - - /* load left screen texture */ - GXTexObj texObj; - GX_InitTexObj(&texObj, texture_l->data, texture_l->width, texture_l->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); - GX_LoadTexObj(&texObj, GX_TEXMAP0); - GX_InvalidateTexAll(); - - /* Draw textured quad */ - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - GX_Position2s16(xl,y+h); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(0.0, 1.0); - GX_Position2s16(xl+w,y+h); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(1.0, 1.0); - GX_Position2s16(xl+w,y); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(1.0, 0.0); - GX_Position2s16(xl,y); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(0.0, 0.0); - GX_End(); - - /* load right screen texture */ - GX_InitTexObj(&texObj, texture_r->data, texture_r->width, texture_r->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); - GX_LoadTexObj(&texObj, GX_TEXMAP0); - GX_InvalidateTexAll(); - - /* Draw textured quad */ - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - GX_Position2s16(xr,y+h); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(0.0, 1.0); - GX_Position2s16(xr+w,y+h); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(1.0, 1.0); - GX_Position2s16(xr+w,y); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(1.0, 0.0); - GX_Position2s16(xr,y); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(0.0, 0.0); - GX_End(); -} - -static void gxDrawOnScreenText(char *msg) -{ - GXRModeObj *temp = vmode; - int y = (40 * rmode->efbHeight) / 480; - int x = (bitmap.viewport.x > 0) ? (24 + bitmap.viewport.x) : 24; - x = (x * rmode->fbWidth) / rmode->viWidth; - - vmode = rmode; - FONT_write(msg, 20, x, y, rmode->fbWidth, (GXColor)WHITE); - vmode = temp; -} - -void gxDrawRectangle(s32 x, s32 y, s32 w, s32 h, u8 alpha, GXColor color) -{ - /* GX only use Color channel for rendering */ - GX_SetTevOp (GX_TEVSTAGE0, GX_PASSCLR); - GX_SetVtxDesc (GX_VA_TEX0, GX_NONE); - GX_Flush(); - - /* vertex coordinate */ - x -= (vmode->fbWidth/2); - y -= (vmode->efbHeight/2); - - /* draw colored quad */ - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - GX_Position2s16(x,y+h); - GX_Color4u8(color.r,color.g,color.b,alpha); - GX_Position2s16(x+w,y+h); - GX_Color4u8(color.r,color.g,color.b,alpha); - GX_Position2s16(x+w,y); - GX_Color4u8(color.r,color.g,color.b,alpha); - GX_Position2s16(x,y); - GX_Color4u8(color.r,color.g,color.b,alpha); - GX_End(); - GX_DrawDone(); - - /* restore GX rendering */ - GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); - GX_SetTevOp (GX_TEVSTAGE0, GX_MODULATE); - GX_Flush(); -} - -void gxDrawTexture(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha) -{ - if (!texture) return; - if (texture->data) - { - /* load texture object */ - GXTexObj texObj; - GX_InitTexObj(&texObj, texture->data, texture->width, texture->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); /* does this really change anything ? */ - GX_LoadTexObj(&texObj, GX_TEXMAP0); - GX_InvalidateTexAll(); - - /* vertex coordinate */ - x -= (vmode->fbWidth/2); - y -= (vmode->efbHeight/2); - - /* draw textured quad */ - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - GX_Position2s16(x,y+h); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(0.0, 1.0); - GX_Position2s16(x+w,y+h); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(1.0, 1.0); - GX_Position2s16(x+w,y); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(1.0, 0.0); - GX_Position2s16(x,y); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(0.0, 0.0); - GX_End(); - GX_DrawDone(); - } -} - -void gxDrawTextureRotate(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, f32 angle, u8 alpha) -{ - if (!texture) return; - if (texture->data) - { - /* load texture object */ - GXTexObj texObj; - GX_InitTexObj(&texObj, texture->data, texture->width, texture->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); - GX_LoadTexObj(&texObj, GX_TEXMAP0); - GX_InvalidateTexAll(); - - /* vertex coordinate */ - x -= (vmode->fbWidth/2); - y -= (vmode->efbHeight/2); - - /* Modelview rotation */ - Mtx m,mv; - guVector axis = (guVector) {0,0,1}; - guLookAt(mv, &cam.pos, &cam.up, &cam.view); - guMtxRotAxisDeg (m, &axis, angle); - guMtxTransApply(m,m, x+w/2,y+h/2,0); - guMtxConcat(mv,m,mv); - GX_LoadPosMtxImm(mv, GX_PNMTX0); - GX_Flush(); - - /* draw textured quad */ - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - GX_Position2s16(-w/2,-h/2); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(0.0, 0.0); - GX_Position2s16(w/2,-h/2); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(1.0, 0.0); - GX_Position2s16(w/2,h/2); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(1.0, 1.0); - GX_Position2s16(-w/2,h/2); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(0.0, 1.0); - GX_End(); - GX_DrawDone(); - - /* restore default Modelview */ - guLookAt(mv, &cam.pos, &cam.up, &cam.view); - GX_LoadPosMtxImm(mv, GX_PNMTX0); - GX_Flush(); - } -} - -void gxDrawTextureRepeat(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha) -{ - if (!texture) return; - if (texture->data) - { - /* load texture object */ - GXTexObj texObj; - GX_InitTexObj(&texObj, texture->data, texture->width, texture->height, GX_TF_RGBA8, GX_REPEAT, GX_REPEAT, GX_FALSE); - GX_LoadTexObj(&texObj, GX_TEXMAP0); - GX_InvalidateTexAll(); - - /* vertex coordinate */ - x -= (vmode->fbWidth/2); - y -= (vmode->efbHeight/2); - - /* texture coordinates */ - f32 s = (f32)w / (f32)texture->width; - f32 t = (f32)h / (f32)texture->height; - - /* draw textured quad */ - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - GX_Position2s16(x,y+h); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(0.0, t); - GX_Position2s16(x+w,y+h); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(s, t); - GX_Position2s16(x+w,y); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(s, 0.0); - GX_Position2s16(x,y); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(0.0, 0.0); - GX_End(); - GX_DrawDone(); - } -} - -void gxDrawScreenshot(u8 alpha) -{ - if (!rmode) return; - - /* get current game screen texture */ - GXTexObj texobj; - GX_InitTexObj(&texobj, texturemem, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_LoadTexObj(&texobj, GX_TEXMAP0); - GX_InvalidateTexAll(); - - /* get current aspect ratio */ - int xscale,yscale; - gxSetAspectRatio(&xscale, &yscale); - - /* adjust horizontal scaling */ - xscale = (xscale * vmode->fbWidth) / vmode->viWidth; - - /* adjust screen position */ - int xshift = (config.xshift * vmode->fbWidth) / vmode->viWidth; - int yshift = (config.yshift * vmode->efbHeight) / vmode->viHeight; - - /* set vertices position & size */ - s32 x = xshift - xscale; - s32 y = yshift - (yscale * 2); - s32 w = xscale * 2; - s32 h = yscale * 4; - - /* black out surrounding area if necessary (Game Gear without borders) */ - if ((w < 640) || (h < 480)) - { - gxDrawRectangle(0, 0, 640, 480, 255, (GXColor)BLACK); - } - - /* draw textured quad */ - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - GX_Position2s16(x,y+h); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(0.0, 1.0); - GX_Position2s16(x+w,y+h); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(1.0, 1.0); - GX_Position2s16(x+w,y); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(1.0, 0.0); - GX_Position2s16(x,y); - GX_Color4u8(0xff,0xff,0xff,alpha); - GX_TexCoord2f32(0.0, 0.0); - GX_End(); - GX_DrawDone(); -} - -void gxCopyScreenshot(gx_texture *texture) -{ - /* retrieve gamescreen texture */ - GXTexObj texobj; - GX_InitTexObj(&texobj, texturemem, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_LoadTexObj(&texobj, GX_TEXMAP0); - GX_InvalidateTexAll(); - - /* scale texture to EFB width */ - s32 w = ((bitmap.viewport.w + 2*bitmap.viewport.x) * 640) / bitmap.viewport.w; - s32 h = (bitmap.viewport.h + 2*bitmap.viewport.y) * 2; - s32 x = -w/2; - s32 y = -(240+ 2*bitmap.viewport.y); - - /* black out surrounding area if necessary (Game Gear without borders) */ - if ((w < 640) || (h < 480)) - { - gxDrawRectangle(0, 0, 640, 480, 255, (GXColor)BLACK); - } - - /* draw textured quad */ - GX_Begin(GX_QUADS, GX_VTXFMT0, 4); - GX_Position2s16(x,y+h); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(0.0, 1.0); - GX_Position2s16(x+w,y+h); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(1.0, 1.0); - GX_Position2s16(x+w,y); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(1.0, 0.0); - GX_Position2s16(x,y); - GX_Color4u8(0xff,0xff,0xff,0xff); - GX_TexCoord2f32(0.0, 0.0); - GX_End(); - - /* copy EFB to texture */ - texture->format = GX_TF_RGBA8; - texture->width = 320; - texture->height = bitmap.viewport.h; - texture->data = screenshot; - GX_SetTexCopySrc(0, 0, texture->width * 2, texture->height * 2); - GX_SetTexCopyDst(texture->width, texture->height, texture->format, GX_TRUE); - GX_DrawDone(); - GX_CopyTex(texture->data, GX_TRUE); - GX_Flush(); - - /* wait for copy operation to finish */ - /* GX_PixModeSync is only useful if GX_ command follows */ - /* we use dummy GX commands to stall CPU execution */ - GX_PixModeSync(); - GX_LoadTexObj(&texobj, GX_TEXMAP0); - GX_InvalidateTexAll(); - GX_Flush(); - DCFlushRange(texture->data, texture->width * texture->height * 4); -} - -/* Take Screenshot */ -void gxSaveScreenshot(char *filename) -{ - /* capture screenshot into a texture */ - gx_texture texture; - gxCopyScreenshot(&texture); - - /* open PNG file */ - FILE *f = fopen(filename,"wb"); - if (f) - { - /* encode screenshot into PNG file */ - gxTextureWritePNG(&texture,f); - fclose(f); - } -} - -void gxSetScreen(void) -{ - GX_DrawDone(); - GX_CopyDisp(xfb[whichfb], GX_FALSE); - GX_Flush(); - VIDEO_SetNextFramebuffer (xfb[whichfb]); - VIDEO_Flush (); - VIDEO_WaitVSync (); - gx_input_UpdateMenu(); -} - -void gxClearScreen(GXColor color) -{ - whichfb ^= 1; - GX_SetCopyClear(color,0x00ffffff); - GX_CopyDisp(xfb[whichfb], GX_TRUE); - GX_Flush(); -} - -/***************************************************************************************/ -/* GX Texture <-> LibPNG routines */ -/***************************************************************************************/ - -/* libpng read callback function */ -static void png_read_from_mem (png_structp png_ptr, png_bytep data, png_size_t length) -{ - png_image *image = (png_image *)png_get_io_ptr(png_ptr); - - /* copy data from image buffer */ - memcpy (data, image->buffer + image->offset, length); - - /* advance in the file */ - image->offset += length; -} - -/* convert PNG image (from file or data buffer) into RGBA8 texture */ -gx_texture *gxTextureOpenPNG(const u8 *png_data, FILE *png_file) -{ - int i; - - /* create a png read struct */ - png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL); - if (!png_ptr) return NULL; - - /* create a png info struct */ - png_infop info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) - { - png_destroy_read_struct(&png_ptr,NULL,NULL); - return NULL; - } - - if (png_data) - { - /* init PNG image structure */ - png_image image; - image.buffer = (u8 *) png_data; - image.offset = 0; - - /* set callback for the read function */ - png_set_read_fn(png_ptr,(png_voidp *)(&image),png_read_from_mem); - } - else if (png_file) - { - /* check for valid magic number */ - png_byte magic[8]; - if (fread (magic, 1, 8, png_file) != 8) - { - png_destroy_read_struct(&png_ptr,&info_ptr,NULL); - return NULL; - } - - if (png_sig_cmp (magic, 0, 8)) - { - png_destroy_read_struct(&png_ptr,&info_ptr,NULL); - return NULL; - } - - /* set IO callback for read function */ - png_init_io (png_ptr, png_file); - png_set_sig_bytes (png_ptr, 8); - } - else - { - png_destroy_read_struct(&png_ptr,&info_ptr,NULL); - return NULL; - } - - /* read png info */ - png_read_info(png_ptr,info_ptr); - - /* retrieve image information */ - u32 width = png_get_image_width(png_ptr,info_ptr); - u32 height = png_get_image_height(png_ptr,info_ptr); - u32 bit_depth = png_get_bit_depth(png_ptr,info_ptr); - u32 color_type = png_get_color_type(png_ptr,info_ptr); - - /* ensure PNG file is in the supported format */ - if (png_file) - { - /* support for RGBA8 textures ONLY !*/ - if ((color_type != PNG_COLOR_TYPE_RGB_ALPHA) || (bit_depth != 8)) - { - png_destroy_read_struct(&png_ptr, &info_ptr,NULL); - return NULL; - } - - /* 4x4 tiles are required */ - if ((width%4) || (height%4)) - { - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - return NULL; - } - } - - /* allocate memory to store raw image data */ - u32 stride = width << 2; - u8 *img_data = memalign (32, stride * height); - if (!img_data) - { - png_destroy_read_struct(&png_ptr,&info_ptr,NULL); - return NULL; - } - - /* allocate row pointer data */ - png_bytep *row_pointers = (png_bytep *)memalign (32, sizeof (png_bytep) * height); - if (!row_pointers) - { - free (img_data); - png_destroy_read_struct(&png_ptr,&info_ptr,NULL); - return NULL; - } - - /* store raw image data */ - for (i = 0; i < height; i++) - { - row_pointers[i] = img_data + (i * stride); - } - - /* decode image */ - png_read_image(png_ptr, row_pointers); - - /* finish decompression and release memory */ - png_read_end(png_ptr, NULL); - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - free(row_pointers); - - /* initialize texture */ - gx_texture *texture = (gx_texture *)memalign(32, sizeof(gx_texture)); - if (!texture) - { - free (img_data); - return NULL; - } - - /* initialize texture data */ - texture->data = memalign(32, stride * height); - if (!texture->data) - { - free (img_data); - free(texture); - return NULL; - } - - memset(texture->data, 0, stride * height); - texture->width = width; - texture->height = height; - texture->format = GX_TF_RGBA8; - - /* encode to GX_TF_RGBA8 format (4x4 pixels paired titles) */ - u16 *dst_ar = (u16 *)(texture->data); - u16 *dst_gb = (u16 *)(texture->data + 32); - u32 *src1 = (u32 *)(img_data); - u32 *src2 = (u32 *)(img_data + stride); - u32 *src3 = (u32 *)(img_data + 2*stride); - u32 *src4 = (u32 *)(img_data + 3*stride); - u32 pixel,h,w; - - for (h=0; h> 24) & 0x00ff); - *dst_gb++= (pixel >> 8) & 0xffff; - } - - /* line N + 1 (4 pixels) */ - for (i=0; i<4; i++) - { - pixel = *src2++; - *dst_ar++= ((pixel << 8) & 0xff00) | ((pixel >> 24) & 0x00ff); - *dst_gb++= (pixel >> 8) & 0xffff; - } - - /* line N + 2 (4 pixels) */ - for (i=0; i<4; i++) - { - pixel = *src3++; - *dst_ar++= ((pixel << 8) & 0xff00) | ((pixel >> 24) & 0x00ff); - *dst_gb++= (pixel >> 8) & 0xffff; - } - - /* line N + 3 (4 pixels) */ - for (i=0; i<4; i++) - { - pixel = *src4++; - *dst_ar++= ((pixel << 8) & 0xff00) | ((pixel >> 24) & 0x00ff); - *dst_gb++= (pixel >> 8) & 0xffff; - } - - /* next paired tiles */ - dst_ar += 16; - dst_gb += 16; - } - - /* next 4 lines */ - src1 = src4; - src2 = src1 + width; - src3 = src2 + width; - src4 = src3 + width; - } - - /* release memory */ - free(img_data); - - /* flush texture data from cache */ - DCFlushRange(texture->data, height * stride); - - return texture; -} - -/* Write RGBA8 Texture to PNG file */ -void gxTextureWritePNG(gx_texture *texture, FILE *png_file) -{ - /* allocate PNG data buffer */ - u8 *img_data = (u8 *)memalign(32, texture->width * texture->height * 4); - if(!img_data) return; - - /* decode GX_TF_RGBA8 format (4x4 pixels paired titles) */ - u16 *ar = (u16 *)(texture->data); - u16 *gb = (u16 *)(texture->data + 32); - u32 *dst1 = (u32 *)(img_data); - u32 *dst2 = dst1 + texture->width; - u32 *dst3 = dst2 + texture->width; - u32 *dst4 = dst3 + texture->width; - u32 i,h,w,pixel; - - for (h=0; hheight; h+=4) - { - for (w=0; wwidth; w+=4) - { - /* line N (4 pixels) */ - for (i=0; i<4; i++) - { - pixel = ((*ar & 0xff) << 24) | (*gb << 8) | ((*ar & 0xff00) >> 8); - *dst1++ = pixel; - ar++; - gb++; - } - - /* line N + 1 (4 pixels) */ - for (i=0; i<4; i++) - { - pixel = ((*ar & 0xff) << 24) | (*gb << 8) | ((*ar & 0xff00) >> 8); - *dst2++ = pixel; - ar++; - gb++; - } - - /* line N + 2 (4 pixels) */ - for (i=0; i<4; i++) - { - pixel = ((*ar & 0xff) << 24) | (*gb << 8) | ((*ar & 0xff00) >> 8); - *dst3++ = pixel; - ar++; - gb++; - } - - /* line N + 3 (4 pixels) */ - for (i=0; i<4; i++) - { - pixel = ((*ar & 0xff) << 24) | (*gb << 8) | ((*ar & 0xff00) >> 8); - *dst4++ = pixel; - ar++; - gb++; - } - - /* next paired tiles */ - ar += 16; - gb += 16; - } - - /* next 4 lines */ - dst1 = dst4; - dst2 = dst1 + texture->width; - dst3 = dst2 + texture->width; - dst4 = dst3 + texture->width; - } - - /* create a png write struct */ - png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if(!png_ptr) - { - free(img_data); - return; - } - - /* create a png info struct */ - png_infop info_ptr = png_create_info_struct (png_ptr); - if (!info_ptr) - { - free(img_data); - png_destroy_write_struct(&png_ptr, NULL); - return; - } - - /* set IO callback for the write function */ - png_init_io(png_ptr, png_file); - - /* set PNG file properties */ - png_set_IHDR(png_ptr, info_ptr, texture->width, texture->height, 8, PNG_COLOR_TYPE_RGB_ALPHA, - PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); - - /* allocate row pointer data */ - png_bytep *row_pointers = (png_bytep *)memalign (32, sizeof (png_bytep) * texture->height); - if (!row_pointers) - { - free (img_data); - png_destroy_write_struct(&png_ptr, &info_ptr); - return; - } - - /* store raw image data */ - for (i = 0; i < texture->height; i++) - { - row_pointers[i] = img_data + (i * texture->width * 4); - } - - /* configure libpng for image data */ - png_set_rows(png_ptr,info_ptr,row_pointers); - - /* write data to PNG file */ - png_write_png(png_ptr,info_ptr,PNG_TRANSFORM_IDENTITY,NULL); - - /* finish compression and release memory */ - png_write_end(png_ptr, NULL); - free(row_pointers); - free(img_data); - png_destroy_write_struct(&png_ptr, &info_ptr); -} - - -void gxTextureClose(gx_texture **p_texture) -{ - gx_texture *texture = *p_texture; - - if (texture) - { - if (texture->data) free(texture->data); - free(texture); - *p_texture = NULL; - } -} - - -/***************************************************************************************/ -/* VIDEO engine */ -/***************************************************************************************/ - -/* Emulation mode -> Menu mode */ -void gx_video_Stop(void) -{ - /* wait for next VBLANK */ - VIDEO_WaitVSync (); - - /* unallocate NTSC filters */ - if (sms_ntsc) free(sms_ntsc); - if (md_ntsc) free(md_ntsc); - sms_ntsc = NULL; - md_ntsc = NULL; - - /* lightgun textures */ - gxTextureClose(&crosshair[0]); - gxTextureClose(&crosshair[1]); - - /* CD leds textures */ - gxTextureClose(&cd_leds[0][0]); - gxTextureClose(&cd_leds[0][1]); - gxTextureClose(&cd_leds[1][0]); - gxTextureClose(&cd_leds[1][1]); - - /* GX menu rendering */ - gxResetRendering(1); - gxResetMode(vmode, GX_TRUE); - - /* render game snapshot */ - gxClearScreen((GXColor)BLACK); - gxDrawScreenshot(0xff); - - /* default VI settings */ - VIDEO_SetPostRetraceCallback(NULL); -#ifdef HW_RVL - VIDEO_SetTrapFilter(1); - VIDEO_SetGamma(VI_GM_1_0); -#endif - - /* adjust TV width */ - vmode->viWidth = config.screen_w; - vmode->viXOrigin = (VI_MAX_WIDTH_NTSC - vmode->viWidth)/2; - VIDEO_Configure(vmode); - - /* wait for VSYNC */ - gxSetScreen(); -} - -/* Menu mode -> Emulation mode */ -void gx_video_Start(void) -{ -#ifdef HW_RVL - VIDEO_SetTrapFilter(config.trap); - VIDEO_SetGamma((int)(config.gamma * 10.0)); -#endif - - /* TV mode */ - if ((config.tv_mode == 1) || ((config.tv_mode == 2) && vdp_pal)) - { - /* 50 Hz */ - gc_pal = 1; - } - else - { - /* 60 Hz */ - gc_pal = 0; - } - - /* When VSYNC is set to AUTO & console TV mode matches emulated video mode, emulation is synchronized with video hardware as well */ - if (config.vsync && (gc_pal == vdp_pal)) - { - /* VSYNC callback */ - VIDEO_SetPostRetraceCallback(vi_callback); - VIDEO_Flush(); - videoSync = audioSync; - } - else - { - videoSync = 0; - } - - /* Enable progressive or interlaced video mode */ - if (config.render == 2) - { - /* 480p */ - tvmodes[2]->viTVMode = (tvmodes[2]->viTVMode & ~3) | VI_PROGRESSIVE; - tvmodes[2]->xfbMode = VI_XFBMODE_SF; - - /* 576p */ - tvmodes[5]->viTVMode = VI_TVMODE_PAL_PROG; - tvmodes[5]->xfbMode = VI_XFBMODE_SF; - } - else if (config.render == 1) - { - /* 480i */ - tvmodes[2]->viTVMode = (tvmodes[2]->viTVMode & ~3) | VI_INTERLACE; - tvmodes[2]->xfbMode = VI_XFBMODE_DF; - - /* 576i */ - tvmodes[5]->viTVMode = VI_TVMODE_PAL_INT; - tvmodes[5]->xfbMode = VI_XFBMODE_DF; - } - - /* update horizontal border width */ - if ((system_hw == SYSTEM_GG) && !config.gg_extra) - { - bitmap.viewport.x = (config.overscan & 2) ? 14 : -48; - } - else - { - bitmap.viewport.x = (config.overscan & 2) * 7; - } - - /* force viewport update */ - bitmap.viewport.changed = 3; - - /* NTSC filter */ - if (config.ntsc) - { - /* allocate filters */ - if (!sms_ntsc) - { - sms_ntsc = (sms_ntsc_t *)memalign(32,sizeof(sms_ntsc_t)); - } - if (!md_ntsc) - { - md_ntsc = (md_ntsc_t *)memalign(32,sizeof(md_ntsc_t)); - } - - /* setup filters default configuration */ - switch (config.ntsc) - { - case 1: - sms_ntsc_init(sms_ntsc, &sms_ntsc_composite); - md_ntsc_init(md_ntsc, &md_ntsc_composite); - break; - case 2: - sms_ntsc_init(sms_ntsc, &sms_ntsc_svideo); - md_ntsc_init(md_ntsc, &md_ntsc_svideo); - break; - case 3: - sms_ntsc_init(sms_ntsc, &sms_ntsc_rgb); - md_ntsc_init(md_ntsc, &md_ntsc_rgb); - break; - } - } - - /* on-screen display enable flag */ - osd = config.fps; - - /* clear any on-screen text */ - memset(msg, 0, sizeof(msg)); - - /* lightgun textures */ - int i, player = 0; - for (i=0; i= 0) - { - if ((i == 0) || ((i == 4) && (input.system[1] != SYSTEM_LIGHTPHASER))) - { - /* Lightgun #1 */ - if (config.gun_cursor[0]) - { - crosshair[0] = gxTextureOpenPNG(Crosshair_p1_png,0); - osd = 1; - } - } - else - { - /* Lightgun #2 */ - if (config.gun_cursor[1]) - { - crosshair[1] = gxTextureOpenPNG(Crosshair_p2_png,0); - osd = 1; - } - } - } - } - - /* Check for any emulated device */ - if (input.dev[i] != NO_DEVICE) - { - /* increment player index */ - player++; - } - } - - /* CD leds textures */ - if (system_hw == SYSTEM_MCD) - { - if (config.cd_leds) - { - cd_leds[0][0] = gxTextureOpenPNG(CD_access_off_png,0); - cd_leds[0][1] = gxTextureOpenPNG(CD_access_on_png,0); - cd_leds[1][0] = gxTextureOpenPNG(CD_ready_off_png,0); - cd_leds[1][1] = gxTextureOpenPNG(CD_ready_on_png,0); - osd = 1; - } - } - - /* GX emulation rendering */ - gxResetRendering(0); - - /* resynchronize emulation with VSYNC */ - VIDEO_WaitVSync(); - - /* restart frame sync */ - videoWait = 0; - frameCount = 0; - starttime = gettime(); -} - -/* GX render update */ -int gx_video_Update(u32 done) -{ - if (videoWait || done) return SYNC_WAIT; - - videoWait = videoSync; - - /* check if display has changed during frame */ - if (bitmap.viewport.changed & 1) - { - /* update texture size */ - vwidth = bitmap.viewport.w + (2 * bitmap.viewport.x); - vheight = bitmap.viewport.h + (2 * bitmap.viewport.y); - - /* interlaced mode */ - if (config.render && interlaced) - { - vheight = vheight << 1; - } - - /* ntsc filter */ - if (config.ntsc) - { - vwidth = (reg[12] & 1) ? MD_NTSC_OUT_WIDTH(vwidth) : SMS_NTSC_OUT_WIDTH(vwidth); - - /* texel width must remain multiple of 4 */ - vwidth = (vwidth >> 2) << 2; - } - - /* initialize texture object */ - GXTexObj texobj; - GX_InitTexObj(&texobj, texturemem, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); - - /* configure texture filtering */ - if (!config.bilinear) - { - GX_InitTexObjLOD(&texobj,GX_NEAR,GX_NEAR_MIP_NEAR,0.0,10.0,0.0,GX_FALSE,GX_FALSE,GX_ANISO_1); - } - - /* load texture object */ - GX_LoadTexObj(&texobj, GX_TEXMAP0); - - /* update rendering mode */ - if (config.render) - { - rmode = tvmodes[gc_pal*3 + 2]; - } - else - { - rmode = tvmodes[gc_pal*3 + interlaced]; - } - - /* update aspect ratio */ - gxResetScaler(vwidth); - - /* update GX rendering mode */ - gxResetMode(rmode, config.vfilter); - - /* update VI mode */ - VIDEO_Configure(rmode); - } - - /* texture is now directly mapped by the line renderer */ - - /* force texture cache update */ - DCFlushRange(texturemem, TEX_SIZE); - GX_InvalidateTexAll(); - - /* render textured quad */ - GX_CallDispList(d_list, 32); - - /* on-screen display */ - if (osd) - { - /* reset GX rendering */ - gxResetRendering(1); - - /* lightgun # 1 screen mark */ - if (crosshair[0]) - { - if (input.system[0] == SYSTEM_LIGHTPHASER) - { - gxDrawCrosshair(crosshair[0], input.analog[0][0],input.analog[0][1]); - } - else - { - gxDrawCrosshair(crosshair[0], input.analog[4][0],input.analog[4][1]); - } - } - - /* lightgun #2 screen mark */ - if (crosshair[1]) - { - if (input.system[1] == SYSTEM_LIGHTPHASER) - { - gxDrawCrosshair(crosshair[1], input.analog[4][0],input.analog[4][1]); - } - else - { - gxDrawCrosshair(crosshair[1], input.analog[5][0],input.analog[5][1]); - } - } - - /* CD LEDS */ - if (cd_leds[1][1]) - { - /* CD LEDS status */ - u8 mode = scd.regs[0x06 >> 1].byte.h; - gxDrawCdLeds(cd_leds[1][(mode >> 1) & 1], cd_leds[0][mode & 1]); - } - - /* FPS counter */ - if (config.fps) - { - u32 delta = diff_usec(starttime, gettime()); - frameCount++; - if (delta > 1000000) - { - sprintf(msg,"%3.2f FPS", (float)frameCount * 1000000.0 / (float)delta); - frameCount = 0; - starttime = gettime(); - } - - /* disable EFB alpha blending for text background */ - GX_SetBlendMode(GX_BM_NONE,GX_BL_SRCALPHA,GX_BL_INVSRCALPHA,GX_LO_CLEAR); - GX_Flush(); - - gxDrawOnScreenText(msg); - } - - /* restore GX rendering */ - gxResetRendering(0); - - /* restore texture object */ - GXTexObj texobj; - GX_InitTexObj(&texobj, texturemem, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); - if (!config.bilinear) - { - GX_InitTexObjLOD(&texobj,GX_NEAR,GX_NEAR_MIP_NEAR,0.0,10.0,0.0,GX_FALSE,GX_FALSE,GX_ANISO_1); - } - GX_LoadTexObj(&texobj, GX_TEXMAP0); - GX_InvalidateTexAll(); - } - - /* swap XFB */ - whichfb ^= 1; - - /* copy EFB to XFB */ - GX_DrawDone(); - GX_CopyDisp(xfb[whichfb], GX_TRUE); - GX_Flush(); - - /* XFB is ready to be displayed */ - VIDEO_SetNextFramebuffer(xfb[whichfb]); - VIDEO_Flush(); - - if (bitmap.viewport.changed & 1) - { - /* clear update flags */ - bitmap.viewport.changed &= ~1; - - /* field synchronization */ - VIDEO_WaitVSync(); - if (rmode->viTVMode & VI_NON_INTERLACE) - { - VIDEO_WaitVSync(); - } - else while (VIDEO_GetNextField() != odd_frame) - { - VIDEO_WaitVSync(); - } - - /* Audio DMA need to be resynchronized with VSYNC */ - audioStarted = 0; - } - - return SYNC_VIDEO; -} - -/* Initialize VIDEO subsystem */ -void gx_video_Init(void) -{ - /* - * Before doing anything else under libogc, - * Call VIDEO_Init - */ - VIDEO_Init(); - - /* Get the current VIDEO mode then : - - set menu video mode (480p/576p/480i/576i) - - set emulator rendering 60hz TV modes (MPAL/NTSC/EURGB60) - */ - vmode = VIDEO_GetPreferredMode(NULL); - - /* Adjust display settings */ - switch (vmode->viTVMode >> 2) - { - case VI_PAL: /* 576 lines scaled (PAL 50Hz) */ - TV60hz_240p.viTVMode = VI_TVMODE_EURGB60_DS; - TV60hz_240i.viTVMode = VI_TVMODE_EURGB60_INT; - TV60hz_480i.viTVMode = VI_TVMODE_EURGB60_INT; - break; - - default: /* 480 lines (NTSC, MPAL or PAL 60Hz) */ - TV60hz_240p.viTVMode = VI_TVMODE(vmode->viTVMode >> 2, VI_NON_INTERLACE); - TV60hz_240i.viTVMode = VI_TVMODE(vmode->viTVMode >> 2, VI_INTERLACE); - TV60hz_480i.viTVMode = VI_TVMODE(vmode->viTVMode >> 2, VI_INTERLACE); - break; - } - - /* Configure VI */ - VIDEO_Configure (vmode); - - /* Configure the framebuffers (double-buffering) */ - xfb[0] = (u32 *) MEM_K0_TO_K1((u32 *) SYS_AllocateFramebuffer(&TV50hz_576i)); - xfb[1] = (u32 *) MEM_K0_TO_K1((u32 *) SYS_AllocateFramebuffer(&TV50hz_576i)); - - /* Define a console */ - console_init(xfb[0], 20, 64, 640, 574, 574 * 2); - - /* Clear framebuffers to black */ - VIDEO_ClearFrameBuffer(vmode, xfb[0], COLOR_BLACK); - VIDEO_ClearFrameBuffer(vmode, xfb[1], COLOR_BLACK); - - /* Set the framebuffer to be displayed at next VBlank */ - VIDEO_SetNextFramebuffer(xfb[0]); - - /* Enable Video Interface */ - VIDEO_SetBlack(FALSE); - - /* Update VIDEO settings for next VBlank */ - VIDEO_Flush(); - - /* Wait for VBlank */ - VIDEO_WaitVSync(); - VIDEO_WaitVSync(); - - /* Initialize GX */ - gxStart(); - gxResetRendering(1); - gxResetMode(vmode, GX_TRUE); - - /* initialize FONT */ - FONT_Init(); - - /* Initialize textures */ - texturemem = memalign(32, TEX_SIZE); - screenshot = memalign(32, HASPECT*VASPECT*4); -} - -void gx_video_Shutdown(void) -{ - if (texturemem) free(texturemem); - if (screenshot) free(screenshot); - FONT_Shutdown(); - VIDEO_ClearFrameBuffer(vmode, xfb[whichfb], COLOR_BLACK); - VIDEO_Flush(); - VIDEO_WaitVSync(); -} - -/* Custom NTSC blitters */ -typedef unsigned short sms_ntsc_out_t; -typedef unsigned short md_ntsc_out_t; - -void sms_ntsc_blit( sms_ntsc_t const* ntsc, SMS_NTSC_IN_T const* table, unsigned char* input, - int in_width, int vline) -{ - int const chunk_count = in_width / sms_ntsc_in_chunk; - - /* handle extra 0, 1, or 2 pixels by placing them at beginning of row */ - int const in_extra = in_width - chunk_count * sms_ntsc_in_chunk; - unsigned const extra2 = (unsigned) -(in_extra >> 1 & 1); /* (unsigned) -1 = ~0 */ - unsigned const extra1 = (unsigned) -(in_extra & 1) | extra2; - - /* use palette entry 0 for unused pixels */ - SMS_NTSC_IN_T border = table[0]; - - SMS_NTSC_BEGIN_ROW( ntsc, border, - (SMS_NTSC_ADJ_IN( table[input[0]] )) & extra2, - (SMS_NTSC_ADJ_IN( table[input[extra2 & 1]] )) & extra1 ); - - /* directly fill the RGB565 texture */ - /* one tile is 32 byte = 4x4 pixels */ - /* tiles are stored continuously in texture memory */ - in_width = SMS_NTSC_OUT_WIDTH(in_width) / 4; - int offset = ((in_width * 32) * (vline / 4)) + ((vline & 3) * 8); - sms_ntsc_out_t* __restrict__ line_out = (sms_ntsc_out_t*)(texturemem + offset); - offset = 0; - - int n; - input += in_extra; - - for ( n = chunk_count; n; --n ) - { - /* order of input and output pixels must not be altered */ - SMS_NTSC_COLOR_IN( 0, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) ); - SMS_NTSC_RGB_OUT( 0, line_out[offset++] ); - if ((offset % 4) == 0) offset += 12; - SMS_NTSC_RGB_OUT( 1, line_out[offset++] ); - if ((offset % 4) == 0) offset += 12; - - SMS_NTSC_COLOR_IN( 1, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) ); - SMS_NTSC_RGB_OUT( 2, line_out[offset++] ); - if ((offset % 4) == 0) offset += 12; - SMS_NTSC_RGB_OUT( 3, line_out[offset++] ); - if ((offset % 4) == 0) offset += 12; - - SMS_NTSC_COLOR_IN( 2, ntsc, SMS_NTSC_ADJ_IN( table[*input++] ) ); - SMS_NTSC_RGB_OUT( 4, line_out[offset++] ); - if ((offset % 4) == 0) offset += 12; - SMS_NTSC_RGB_OUT( 5, line_out[offset++] ); - if ((offset % 4) == 0) offset += 12; - SMS_NTSC_RGB_OUT( 6, line_out[offset++] ); - if ((offset % 4) == 0) offset += 12; - } - - /* finish final pixels */ - SMS_NTSC_COLOR_IN( 0, ntsc, border ); - SMS_NTSC_RGB_OUT( 0, line_out[offset++] ); - if ((offset % 4) == 0) offset += 12; - SMS_NTSC_RGB_OUT( 1, line_out[offset++] ); - if ((offset % 4) == 0) offset += 12; - - SMS_NTSC_COLOR_IN( 1, ntsc, border ); - SMS_NTSC_RGB_OUT( 2, line_out[offset++] ); - if ((offset % 4) == 0) offset += 12; - SMS_NTSC_RGB_OUT( 3, line_out[offset++] ); - if ((offset % 4) == 0) offset += 12; - - SMS_NTSC_COLOR_IN( 2, ntsc, border ); - SMS_NTSC_RGB_OUT( 4, line_out[offset++] ); - if ((offset % 4) == 0) offset += 12; - SMS_NTSC_RGB_OUT( 5, line_out[offset++] ); - if ((offset % 4) == 0) offset += 12; - SMS_NTSC_RGB_OUT( 6, line_out[offset++] ); - if ((offset % 4) == 0) offset += 12; -} - -void md_ntsc_blit( md_ntsc_t const* ntsc, MD_NTSC_IN_T const* table, unsigned char* input, - int in_width, int vline) -{ - int const chunk_count = in_width / md_ntsc_in_chunk - 1; - - /* use palette entry 0 for unused pixels */ - MD_NTSC_IN_T border = table[0]; - - MD_NTSC_BEGIN_ROW( ntsc, border, - MD_NTSC_ADJ_IN( table[*input++] ), - MD_NTSC_ADJ_IN( table[*input++] ), - MD_NTSC_ADJ_IN( table[*input++] ) ); - - /* directly fill the RGB565 texture */ - /* one tile is 32 byte = 4x4 pixels */ - /* tiles are stored continuously in texture memory */ - in_width = MD_NTSC_OUT_WIDTH(in_width) >> 2; - int offset = ((in_width << 5) * (vline >> 2)) + ((vline & 3) * 8); - md_ntsc_out_t* __restrict__ line_out = (md_ntsc_out_t*)(texturemem + offset); - - int n; - - for ( n = chunk_count; n; --n ) - { - /* order of input and output pixels must not be altered */ - MD_NTSC_COLOR_IN( 0, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); - MD_NTSC_RGB_OUT( 0, *line_out++ ); - MD_NTSC_RGB_OUT( 1, *line_out++ ); - - MD_NTSC_COLOR_IN( 1, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); - MD_NTSC_RGB_OUT( 2, *line_out++ ); - MD_NTSC_RGB_OUT( 3, *line_out++ ); - - line_out += 12; - - MD_NTSC_COLOR_IN( 2, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); - MD_NTSC_RGB_OUT( 4, *line_out++ ); - MD_NTSC_RGB_OUT( 5, *line_out++ ); - - MD_NTSC_COLOR_IN( 3, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); - MD_NTSC_RGB_OUT( 6, *line_out++ ); - MD_NTSC_RGB_OUT( 7, *line_out++ ); - - line_out += 12; -} - - /* finish final pixels */ - MD_NTSC_COLOR_IN( 0, ntsc, MD_NTSC_ADJ_IN( table[*input++] ) ); - MD_NTSC_RGB_OUT( 0, *line_out++ ); - MD_NTSC_RGB_OUT( 1, *line_out++ ); - - MD_NTSC_COLOR_IN( 1, ntsc, border ); - MD_NTSC_RGB_OUT( 2, *line_out++ ); - MD_NTSC_RGB_OUT( 3, *line_out++ ); - - line_out += 12; - - MD_NTSC_COLOR_IN( 2, ntsc, border ); - MD_NTSC_RGB_OUT( 4, *line_out++ ); - MD_NTSC_RGB_OUT( 5, *line_out++ ); - - MD_NTSC_COLOR_IN( 3, ntsc, border ); - MD_NTSC_RGB_OUT( 6, *line_out++ ); - MD_NTSC_RGB_OUT( 7, *line_out++ ); -} diff --git a/genplus-gx/gx/gx_video.h b/genplus-gx/gx/gx_video.h deleted file mode 100644 index d069bffbdd..0000000000 --- a/genplus-gx/gx/gx_video.h +++ /dev/null @@ -1,105 +0,0 @@ -/**************************************************************************** - * gx_video.c - * - * Genesis Plus GX video support - * - * Copyright Eke-Eke (2007-2013), based on original work from Softdev (2006) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifndef _GC_VIDEO_H_ -#define _GC_VIDEO_H_ - -/* EFB colors */ -#define BLACK {0x00,0x00,0x00,0xff} -#define DARK_GREY {0x22,0x22,0x22,0xff} -#define LIGHT_BLUE {0xb8,0xc7,0xda,0xff} -#define SKY_BLUE {0x99,0xcc,0xff,0xff} -#define LIGHT_GREEN {0xa9,0xc7,0xc6,0xff} -#define WHITE {0xff,0xff,0xff,0xff} - -/* Directly fill a RGB565 texture */ -/* One tile is 32 byte = 4x4 pixels */ -/* Tiles are stored continuously in texture memory */ -#define CUSTOM_BLITTER(line, width, table, in) \ - width >>= 2; \ - u16 *out = (u16 *) (texturemem + (((width << 5) * (line >> 2)) + ((line & 3) << 3))); \ - do \ - { \ - *out++ = table[*in++]; \ - *out++ = table[*in++]; \ - *out++ = table[*in++]; \ - *out++ = table[*in++]; \ - out += 12; \ - } \ - while (--width); - -/* image texture */ -typedef struct -{ - u8 *data; - u16 width; - u16 height; - u8 format; -} gx_texture; - -/* Global variables */ -extern GXRModeObj *vmode; -extern u8 *texturemem; -extern u32 gc_pal; -extern u32 videoSync; - -/* GX rendering */ -extern void gxDrawRectangle(s32 x, s32 y, s32 w, s32 h, u8 alpha, GXColor color); -extern void gxDrawTexture(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha); -extern void gxDrawTextureRepeat(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha); -extern void gxDrawTextureRotate(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, f32 angle, u8 alpha); -extern void gxDrawScreenshot(u8 alpha); -extern void gxCopyScreenshot(gx_texture *texture); -extern void gxSaveScreenshot(char *filename); -extern void gxClearScreen(GXColor color); -extern void gxSetScreen(void); - -/* PNG textures */ -extern gx_texture *gxTextureOpenPNG(const u8 *png_data, FILE *png_file); -extern void gxTextureWritePNG(gx_texture *p_texture, FILE *png_file); -extern void gxTextureClose(gx_texture **p_texture); - -/* GX video engine */ -extern void gx_video_Init(void); -extern void gx_video_Shutdown(void); -extern void gx_video_Start(void); -extern void gx_video_Stop(void); -extern int gx_video_Update(u32 done); - -#endif diff --git a/genplus-gx/gx/images/Banner_bottom.png b/genplus-gx/gx/images/Banner_bottom.png deleted file mode 100644 index 85545b1a1627eebffceb840d9ad00dc859214eac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4704 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 diff --git a/genplus-gx/gx/images/Banner_main.png b/genplus-gx/gx/images/Banner_main.png deleted file mode 100644 index ee11383b8e95c278300c3c5b8a2915a044db9eb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23123 zcmZ^L1yq$?w=OLWN;gVMHzM5<62b-n=|&o)yQM=yY7z!-OIiLB=XDfk^SklDbX;H0;&Q72oD$HsGlAW#f8rT-ojbwizbF1i$a@=9JKYD3&DToAUn(SF?Fm=`g>AI7S8d4HQzX) z3iS@$D>!`Ac?M!Q?eTyXDQbduvKVmCFw875`&zV7IKJ!$YPIos1QaTG&*wJq$N|_d z5ybq(LVq2ANm${W;pAF8F7__^8Ne)*JQgZ!+A9q6k7!8SC`t{4@7M+@p#u zyLo9$elpc1Sr~E1_^5A#P~ngR_)twAO{!Pev7xGV9kUh2Rb_3kTQsrzogx8cX*ve!Ek1R}X8Ke#+g=zMx2Np9TT-O0iuBKF7M2ETc(1stqo z7@P{V1sMsHv|=p&LBZ{OT$bU-k00k{E{59rALVUw?+)bqVpr_d)VALiUpV8h=EfY4 z=QDfp9Wt3N9)D6x9ZqWWx;g#oy6kQ)pbbZyiHwO&$cl?u0e^!!{>;G75Jr@Klmz1TOpTi2o3H(!JSLc8(+25>( z8sA@^XeH~q%rX8}tuOa)3~@Sp_g+Ix74(fVz8zQ#mCCzuAisUr@T`n}D>BAa5iH`} zb-p`MSE}2@Cxo#hUJW>EUJ6t9C9V`+F;stzCPs*>f7RYZqlx3-jf&i0^ZEAL&-C@% zpqS&`8-J0ZdCEn10=v{J*O4zh`pfJ&s9+5p|n3KdA&p9b-rr_&Ji~KB*NDI z4VMbCU(rjM)@;xo@Zr@0f(Nc}0CE6h7ma~GwOFKpFI21p*uE26(?R99*y22N%FRn; zWJcDkL-zVSQgh~pr=i75OC7@?jrX(0@=AN4XZG+6Ma*;{1gXz|UxykO>2GQW8!WV~ zq_<&HuYNbrY?!p*$;&KhSE;W%NEek?!&kwt*%s=+6KMoaezcLryg0-cx z@Wtehro+a4o^jy-X&^RGC4uCES9OAgRQk?*avJvgipPL`;SU`w-K<|~bz)~gWEB2P zjI%ny2Si%c%DS_MR#jm*SzdnkXojHc(6`rWwRW?=Ud|H!`kqwlXY>h(Uq2w)h=dI( zM03m@+&1E5^R!E+_3jin4+K6;32WgatJiFs*as;KJ{cFUyxQuR7b(Ymr6fP#cHI7q z!3J2(>(g%oT*fD4f*S{XI)-ZYDA5k7nbAuVv|YT;_W5PA3<_9SUzM=nrt=C?zG`b+ z?%llnRZ;(f;9w$OnTpr@_MBXM9-${&7xEOcxMC)NNxU9&ZJUG1%Dib&ma@!oSCk@A zInK%`(n;`%w#99{9kNubxubLEuNQS>#Pu2*Tt9rc{qs|SU8~6jD)%>yz5*LVfW8eQ zzOp-6>y~6tOy!XXuD@7NT5<7g8dZA9;cqp1jX)#<1=2_$LL}-v8y_La{^1<6HV;e+Yd86LXDB7T1 zI_Aj(g6#+Tzqakx0+2C6BFP1;s125UbCMQYTU0>y?n1=0odSsorpIm%Kj^z@`nd?J zo(GB(0&sG@^Xn`&qL8Mfwz$02V{x)j?I~4jqmx*&$T$VV!~lqD@0OeW#lAY%h7{Tv zSM9v}=XJc)pJ*Dkn}iF`Sj6`|O-}e&VE*rw6TEQ1dZ=KRHz1GHRYY{f*BYPaPd5h{ zkmnKja0S@10CZ=wl43V#@0Ql)e=E(k9F_L-mIEA6j zqoUNvZJgVv@RcGjDQ4lbLC{U#*P^fsq1Ho7siTwE^}>`wdNIe(MLO~W@uAG7x7V#( z2OB^129w#r^}xAuy{htiS};cj$uA%x?)X68Vm6shAqkU8$n6-8|6|0JW)>q;CCf`W zuA(C6xs8hq@gzEYX=#MNu41s~YnoH{iYH?mbQnq(a5{g=m+(1pqyRzyMC%L2`eAfJ z$G;IL{DOo-)77Wmii1?{$1>0m=u~R{-Dx~jP+2t=Y&@bU*I$3sde>72xWNL0v7Yfc zeAbE)jmAP-P(Ikl;~+~s5T(BTwmV5OW!Rx0JRIL5oASPCUYB(n1iD70TAh%yB1_e3 zgT8@e%#Csy_e3^ZPUP9>)Y^EFoTz_oa9xnUE)}p;H z$XNv>AqRSl1#!A~O}m31lIT)}DW7&YI%6y721Z3L7(+~?Vjo8X#GJHv@qs?Mzr&-WlauF?^ThiEzo7TsiR6MH3OD?p z&XDyA4aUk>Ue35rHD~r0l(8y*D>c4ky85Zyt@T8aDTGlHshpz{eo}wRyb9{30`Um@YJ8h^`-AqUDB%6|qvo>_EdB7=wmAXlF-0qVxgx(*XaV%6c}6BKN+ ztHC?F?U2;YbrzEm7sq;NYWkoGoG^SSds)&cA( z03-F+fxgtJKDA+c0CEC+@3bzRdWNNimRwQ|%AP!qy9xc@!jB5Z)rp94+PxOvO0WL5 ze6{2X>H1CHzN#fQPV>=z{3-Q=l{nz4pGeRB(Ie~#K%m!JSd@yN`6yPSni0( z&jn`B_`PBGHwpgNHEA(UjYZhdXKij@lihT8%7?pU1$1*$)joXifOsCYB;#7V2)INX z4{#YBlPMrXWitS3zx_)ZJmLM&_1%1MW=d@ASaA{j#QgBxNu38i-5?iW+Ij3#nFUZj z=J@N6?27L-I@rGqE>(K#+8&@M0Le>>h=}N}2Z9#+IUG9MyN;d*3>04%YQv5ow7I9+ z_(rtL_j1aosE8~_QzHOT{3_P7?Jr-X@yhww<}T`#hs8^`P_jEJbT%}Jj6wJfPna$1 zDO0naGF5^uETKt=>ij(2 zpY+M{Bz6ru%}~L$PssqDErIyNGUr8dT)eOQ$)?}xwU*(!OagFD6n`TZ+;-%Mr)u$v zi?zz93$G8x3Ory0Wa{)+`542`KOnZknQ zSy=`;A7fUIS+Y_nr0m6C0YQQ+P38o98-h)d%IUN<g?**%ppR{);2%za0z3z}0A#x7fch2S zgOw+63&;j7w2ftr0`M|dWi~wU%$j)ye|*QtE zsw9Lc?V3#cD=`a%tyVt$C0|cr%QA?6Brr0&>iwQXZu`9QOIcxaVM@pRCcI-$+R<8xsC824BE-fT5+)l8SV|G z$4>TZ!UzHAN;awc%rYJ$1-Xkv5`j7hdVFe5_OFR}=MGK6UiYS)80BfWqJW92YI%xt zwT7K2oNRzArJryOo`zM}7wTtxxY*FJ-m6T!b!vQPVe@>LO|w^FKbr*oKOml~oHE)| zde`85&vBO3`nrY6>$qKxjL#Z(9kA@vZO{8G=Dt#%hRI)72maG<4w$R0ikm4?*o+Lz%j-8f z@6wg_{DY8zKyq%=mCnP0D}4(K3twL?Iw||p##Qf&HK>+e;mSo^-m^vNx!Ouf)U@{B z-X_87;jSp^x;bMA1|QDynHzKw>oD+NOR|8mbgmqSOVG9=H+~E;WV#vs0o*(I;NvU& z7e#`epj_PClKE~MV6%2j(Auvkxi1~=MsiPKk_??uk;HzBLwnzgt?>Aw_U(Da2-as2uKQQSSYV=)ZOU_tG>T%@P4cB&$4=Q zy_1+4B%V}}GMo|#RFE~tCQedJ-3Ecbw3hOq%JL4rm0NIBLq&zd>tMFxJHQLt=fpca zks<^F0JlA5rCreI4Vl$lok@TEY6I}WvMsTDggRYPy}gNII&l;F_APUo>03?Gi={a; zxhIOEsPRqotz)BwQ~aZcA4c|T$%0#S+7?0y30aUiGq zWjxmmWXU`RF#CXRX~nC{qH0cYiS;F}bF9HJQR)%VyHB;&T0TljN)QyHBwz1p67b9w zV0>ds{SxJ(t?T67lK)=@edjf8H#dB+Ydri=2^8ul*yOXGRYB+Z!$lhzK!|i1X*-M{ z{){unI}ROb8xf@%ZVa0iUJf`FlDb95K`8=qeVe7uxb>fmkQLSVcIx#j=676-;Q{T` zh%e?Be=d!Q>Ha0Mr6RmFSYDN7u{w6?wr%&PgR)8)Z)@xyZZF!SsnO@X<(yHUr@IpS zPaY=WqP`7_oIdHqrbT?MkjzFgQD@gCVhUp0e^$(&bKRz;M&72Z1F_}_C<=is=>o@3 zj|wfZbtvQ&j;O*l9Nsb{iwnI5c@+c&>nQxH2)rN7US>wqxrSjaX2&9 zo6FMNYv#kLiC{2TzuEiF1sUpNA`3Jw+b?CZd|ee#ktk@J5yPNmO^2ju6Z~~{a?+BE z44>;<=N5C~SypXb0&{Xg9tt#@cAvHWbN=4bB?}`pPUwnryS0;dhfQ|(0EJtMB)muN zMZ&iM7ABCPZfc@K3c#iw=Xyv3be37$=93;TIeNo~E!}TPnl4(>m9KIO(B=6}X|#d5 z`VYx`ySHxbasmsl@j99=wg$8kauK)VmE31IlqJZ`emGCb#2qPC{`a)s*%K3Y#?vV{ zIypLeXinC@FBXMF&Ic>&;eQ*$ef}Tufz~1D@w?@r!zK?J>5?4s_-aZ(1}LDD$d5mEFPVDvgPj zOtxpp&#>VCP`UHnlF{4u-I!#PGdz}y$5L{&)m~%4R}*iTd72u_n(Y9IaNFyGbNS)e z*L!`yMC($h7i2&q!RXHKpHnoR(5m0Vm-bAVP~*b?mk{J9hQ*2?{1X|*%p#N*ne|zFD zpB~TW7U?Pb-l`(OoS&~4%=mBQ{Es&}Q02}O2v^{%5G1m_E@uAQtNra1{$b@$RsqKD z2F1jc5k~;c31_TFU%gUCKE?mL&OaM+?&vLWZr@4dl3!6C4f6|r5<~wn=AUK$6T9oi z>P=bO;W>Ttis8aPh$8=&O#+{pb-Blu|HXR#yR$M*b{iY~5-ItJ zGXH;19CI@1#@1SY_pCQR__x7)I>Z0wpnqIwQD4wEztO3ys-gK;<+X8R^w}#?a%eoK zUYOBXcjU`1Vv47IIfxQTj}g6r$#oaivGqXs0X7n%hk;q&Cu zYPd-kswZ%Dk_=5ZQdcsv;tP~{Kcjmvxhlb=1Vse>+)?1xD=(MqCX1x^xFVC20UM^j z`4!B)DQl#ZZp)+9H!{q?>O`GI(X@WYKQU=fA5s}4{4xX9iEiJN_VMJfS6wqv_JB$u zJrKS#-@xey+=>gYW7f{ZZy$8Fd?SvOohft1Im8|nkW1JfMj(f*0&6Jv1Oauf3T72=-o^alwieVqiE6U<}qp20R z3ONUCEK1DQQ+3Hj>M>%P&_LsqALZhM#QBWAI>pA1$3&*DrVKee-)~Iad*frk9d!YE z_pY58^{a-@i@r+LCbI;O@#0aHwY3E2D`i)RZ@@o|cE$_1FWrBQ{YmRRpp3)gTI- zRk4y`ZBJEkJ+7asyRl`1mNAlSV z;cRO-*ACLk(sX#&+_N+WmvvAeF&#ZVP= zdYq8G<@ktW@57QQU}t>#e1vBbTf0@wilh5HtETj3aa7vJx=SanTg*-8ejhfl0E3ZW zfVu|gWI^*WbmN>HQwDF7;c~@+|73Ck5~Iym4;{%PEn<#-ZdX-#{@tABa`^Y3EeBkb3~dK7^qP^3D+@3gaOb4I;Ya{rFYtAN;IWPR2xv0_wPY3<;|0Qm|+Pe>hrl=^3(P!iv)#gUK4RIvBM(Mq#`VC6%Yoj}6rNi~fI0}}QD|kwuZ4?wb25vpc_Zt#xnvjvd|@aHRD0?+$h-P3IOdfqffEdF@9C6jNvO_K$q8m})=_ za{W8X?>EuPnqWPA$q&2CqTNRqD-MDrd~Q;cj?9{+TYcl}+0YNFV(~eHYG^mFeW<)q zHhNh0XDbpYn#}OOBYM`oB*VPl#c7Lb=qoOVC8^1V6UX~XM}(|Bn)Rv%vrl^k6fyBk zX*yVJCj)z)F1Zmp?_^3}5uhkxzwRtJRD6vnqttE^-MQ}KGGMtn%#WaL?|uh$&B^&w z4w9*4SoD4MPkDR0YAki)dxmaGa6Ccxmm>iBj{nShPU9M}ug`u)*oxhSEcoR73QQ-m zJkoS@|8<#U7jCHG6utFq3AyBYMpW)7BciBiQZw1%D&7Gkt19k%t7SH@~s8=);(sgy{&hhG+dA=gz8Knmj^}u!r+4fo8)iOP6Zrfq4 ze7vH$Z=so~+3_V9VlZ8zRiE*tYc3&nvvxog5$w&aKIt<0Y|h}?Ly{e7M)iIkHugH# zuFYRPk)oXt9M(J4<$bkS`gw`#ULukU1RB&ru2l%&bNp!N^RD7S9i-EMI1?EV6X;p% zxOBl^+b}fxxKCiKXOE|+sYX4B5mKP2Wj;RgxqI92s5a)^eq#4LZ?RzWWog}z@fN|v zch3vnZK)A8I?Y0}}e`&baa9)YOL$jxVGwePO+|ts=djK8QIPV=)=j&bpn&_(r0JRB>^0 z=&U<5r2d-6lQ8XOf>_tAp1C({PB-az=bcVd`BI(ejYsR=Unf3>YmZp))U~nN+;_Cx zOgGKe?hf)Tl*)-o$eXQ{MC4VM1eAz{?6p5TT#pM)c4|Dpb-3IZyDLqeXqGH}`(-$B zjH@CUoiexfz9V_Rk5|p<_D$IqebQ1L&)S3iV}-Gdu@kMDqqX@?oXsZ*bP;f9nq3R? zn!{&XTVFjdk<$u$z>MbmfyaoChu0^@DW!Y^%1~K8Vq+9v$YXoNQ!K*Uz%5X)6Qq9$JU|ijn-! z(?&e0VxU4c(U7G$Ql?HQ(BanL^y1i>c7?^Mw(GlhTY8vx?NmRXh3$nKD}Lu|FbHs(p?(1CvYmcF*pZ(N@dmBPvw|L1PZcc;s)8pr0+B$hTEi?`%vZLmOgl~NPW zEP~a(WS*_pBs$j>Vo3hhix&UK&4V84XXf0br3O#-h1wE^ms$%)FJ8!01uw25L+v6+ zZNzdLW5K3D!P!xWb{nQJb&E_l2!!h;w-+J@_9QjE{?=s+ti(O1hBV;jJ zBBBaiW}mN(Z1jeg^R{uzXK+g`fj)UionnJ&=# zIC{T;;dOj<<#xJjUVo94^jjPY39}t~RiBQJuNe8UuJRPK%1poW@qR7;`4JHzbR)Xy zFb|+r%L1MAkWd>TiM#2#velgmV>nFm*uhSmWwMi->cO%uD}~=Lh+=Z~HXEwt`aDf> z@-#13#+stOfDV>m4nvz*C^V9%>@nFzK&mY*XSy92x`D|GV8%lz} zmcuy@zr$|zYtQgSpd}qOe`xlWoy^Hlw+?+|xHMIY<#xN+lHO znVBJTFJz6q>E^s|D|eD~ast{!?{_JN2z3fqJ^}ODk(Y*1%0JdNLICV`hDU6$op;z~^c(t=Mg z=lZGTP`#J-q_%NyWS+$WJzI+xpJ$!#4`c$SxTryOf`o3Fkt~Pyq8y8i@vjBO_a;CV z{UQfQySVeX|aRy%;!LvhQ@gZkzF?8kaKYy#1p1n$e;(u&97~{L-DQ*6wY!^5pD7L2U(C zN6pchp@r*?%gV$A=Y%`)Cu6vT;rK`xv~g=;=B(To7C5<#XndZ8Wv#C>3i}EL^bpPA z%;y)ay;D-@!pPF9k~2-+NxzqcJ&kP3dzT{TUQkuR1T^*9)0z3ZaVM^ib4Rbo71(3v z?9>e)HTZuXuE6h}Bu`C|o>j?bUbzFbay{!8v2mFp3Z>M#OdUK*!V z1p`t}#?Q)}ptbN^7T=ApVKT5yf_(Q)b5RC5I^ed47tguR>U4Sio#)`J)+ebP;h3Nw zlViyiHW!v=-uq@B{&35^=Wy5%<7A5gH}Eg|({Kj6Las?PK5xwWX+$7LbSoZfvn(5g zX``&f^@3N|aWwsqFl-y5jzp){&SzYgH~uK(J6!Pc1DB6B3cm2$%y-m6gNd;!2B&lF z_cgsPZ<2-1SGa~g;62=88T5LPRL$YnluTJ=D{G(#G{jvc4xnS)VdM_hY7Y}*a_Mi2 zs5@Abot!v8*=Nxsx`%#cOa5Y@t?gCl~9>=z^C%)US4J@>(`+cK5x zb8bxTlmuAhdp()5afQ@T+MD9wprGrq+C3;7Q@`uC6Sh(ErKJc;!!z(zilN)obhBc};B|f*<#4kWwXjP%9;gS^@ zQ9UUl3p2ICp9X(rH*{&0WbZ$mJCMbby_=5fE}p1*5k>NoT-}1MRcqiQZrVrm#bK=GliSbF;SFSD*lFdA zHu?;Qnoe#DY@8bwz3xwBukT?6mGGy%@4KedLyN3py6!fyw>k-YF}y|APZb&-qUiwn zZ{Lkh&_}u*8qEg0#;Nj0B#Ntv@=D$^8=sFeY}jaGs>^pB9^V2b;pJicW+K_Oca`8QCOsari>ZCE3D6Yh{^N13vioUazE<e=w6$-P(nk<H6EN$3KDD(1}In?UuJ{som z`x;Ct${V_ynX5;C$dPH+wE)jF$kAe^vEU*En`~qxr*yGdY!LqeLgq`moEZ=)wOv*$ z*3|s_E#YS&vex;oQjG1;q=Ldi=_IVKxfj2*p*A=H3q9{;K_J?eRW0>*!#gqKCfV7S zJhIq_(b^m1p~*l$>l-|0A(iywcPtkt`iI0FsGXg!7xYf$U^|X50!#J-`#0jvR91(2 z($8Nblq0o5g81-9FLR7~qWTfT`bbN)8*-pFn(7D9_?Jf!K9TMhivrdQ&6%BoGcU;^ z0qg%1yDCjOCMJS_uEz#kEpYHve(C!M7n?{*wHI<7aVbhRo3At7FQ2JWeTE7iMd`8s zZWBI3sxs4+Gk%YJ*>&EBlUVB&0G2(nidn#rI9I3fw0Y^UDZ($G5L=BEE zV^r})9WHk)e_S3dAjadPPr4j2<+--SQILlJyl4Yyhn&Cb-|4;mqA$hbGUlr+qa#ir0_&zD}C<|SpHeDXr7$bswuK)NNap^SJj0emP?!+d}rTH`jz83xB z2VWZSvo^#KEw$%u^zK~X&1uAF&SmfEvm-iQ)C$L}9v0RbTcg>)o2+Q zPKv>gEJhj7;O_eLs2`>#!7!+UfCFvbNln@7#4(TlU2jIwiWtvB{SiB#DK44iUMlZC zcApC-UfwC8tB1bdtC@Gn##}li9FFKB`sd|JRRY)vbkPIxJC{0e#jp#Xrf^YM|6^y| zw`JI6p?svNb5oBG)SHlbsL5v4%NAoWv&X0}_GROj`GfwFM@O5|xQ~Z-`?^N$6H8R!`!4Cnwl;ZyVOZ8Q2EmFI>E_V3KWDF zadU@XQU$gvYCMkP+b;bsngVmUDw)(CoiJps{Umw}+&FI~#_XYVctm@;`RKGe!HX!4 z*be@-iiI7RTj`4NbaxRqx4p}6H9^3=KK47ed0c#I`;?}>G;nXrqMx(Sda?d{dF#C2 z!qhvDEion~3TisKV1C#&A+yGP#AGB4ilP~By)vcgJ2(KM3RxC(U!$F_4+{H|@S&1} zRMG3E+dOiFN>;obpRI+*kvJu>Sj6P2%t#$XC+Nz9CPxCDw&O|7-J3B!%3N|=943Bm zc8g7#Uz4T=TC;Z1^Muxw+;UWsw~a=OTST97d}rya90~}olWq3BzjlbE-=9I3e^1Zs zd39jc-m%~?3+3VAbFmPHF8;~$XnL_rN{WmIlS&Vm*rbx8 z&MAbjWsN*6d}r4ZBo<~>!y~GD!Dn0S9R`zc9p4`AvnXV%=*ouIEh>7rP0mffWz2RCW7xiW$@$$s zFqG@6s8|B8wtz`pL*o>EO5py2H?pZKLzJ)4Wf2QCOyOW?jea2lG{rX@paBPa3_lwK}MKN?q3b zi$Kw+oVPBkyn%?c7N0@oY?!hl9VahF1aD?SD7s})F@oHyMRGd-) z5yY+KFpPa{y07wi!dw8|NHk3YzeZZ_CbwLVEofG&8o6zhtTr0n^TXTMEw?@7l58Fe zAjPdWA3U#cuuv9BQb~)R#Fo+h9IFWxB~;W<%VKjh21E-9fPCGmE_vz-)jK$~*ZZyeTcj-<#H1=Q~PXdahkHg!`mSq7}&i z^?klyTqNI26FdZ?kvzKicBhQ{uU^$t7N!DRyW30?j^34jnoH)}l$?A8)Kg+kYt*Kz zT5tHmB6+aCu~BQetoF3n9|UO3+sZQ9e%d@!*S>t3*@Qn83_t7IvXpMn(Yt-y&({poievz3Q&HeoEXshabR%3@mPJ>|>_97cBg`$JxgMk*Y3z z^o7I8S5Udt9=?HOaP-rebOj~hMjkg;Orb7KFBq^MwP9!~q6 zcc0|XaWXFlDuJabo(qqdmV61Q`d(f4NxAXS@7NOOpD`$-F2{!&7XQ6`g@HZv|84LJ z1oYe02|6eE+`fWv3FYq?%Ku(u`X7TwrEBN@ProZmvI?x4&OT%^1B z?G=;WusB?f8Pu_v3m*M0LfSlPOC_SJ~Gs{%=9}-7#}Uoz_t}C6KVSt7o;$ZfX`MiL@kg zd=_{4Q$BpDL;maAJw`Q#U!Agw&?z;A^OeYZ<_fR|_AlxsperoX*I}IKAnELeLP8+N z`pNSzzD19V;8tJS0!akO(X?}ZK!($eP`)(-1e=&*G!Td*wdCVEx!a%6a+TK5c3E{k3=I*h#W!uFE0_xvD#) zzhw9&)P?t@+y?^}Quc7jvjYG9zA`LI3Tii>TW`G*hZ7#2NnrBzm1Qu6g%7_Cr@S|~ z=oTJLE}nx}v7jgii^h=0uwtHrcsToPZ2QaSvkUEY&Q#X=G_n(qPplboCIVv^%TyME zWV>6ow!eW$iC@`pcwOz=QC_^2_jYkO3aDx&wMeC%GFhcXkZr6C1(ZOvh++RZBa95H z)hn(90c?d&UMs|JX`)@Py}K=HjX3%^W0L2LKJy}BUpG^J8hP7HNkm^oP|V8dJc?FM zbHB(5==c2mYgR>)@uoni0Zoi;vdbdP5!DNs+_=gY++U^$o_`svgxBKBLb@z(x99=H z$0Ejh-S><>b{4*aD2PCe55K?YLqP(K~fT0)-2E z9o99-_quSLg5K}qr5+9Ed33RAHr3PL2K8HKS8l+?w+8_lT02nCUoeV@p`S-O=UzXg zl-7!6I2LRZ`4u;)VvHC&6OOmqmu6GuuJ%rBe+g|x@}}hHljXA2q?y{}BPH8Y1<@G^ zHro=#vrGU(oXYlh{c#z9O~BAMJZI&sv2TYv=tuQISR+s_fL4P2yqk1U`NUrd_{o|$ zwa|#_Oq{r2;87?p_d;ZVjKj*AE_W{718WS+7?U^t) zpd9J3l8=FYwO8Ctl)UMG0D9U_Bf!lLZkYsRO(z=q1c6C$n#IyWnBvYG9`)p)%b1yU z`rJ{2B4#Cv-nOY0`YH%2P)6T)?-@`Za|VkjzuSFp23ajA>Nr8v;Y2<(1-xFe7?=L$ zBk|t(+Le1n55tNJUyx6bn=l)GTMT#qc<G}Fa zV+|aiik)LQIUoa7U#LSvBWMS+&l-Ws9qI2);`4~9D@jSjfJ0yu{`^-%S{jFz_J|-z z^_9;ofE_PBc!VPCCcV9iONp00YL(0#um)$|Jxp=G@%3)Z!+S?vHD*jIj!vc9;eGEz zRN;DbIL1LN8G>mzAIW?T zwe#tZeJMHHQk+7-tZ{tYiBsj&dzo@)2K1qZ`#9ZDtF`|8%+=`bh(0nWG`(_WT>N^D z)Y5FzPWST@hMR3s*mPx-s0UED>b?m&GinqIZ#7DWVq;`5v@4o9jPngJGu5w!lU#f2 zxlq0N{nu(e5C3LPJh!V1{_jFx-tw9=Nt#BJCx*`KZ~cZnWJ5j9$9wCIPjXVeu=%

%D@tUb765LOu9ZK-^BH)hMOC<|u*!$e$J^t$>~-TP3SCS8PXhMb;;H!7e+;1yq! z^*uz+=bm21Tz-#~+b{1Wfu4mdlaEa_Q3rt&`E(OAR@r`*b$gC>fL3_jY!pb zILZaEc!VO-BHx9}SGEoABJRcvK_i3B_X@{1LY!A$^k8(~C?E=s@}z?3buw>YJ3ont zMYzCiZI8*nZ>EXgLTVl=>9%0x8KT%A&|I^Fx3jk~4^hJ63yv93GN;Y$=KUpq8cF4QN%bWA zT~p2D`EuXqs)vbH+bWv6*ztV2`oHc4H1!oWEp5!wRy^lh@09cOIhm{5WTPkpfm^EH z&8O_``wqwf(uoP7;W;DQ3}E-@wucLwExiX;J)d3oE!K}x4y)5+jx;jS5+IPs-9|!~ z=MF1ByTQ({=U&G#JMgoz(F2mIlPPya7hi-N)hXkxEl6(7+h4gHE&BIcZ%$}@VbgZQ z;PZSHy%Aa9c(KzD(HHhVo0FAMz3E}E!5G*XNIu@JS0)B}GV~S`t)8Q+O2eh?ca=l& zN383;<@ZF%kz}35F(P@wA23Q_8xxN`JNFLO?2GMnTO;izm1Bz^XFh1g_U*;Ss@(e! zvg;`xMPi=zMw(xOW?~Z)NqG6~^kDU4gZq}#lnG2s(Oo>Lq@-}f9Ms7rB}qf^bR#3* z`jMY+Mv@m|J=(7~r+w!Ke#BF-ekrcM-GC4djwI&k{{<*0SjDmgsd%F^GM!wS0Qdyt z;|X92%J0h#ilMZ&uo#isH#zvy`J9L0pkkWZVT;vbx3oSr!GqO&TcDKe8{qVJ76$Pk$fB$ z3Xm>1@(P0~LKj?_Ubm3GfdP}#jl%lWJ)q3fz1AWlG}$bQsfRV%0ay2=4gwW=qQv8| z6p2MM|NN=sI7>2>c~)!V412@MP17Fo1+1o_*ABeP4VWTr1E3O1EAXuli{SZUhLu#@ zQ0pFPl9wF`9He3OmM^AsbYDCPGaGu@n08X1T5rC)1Rz|+UT2J)yi)JBL+IY^^rFB9 zHaTgLknbF{v4$6JMPHDd zns%AFD|gmYP(1;y9jqhF^Zl1@G=R;QKim=lkt7aFImvdcx;yWNT4%u&NxU6z5w#7j zR}imcF+W!UXAdA&P!ZE7-=#WZ&k0ALjm?kUE9}gt99Uu`PJ2!;F-a7Wg$5Y4fn&gPNjAox`!G~+^j%Pu9fa}{y3l#J)J?2t_TohX z{PhhxEcDA~(RJ7Iht&8#T((|NG-Se9|!j&}Rms0_NMhmj}XV*yNLW3_1;` z;7GE3Zvi4An~0RH&p_U1CtGtEa(q`&`PIX)=4gosheO8qt-`qX!;5+nYzn^gIn5E1 zh07cj0q?s@%?tvv7#g*#>zDZ@ZQRTe(OY;q+y*-)E5{{mzwLD^Qwm6y52)#~ovv z0p6}E4A=0E5=}kh3)X-aiP^3vs*z5Op z-}>#hFaKuFoSEOuIWza(nVA7vzweZpFg?3oqoqJaA^XMyAB{UUU`G-esqI0tR5cKirbwE|Ng2;-0R~i?&|Ofo;76P}!(>)R}8bwRXG@ zTmi@1CZEiu8G;|c?l?`$XRE(B8Uy?hAiJc1USNiKt-1b+l4^0lqf^x!_5&5u*^*8$ z&hU+JH>WJ>%$vba`u7~B6#?k*V}os@0F(jDLK5-JLi)wFR*XQN`XmFcMmkd3->ozs zw7CgMYWbE3a@+3R@R^L~5A5p7f0_!kL;ZT!sksXedDVS(mppitlF}=G--g%x_@=19 z11n1gH0`fbgb4(SDsWr`wtME{K~t(OE<9A1c;q>)LFafdTWnM%jh8Q+@!lEO2HZBa z*kUUYj4{ibhuQA_)z}(ULto?XSnRuZ?~Fx1jhwoJ*tHIS^yJ-=d+V-_qV3+Qw&BDx zC1J)hLl3ExD(B@p`9X>3De@een3~8h8}TZpZ`-psF?zn|NWPa?RolCrOx*H_N^RQT zDh087YvMmXAdS;yziy1xFPiQWx+VHVGjRmMZ4&_UQF^p&J8DN49-lR!wjR4xq61Eu z5qHH2r(u4orFkr>VPRzf%I3VK1)Op_MN60CMT{5QVk0Zyd-aFOh2lImnJ(lxHpf`a zltm5V2W%{4KMOR*D}punGSEZZA@Qnca~~g^{w8a$qLMTr``x)|2I)9ha!W+S1=CA= z&D0R*NBb3$)?!Lne?{|VeO;uM0tC>}IdAiR*s5}hC0I0PJuvqHDlf65L}#(*DCo$@ z&_gD%{nt-{e4Py;hy~F--pArLu*8r~I>av|0&}RYmltQ5{cX0XV%y>thP5^7| zQ%K8i6LUgpQ6@J9Slzf{KQqYrhag&}Ps$p2^ExFTfq{0e=-RK(Xk-6_x zjq0COlXCEbgR}wegkgd&+`Ve8-SrK<7h`c*Ms4jow*pK;pB=b2M^nL{mU*GTV~26C z;R{FFw}9TA!^dt*+Xjq`z)7>D3IrCr4=Q z(1Qm$tRoDsafgq5o82Z>Z%nQlfIb!yI@XP4r~wGyyEI3e?_3FORBwwG<}=|9Kqibg z{ABsAr@!So#gbiojzQcqB*{viKF+eruEc3+{TluY&`X&4Irpk2I3YsPW`Dir>!Kq!!;Zo~rkfkr<3kQE)9c#BRE!>?_8wfrx#5ePaALYm;6R zy%ULR^0}aJ_^6UhQ>1!@u)_`Ri#oDSmRm0+C$HvwYa&(Jz~N(mY-e73PM${!cbgxg zijmemWChh>`r!!D%E}@`114JH(}rcwipOZ}0T@+Yarut?pNeA2_Lau66*dA~TwKRX zFZ!3|$U7kGq_&FsO?qVA!c7W=2b)o27{dFdy!@3zPm0%D=;6!ebz>g<1p2!i-*-~) zhs?~zx{9g;UVlTK>~l5p6t~CR&}I!1y}mqK&8xNf0b0YYkW_S!BjLJA)qUh?pptt# zL4tV7vD2?j!8_uor%hqJUmL-m4BjQMKfoYYP#0v@PL>_l?GJr=3|k*RqOpBJjMC7m z&d;|Usd43@>gh=za1o9T@29}xrd-b1J}=}AQ6E6K>mX9(p7^%f5N zxu266zR=xQMofB=?xKvXye8U0#B+q|xV>siBmX?w>-Ws_1(5uZT^jvFqzbCBIf3B; zx(v@`xR5P`VI?8{+{bJY1zJfQDCZtmxIK%rtk;<1&^I==%{3r)KYpK_VoGhyrTW9| z7_he_fnC0ZW~D;nsjgglt!Y|~E{pie%Fydp=92`o%L3ixa^?!B{U40^ix~ey1iiUe zf#|vJ@=anG-*_y$7om1Rf@UBmehN)A?h^+KcbE9h>$@A{Xs;E)@xkLIDB6lir>nq) z+xFvP&m&`_(pM61y5q2D6N+?QWJiP(>-f-k^{fjWzPo0l{`A-2(>-6V zz#Vgo*Vz`UABMwM^3~&nAq&GE8<;m(5)S3C^2EA2OdpnHma#0|t8l~wSPr_c6@1H) zjsV2R3r`+e`^_wVKm;3HF$O~&1{pqnOw+O)Y(>@rV~X0u>awyS9yfPgg3|va_^6LFa(E9MU~pT0;*W871+s5z0|l}<&MEYY;xlrghZ z3R1<+ZM)UUqm9K!N# z>$`^v4bL;{M?|x{YyJUd@%Ci_%k@fI?M;wvF^!Ftb z5+=2H`oNc%=7ee3Dd~nwJM=B|(uQR(JO%NxQ{05rA8Ms)%ZT+Uyo@pbkwcrAd5{U0 zUbdZV(W(0GVKK?_1UG#NK5K?Zi>n&ZhDb6%e|oKI@%k$j&pN%wz>YZ4dY zB^~GJhiNVN?-l@=$2HjQX~2&h$n;N&5cf)4mo4MBr$vXhMn1Q6jAYqjvrEaW(K$Fr zJR2Qzf4_T#XwMOQGR$qLuEM2RWe95=oC60OCQ$6Mcl8xxJo<3iYJbhPp|fMy0UB~c zAXhFLuB;R8vOWTNHt71X&}+OfS>MD%ZbY)!S|J!)71lmX9`ITp=oV=&nYD)R3LYT8 z+uKej@fdHw(q*h%R6K#Oq-4%}0jhk|7fVypl$mJY@mw-<+P-k!m0LhJOGKc7j(>FEnf?*< zmDH*os{49fA$oU#<@OzgHeR#)f6{)wTc!C_dhMT2|GgmcYO5~-;0%v)3W zI^*{7+A_xV$dCws!+6o$f`XXgiuwxydn>W=lG;Y{iS?5rdu%DL<6?3xTr8Q*Ul_^- z*25WE@}`Eq&NSb~y!Atxx_cU-2T!GqJO%UPHmyA0M(!!)YMnUSpbodJbzgns_%fOg zX9wXDA#-7=g7pWlBW5FoQi(q(#yF&uquX(dXpTz!mB0sFstf~oG+no&8)rP-!b<0V>|q zuXPgs)>G)I=gK&Yj`67KvXb5kl!ymCtad2*duA1}BeAd1#x z8oDhAC@*zzIpg@-@{XU3wL)!rW7?cVyT5r9ND%CUOxkhz@|Ff>A`-{!>f(68TXUFp zeo+^CA8_72?|CY6WRaLDH3lO8$kOVPa{y;}|JZ;s|M>c~3bTYW?aWt~mzi{nl2p9^ zxc$~NpuAbL#e%$Emt&U2c5@S|r(wHN{Udnk!OacVoY#0u_gbbH4gM?Z85K1>g~{CZ zZ<+?wGT;F2>FVh@GYs?EQ1_dug+0pd()U+h-Cqmbrz*DgY3!zxg((PFc`|-h@L&Jg zT*f2y24U#tN!_OJ`4(HQwBu4ygN_ycvnfgqRqm}WEB^+&Jio}&&w+eRN8KaAzI8#J zRbOu%xkNpqTUzmnUh}jGFAtt1Fn(L*tQ@yOeM-jT8pK6G9PY|F&Ebjalo$ko)0WcW zC0JKa)yfv_8Sj=?nBYbE0JlJ+&QoHbbfvp6$os~ z7_4F~Gp>yJT-wGYM#pgA3pgIPg(+_kb~!`{`;~MNK=jRAo?%O7jkDCE-56t7e;tLh z9c=x%tX6S9-wrVz0DH$--(5s=q9!~0m&CidfQqTSLLunlYzZwaVXC2N|$OQ!wjTgp)sl&x=?G# zxf9}w+l+N}n-oSOwv9_hl}l9;RUJQURmeEZ)9s`pwtLk@9s@D%R-tsvY94;S;@2FQ z2-({@ED)HJ(mt^IbXVFSZ6;>Nn>Xi33zxvI#?|#49a=W&JtR9CH5+NmFPmc-?mePY zff6R%+IQ^@q$8qH!eOK~DO%O%Y1w{}^yVdLmH+4NkO zle~omy>?_ab_0<07pWED3 zzbybnH;}scplZRbAjLP=4Z{2HZ2ltVo9@iwNSH60g92CA-&_2~Xt;AbVMt8yM#ux{ z2`7j%E625>e;|D9rcqM-x^;jHylByK>bb1bZ(RPCpPf2fYCJKIFTA&@q~Lm(xK`|M z692xxN>j7|Sd6!cjf0K%{lE174|dK@vIeiuAP7SVPCj{VVWR)9elzzvyM`<;3Ma4n z#M1u|F&1%aAsczolZq0UM3ZIpd50|nyl*$g$z)NHm-?Ch=Wc7PH z#qyOTp~f$KgUl#fZKXFO^xwpPtxQ|pN(hya?^16mhK6_@C2^kTnvUTPEBM9ke|h^6 z`%4)Udx^P~dB9M{X_c3T*W}X`I2!*CFX641tyCc@N6Q<*1H;4M`NNM9zcKljfW3M2 zip^rmia4!iF)=xA*OATbxPPaK+)l_26|4FLyxD(Gk@qEJGXE|KQ+SFX=~aFX3Ht?| iUoegOCkq4+PpEykc_*)f_PwZppV}jcGWMbAyZ-`4^o?Tx diff --git a/genplus-gx/gx/images/Banner_top.png b/genplus-gx/gx/images/Banner_top.png deleted file mode 100644 index 1ac9b04316aac2c07852dd0975c472f5f137b156..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6169 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

>j$ zsJa!Of=zhNAi$NR-#Ib1v^JTGHrY*|&qc7wGYo)a9^HN4t+8ou*!K|z67Q{A$Ar0n zXZ})F@_biJYP2dyYAOOH|m9wMm6`_ zH^96&mXmXNy5jNS2_oj{6R{bdcegjVe|?AhS9dtw+yJV0c=yiEH>x}fA3#dazhnMZ zTEk8QG|CeHfeM@XKy@yv4V6y=AY_NrxJn6y31HB^H2fA61J0Fb_dVB%COz`$ z&K+nSa}2BvINjXgpZv~m;gdJ_fKL3?7hm9C|JfH90N$LfXXiH$SKFu68oGb}_7y&P zbrXewG}Z+UtYtzbb9)_Acop@5WPKX~H0~2)AJ#a$HDDSou*ax~;O_2>0mVKhFfFuv zKA$jWxA3y%4#obV0lg{q?E;{=u?%Rl5v9yGjFgK1Os~HUko;TSGev;ub%lXGSZdCa z?p+rY;K67rL(it2^gaZ=CD57jV# zuzT*it#2&{*cN+^ReE@cPs@U-z#LoTK1mT)tmvI;J>}M=3PP8 zyzIm1YgUwV_h$(&h2PW9s1&9LJjwai3UxppfOjHj3=RkyOfax=vwJbozHNX4&ri>I z`uK=X-oD1ehmV+JS|2pnIo-W|gWebH+Xee|!@gY$XmbyERIjrkbT*$ikGi@7){p~q zWe|7>pHkV^(m{=oN)dEaDX|t&%Xo*Ibq8KfRgN}5P=HT0M9UD$d zx7H*gUPPJ2K*jrE_f+P=CFl%&6!f97_uNlD6em`#P4M`9#qD{;+Rfnq`0)vU^|PPj z5B|r0hR2WJ;(EORFt2s*4ZrjIzmMPk2fu-JwK?LtJ>a}doZG~|{&(NtH$J<^XRprq z%U^uNRZS(f0?}-i`4)T!Pu@geF=ig$SGEdKk9~me_tWu#hnCN3RGc5vi%32 zz5b(p+k)w1He*rms#H%e6m5~4%=1d%;h*)-G*vS;p$HETkb}l@T;VGGK#qWqjS$-(C@TPc3E)u`b51m*;2fmy6|E_8#p%PB*sz z1as_I)-z1Gj1at5?VX-(!lN+axQ22d<#dwA#YbutpkU!6HvnB_T2;LBRx}tc0>r6^ zuBuR|qgGYYh_df7d}V#fyif)n)+#71j8e%kadcGxB9}_apIk(M1B9SM&F?yXMZ@DG zq;=|Fmsb=}!ahiq-d~>kaW%I7-V@+O0ff!FW&xA<9$4k8%gOG05&WFr<)0?^+d-Be zZvR5Ir}wn-t{d~^bLNF2jrms6xD|fODS$x2Kez7#b7<(0dMby{|Z}p8lYMb-lrle)1boZJ3sXihbX3y*}f#3T~E$o7LK^ynS`XkKW$l)7Lk+ zJ=uFv&0FLSc`c?iy(BEpt>tzQ3(RSIHuo9*HRn+5p8UKllv}(~@|mSuOxK|;=!c-R z^@at{`1wDe;?#%V_ZP_{aEKWFEel(vbu3HI!OVz|uM1aAOD8BZ zxbu*oSDyOz+R%wht^avhJ(WS7@=Mumh6c=Tq4jQOiV&J>=j($GldbtD*6TD=CuTT_uA2v-j8u+Gxq$zxc=P+anR^SlppKSBV{tGdFcMo6H*XL zUgHZ+!&M#ONKI$0!2TzsM=rLz_3&qjr}Gs<=);#@a3F1$PVgTcG z({TN;LnrXO`4~9=zaHsrpOLyrVoG%$bWcoxEk-WceMyItdincT~uL^IjK)R0x+xERYhkHH!xx0I} ztV(xK(>Se+=rswj`E>$f0l;pCmWM;(&pq%p7ta}g8&;ztJa*sdxpn}}{saQ|WNB8i zHW&ofF;sMq!_9#dn1atheH8| z`?P>(yEWw+ss=o?!Xi+CA{sukx;8v(&MUEg?y)AI5npQpl$5U(l=y}1UrONMzxC$# zycY3J#XSjN8U66<68sik=KlHV9}8x9e*O_kTO0W}fXQb1%yf((e%{g%XpON*{u6-r zFZCX!QzhDl5$xq?Q$&;S@^#lCFWz;7Q27?=*lC4OwKd@N?FnChe8Sy%#V@}7h;N=g z$3Oe0|1Gw;p!F4KHcwaj0z|rqw>WFcCU5qSbLAWm`1QhVWB|tUbP|(y{!g!{D7k_n1kgeX)0oCFr*||@fwHU}`*!?Z7|L8{ zgvb#L4b6Rs974_C9n_^}!(A%K@HC18!g4)9Gp|c&yi8A-t53&Z)Tl#`ctzn4O&T9hbsl3`Rnd9no-+IS(dB%3VTAPkB(bok~ML(@L zozA#CJ!89CzeQEezGu;X1PAXn*hk|zW z#mN-3=W`sMEqb!qx9b9WQ3I5{INkJ8xqJ!tb3T7Ofxq1#Kmk774Fa-&3uXTf5faKK zFltbsVF6C{JR+h|jNmMIoXMMwDIVt4(=hn*zK7Onfbo=)44mg67|IqS^g?SKotCEu zju8t=|HSVGtQ&oZ`wwKuGH zCnKYg(Znb=4TII=b2H@`cd+*JR8h=*U`+Nbv_{y5Lyjpue{Wuu{^3~6b1X%?51{?h zEgFR>OlYA*`wYDY;bqbMo%Kwc!2kqo8iIo!kMw}CIiU&n)Zk>|L$w-J8qGl*!!|Wc z$;le^5$Ht%9mm56AWP-+&& zB1u_T-W!Teg*J`^vU#@q7}oF4A4VyZ3k`3VEh?BJU(zcW*mtc>g*43u%f2`2VLMqY zj9^p8TydyiY&-h0#Mwl{VQA2bfx2m)&!uBrHuSZ7`#GNe)sB?^bAEGBSl67*%sjZT7(n?Q!O6EeLwQ2-o{`#~C;FKLxKMD@TQ{JRdrFJL>Dtk|moO{9j%CjyfV&~b6zQMiJ5wyU)`NMzwoA~2@ z`vrPm@DF})i;o}PqxTh@_dd1@%u}{PdWVi3V|&8BKV!c>V~!0UA0Ht=~pq~?S0(bW(v}WmGj39lO_v%bbY08z}A;jnGr(b@`C#XbjG>rokM zAd7UAd(a>;!*r2uqq$0MRM28sA3Y(2zOA=xAwtCo56|cX#`uo%0}QmFHT2U7a}3c~^Ag&da+37@xoeLIC zUalgT#b%SOcC9Zpko5#BimOj{`Gep79ItLxY>ywXFAMs*VjUB0IYn9vaKW55f$zr8&{ znoT4EKg$Yxg;%0ybOYcNo$8UyL)4(bhK?Og6c1Mg%O8?-6ie@Bc;fHJ>&Pz%onatw zVtIXk#>3O2l?2lQioA9Wr9j~}!Xp;v>;D#h>9BbTX6)zg4Ky22CSuSNRSqwdO6F|9 zt!xrL!ya+(0@&D-NXpX(e``Ro1du}4vWC(kph&_mnie<^VL&;b7GmE^18N3SDbb@;T8*>fa^Aj7W(cdq? zgm3EfkR<74@r3!|0WeX+c32T?QtQn=@NR+ye3*6G@TnO!Fhu7gphd0vNn zWv8L=wh-9F8n~{caS#-f7mG|Z(bXt?ZQZ2#!-B-h4nfwcptu8=XXJ-zd3g9eHsv<#qOVvY^J`1TP$`{G-?esyc< zSo=5tD>lBKQ?ZYMg^?=4}t|0!60@Y!mc2Ya*!!U z^Dr~?>i_n2(}7cSA01~Ls)b!Prm$AT6p16a^fmb}XpwT4W{f{`K8SGj45h{PD4fHX zU{hmTthEL6>?GFFJWM*-jzp$k2Y@OTANM6d&Zu+&D8g1IPWUphFmF=x8PfSMqv3BW zdaVf=$6W3PWF|y&j=h)VHCNcQPC_Scz$@q^T!7dFE)&A!}W5p$u3?2c{-nPzPZ7+U2%DM zG`g(0p&$X<2rF`5sBrGFv`_+3ajf~t;CBaglwH#MAw*m~IL%W5QWjm18dS4oN%m*6D2YNNS2uKTYY{=K+a)kLKo44TfEF`& z6_^72{OkAFcg4-Q&+UvIeCB`CX5C+qL~h!+94qtieqP= zrsJj;w=4pjJ8;>`+UAiGL)U*FU&$oShsK|lCvMNVynlF3;y*w}haF;yU8xMLywE@5 zlO+oJc70Pog`Ei7Q}EjKkO1)NpY-Ob&a8kG08>ieEMp?(+T^oV!Gg%OYn~gXLAVNr z7b>&U^OB>sN}z^rAtW6$uZtFn0Wx3;Ya(s^^g^=jg_P>exPEDhNd>~tD<4Sx1{G*d z%$Tr2sc0S^>xizpM^ZnpYu*dEx5otvN`8ea2^!sNFKt7_^2JzPDk9k3s)Dv)dQQPG zpeWF0KaV*b0CAL-t!LjEdiFh0MB9uCmidbOAg5Vchooa(NBkGknCs#1!x|uDiw{70 z!{U~%32d`K$Mp(^?*Iu9Vl?W4G3bW^JZ_Y#PbmBq%d!}FW08YqL-6ppiNslgz_2e) zzTWsjOY0xB0M-F(7y^^y{@Ha~oauoW$v@Db0f8AJ%hH1uTXXDDjQ z7v3`R_Qa}-$B2}S07K-%7Jgi8PtVw%pFQmAAQOtVELcTweZD}vf>&D4^9iNUAK1H1`y?pE`bKoGG!Qae!I%nC`w$HcieKE{#whIFq&)v4jxw-9+2 zv_zxynp4UHEj*lUW6~>2gD#HR&x=*1QqP3f(tuKa9w>$yzf@(Wy~X<2EGR0VtkB`X z7!JCS%m=0{G*<_!93P zF6d2gds^|sPw#QNF3>UX@#%_(=MCF##TNi@dtPySUc&RJP;akBv1dGDwCnSotv$g( zj|AQM_O;%;$aCUy*&zUya|clS$AZLU-w`v&I-l9gS}D&}Nm0%tpbqepa{xPMi!8U^ zm8l!A!BW1z6o*TI9d~&XMKiROc{CCiD|`_160`c1H?{T< zOlk&FnV5jo5ExY6k$DbtzAHYrO{8&^1s*+ zxbZ+CFfYzjWLPq59873MYe;%8=XaiuqN%%LED3I4*l}rsHieNC7Z?-0Ef4_vzDNF? zkQl<-sBs!Bi0J0>3mW8_%fXwz?eu){gbFc`UYkvF=!=d0T5rz);JGsiEJ+g#eJT*1 zDfYHwPs=gfo9G~r^KE%HoYC7FFm~I!eM|#mU=OmS=PJlKLTk8%A8mbvR=#^4n}pF5 zp%$d_gV3vOp;{UT!6E^u5Sm9iBJ`fZeS&`J_MKCpKF<(N(3!WwnZp*CziW`GXg)(a z&oUS21SSZ>{F+`68beAMg>RX zA-(madGmhztq9V3rqUedr;|3MKDUH?v{7#^FXM2FSIhx2H>(99(Gc)Qr)+mxwd*)S zXtB+4zBB?dy$8PEc2Sb^5ik08itr~*o3W^YLYQ_EV7H`2WOHJtyH-DI0BX#WK!*EI<9K*;AB+N_JhpPL9dAV5c@dPP(>y=hUm6Qs&uJB0cUw6ActMtQgsCc)`@1vVKR%ilP7Gk694xQF{0VX%`IiDG6g-gedEPsD-4NA{H&3z*n zE}%Rn!T9HOmRYDSXrgzaS3R=F=K%HYM@>NKrX$909#=d%3BnGkk>qn<3`hTK}<7=?>9e>=9(o# zVSWyCMyOC)gLH{7O7LI+LWggXK#^Wl=33G_HI+&?yZ#d-OC^r7UlMP#LGvCwGCU_K z6nYSrQ=I3oiVJosX!ggm@ULl*{bFrrtlE0wbaTdfK11ig({@E)7p&(SjD5p?-7>#e zv$!V*` z2|<}DBQ-5XDMJ`~sPdUha+>G5@)uO)1<(W!*Ms%S>i}2raepOU*-r#lH1>1d1i5hy z^A`B6s+QAuo@@?HdMn`8*I6)L{G+#q4M6mG^kN|rt%ZCg(_UC0RnO2rORyp#OL(6= zhw1VuCQ8AInrINu0Lsi;wP&8g^xe8HZXl;3Z9G!yY5}&VD}HZX@JR#4>4b56hu?mD zz}$EI>2=3XMR0dsu`V4?*Jl8NH?MBv9CAFX%K@)WZ{jH=exm!n1DGxY5j|TYodsh3 z_r}ES{n-sUo1Tz(_b+e2m!)h5GN?AZKB*BmXtEB9@766Pu zbH9EpdCe(L!Y(yM+^hL#~lPJe-@?=00$*$N-H3pj!){G0b>SKgY!Z zPHzoM@3_tk^X|hYVsyU`b7Xo6kJI~X-mEh9WKNte7G?Oa}yT@9fwu=Y*cuUg&VD z^_F7+4@aC?w|fca3S|;$IMiO@A0F5~Mx+qL_h4r=Q9abgv=pqA!_hcbGS}1E6M5xr z>xf=zRPymmq^DZ7Ntrzy8WRbS_U$H#d0o$tQUH@X=&e@7S+boR$@1-!P-6W@iq7IZ&Xy zak$Oh`?{oU0SzKF81h|tIeFnc^NXuSWpo%AV9x82H$bC+ zMs83;0fyz7(6SQW*2W9^zETbV0nQ_}rtkp&tj``fZT^|s=eBut!(>?ky@(>{M3atz zVL8?I0=95!Cr~3@R-b;OXg#R=TN4BO_Bt`Ap>A&{yl*H?|$BR%o&G<}-TT<5mP~|`_t%zhVaVNE3y9NHcSX<=JZ#<5*qlEX8hiz;AlDNfDF-w)?8rT2n5lXj5D>{0 zW>u`d=H@xc4pazAdS5apu__KIbXd6wY4-B?g#Ef*X2J zI_4Od`|!3i9wLQRTW(h~D9BF~B1X?62#I{nXQ!9j_RF5FvC#Ofo>n)=$<(>huq=n4Q;s*yi;$Bu&wAxEgrJk(GB^ne3%=iuBz5=9O;Pgyc%6w6~ zX!$okRlr+`Y>$?*ko}Xf)I%-akySJx}wy{Cc z8U+@t&{0<8pm++&5DwtdvLiT224{G=R@bhcOdXij!5^#Tm{$<_Ps04H^ll7-#)9qy z>EWO(wkwtu72#UjSwwFvnv?oY&Q= z%*8xZRiHNj(wlkp*peW6BHE{xr3Y=%+5o+T6QM zp}u>5md(V@vk`EnsGm`Ia%iMT(4P8rCE9JcaA%__2f_P(g(`4by#>s43%@b!l^zxw zxo6j7dIEDWsa#mtL#pXQZ&G;%8c@-4!>jcuaD$g6n1G6$o8P)MW!{HX{`L@p$-~Us z36Kzc!F%xe#Cz!Fx|=ks%#{rK+b@qwng+`ulp&c@mMH-&NRrH5ssaGTM6*pR-}RTnzYWQ6NsZF)c)3O~PycKGI+TKmm;5 zVMdv5OejiX8|V><=!K?XDEaFbNS=bpceq?HKq)9s@?7CY5#?`4y~DK;@;}a<(cc2V zQ&Q%=!sA=kqZQ-@uqqD}@~+Sd-&5n_xThC^5o{{c8;XpKb&<~q7sZPD^4dJ3R$4pp z`O5y3M~=0JG2q@Q&|BwwNYz(lOYefQkBB&}rzLokp<^quhS@zwwRf1zC-v8*e8-WuNiqu;~-ym$QZAO9=-@UwfoxxaCF?K++o?V&Z8 zy+3w3Dl}wCTiEy4WLxio)7fV9rXNaUAGDQB;)DT3&o^i@M@*ZFZL=s$=DJey*_T^` zw{Rjj2im$|d${24Ea+{9KJQ|EYa^BGR{^}DTdUXo`|=7091u~}<u480H*$nHdfV`RB zrpbeL!Oc7bT4c#kX5FHIIqnnlyvgK|+s9C*rreF1F-_oBy`KyN=Xz!^g~GzRCLjQ9 zh};u;jCc+dIusgAmQ`5mkBxITJx{8JXb6xf;MsbibKQRJ1h#P~K@gGqJ4FZNFKelTk+m~28gWLa`U;gU4Ya58S}cEmu8H}`!YPxvf*!Ok)xnT z)PabHwL|bY*r1oS<~cDZu9aLs=C5g`Nm}U5`KPcOghq;mE9(qk_G@cSK%oQc*TwP~ zr%xcE&?h~HZ#Q_1%s@|IdLIq5k`E>FM-m(=FfBi+tsUCaIIFspX&i@!tS*%4scF4o z!1J6m8I*adBFuNR`=%FwAN7@%_p=|N{UK$eH6AeKj3+UH6GOT8uG?(A(~YN=a;~=nU0Yshf)7g_ zY57b681h``NsMB#k{$)P9%}A+9Y*KNvUpEQWV@z0Y##;AbTjrh3J|*h*B$#;-{Ah~ zitF1I`~HBh{`4<#{qsM=8*l%1|Krc`>djl+oo_M6e+PN~BEhSZhoAvX(_n!`k;Yzh z_e}Z(yqLz@*0iNN&muj5evhNSm+v8DpB;OG0hMWU*Htlgb41L@v9|p89tNKHe!D~E ze8%$FakD7C+y|EK{X+>L4}|$$koTRMg73jAFh~5Hbhf;ExTJsu!m4I9aE2NZ^@&S+ zRyJnNP$7B<=!r8=gniE{a#9)9Esl_#B#}`-B^W4zjz1UhMmd*V>ea5~#UE@R!?p0i zdm-EiHOI5s`}L9u-2C4S=<0x{%15WS&Umd1;T4MFJc`xV?2u z9T;=sv@CoQFw_%aOYz(qxG-quffA?3yVrMk{`dq{#rAlC0UIB*?x9zP$%7Qc3OyQu z4YUX@L1P;axG`|>IN5nb|2v+AkjaiYLBk7lCM-;-^BM%C&}X$kOP{0|5w79al= z;aeflnPtJ5lgPf5qKHWuY&Sur2rYn?>+q1AbmnTg0zCjMghGrnK^lc|1`@$T&=aX% z%w@dYqPkb-#Pf%bcCBW~?tNL%TgSd{XiLZG_6CX@oNjJ#d3rL>BH*Af^SXF6b}eg( zp>tr@>BU=sijCcjGfVMnbl8qzQHBxY+ET*pq={Ch-c)8*AUZ(s4HA(SBY>|Q8&cGA z1%J-XQqls7%u>;;P!F&P^Rg=0+RFkGFgIBLNYH!c^eCoNR_OueF{XuV#q&U! z-)Wl7XxQ5fsUb)7UwpvLSMMNQFuwX4|L$M>3*frr&DsH-m}B7P<_51n`5_*@{sN!9 zxx=%ZVw9)pgL2B$?Z_!QVUQJ?8@shiTGwu@JAI1x!q9o@DkHL_k?9pbps&L!6C#;;j&-#iiqR)zzZnx zNB*r447DyH%iH@io}O(I2!&rD8>ID}Ax9Hhru3a40%)WnX;LOfBiMMB?T zae!JIMAJ)1CgJ~?dzO3DnYb@$loMn($$j7}^47}!k*`?V67`@8E35&VjoOHOxaS204dn$v0|$o z@U9NNRBbHM?usqv{7x*rVLf%ThP_JJ?yo`D>(V^}QGir{#bRXni>)%#TSE}4;T>kN zN|TlaB`)y7+o7aWIb4f2UxH{VW={oiA+Jlvvc7ESTOkR#C*^?pUfLc2Iv5&rgHpPC za5RmNQV|=8-9Zt2+wIMX_(PV z@02FM2Pkl9upsu4fZrkvlptx?*a>D^s04qh80&fGU(SaPE~W5dP#kfFz6>2BzoVM@ zo-VQC0W<>p@!f-Qz~B2hN+2!q97h1s&0w1Ty{5V6{+#jsl7CCjpzwJD_yUKjdg>MG zF@6>eR%JfHl0qAAW)H&evGarqFk41TP@WO6h=K|*pRbTPv9$%dU4XBjadHFL6w}1z z;{(uEETeL?c#DPm<1`yzDfj+l5-c#m6no)J2GsfD9x5#h_Vqe*Tju9@Hj(x z@%F4{q+)#Oh81Cs9HPoDS<(J&N{}?{-ixV`XE(+)?@_fvzO!`>AiL-0Q84=la$Ot< zo}R=65J}WoeJsI5JcuR|tz}4(0>r-aqx{9uDtaB4x3vzisRaXANV zK=Y(+}hV}wrYn)w$lSPkrUobS)LK3*`c z8}{oS4A;6b`MNH+UPpwVM8w_tQoK=uCjD@x0c1_On1vY@PFnH-Ecvt4O)sJS)InI* zj_o?YHXCbS0({j;8dmtggn4)<+=V|~0ELd3GGImkL)zSWb^0_Q&bBY1@Jcl^!6Y3y zp@^eOx8#$7EhbFhjlqzMU2F0FW0`V6j!RGx8xsU6alHUq{v|PH275jUN@ZsO6LBBE zQSiASWD++>3vJrpo?0zv;9~4Gt#j1we`OGWB~(h+x3F&azX2sAISXY z))(B|-5CumreHsO^9}aP1;TSH;LiOeXnlc#z`%abuvw0lBPdCrRe_*U)zRC@9|8nX zRy+MC)l2TDqmXt;8!BhYGi=F=>{-f3t0CgZdqf_h(POCyqs(kcCj#mOg0I}S+B}~$ zco;$uB3O%DWF@;MFMwJy^^>C#a}**YJ)x>Xr%8O4vNa0xe7_wEJDJb2=lR^sFD9>7 zrvn&WlawD)_8F}~uLIk|vl+y5;wn~^JLbS9g0l)*TYzuB#r63k*3*hbB*W^hG^P(? zK}={uG|;v)82iMSz_K)-3c|&>A+Nx;?O4#u=u67Nazw6^Y5`&t94dldCKOPcE@eE{ zqjC3XwTr8#3fcE85_tRSHMXaZ_~hY=pMA5Vce+qq*5>j3>emrj{rbI9bsd&!>POK< zu{L1&#k&XW^ti>=GOR1XgM9H!%$08!3x@QhI4L7w5n}H-K8?gAMd-~rvthJ9 z+0vTlLZ%gOMKu|=i%AbiA#T;y?Et#xWKjmf@}_d9T$nCgrh{!Z1!fKag+sJeX$|{6 zVj_efX9O=x3-1xFohEsm=8AwIuZFexp1|@~1g)$=Awv@MfX! zAC1;Zi=t4ft-EsClP(Pb*m_@>XW>EdeG(xk&}cH9GznMou08{Jzf@rCV`n);%*m{4 zVtDv+-Q%9B^g7$cBGEcfj^=@(Kf9)O!3PhlcF zo8kdrBfbPR2HI?r2SH)8a9Sqm9zbPI@W~2jLlr263u*9%r^~B%o2P|9HtgGmWm&MC zPDU4Fp!JUBbb`)_?b(1M8oU{_$%+aLgv1wG9}sUUs4l-CEFj7`scF!K0H<`1hm{a+ z1#A&msu>1GxH)1iQg*mUd1~$;U?EgpH}{^Oro09WuqUuB51n7<&o5Q9h(}`VLs3-d zil6hSdCdf+{2V{7UbI6x%Dq!xskRBU?vGOpG=Y05%i1KrYkdXN@Xv@!-l%$f>G2GR z;<5|DW4S408CA8R@n62jvJLD@!#<})Cj8Tz0?i#D%ku+1{(pat+n@XhW4mCvS?noW zaSjOe3Ls)_yewB%bDXOPPG>K03;IeqtJAQvMfE0H>)^=2@MOjx^=ymNqsTq;P73Oa z{XUI21&@zc+@4n~C-Zvlv!Si`xc}r6{P5{3eDz^q)SkuEQ-3Y`3vzgI#{c2({1@C}(O#DrFB zhRa+fUhfESz~!*O!XJgj90YB&C`gp)^!Cs+P(aO{K9qYwwMq8K>*3!%pSN!e6$ znoO`KUx+j-l;{G8<;%@|2gKSRtf!M*R})l*-9ozJu@|=Gp-)X3Y*Z{1o}?9@Ck@R) z1A5d$K_NY~RNjpq;X;XZvNt{0mQO1<->lJoh&%{->m!8biY}yO)YxIRBa=WxIzm}3vcBfX(%!>dnTL0ZH6ufE2*u2zM;Z5amF^jw*DrUDLI zd8TaS?}CqttYG8*%;Aj-5xc}sOsR;LCRJMoLP?!b$v3)6yvPBU6nMU#V_^qE7M05@ z`LNtN#3kiOeH6<63hEMYaShd=hM&Ju(EDd>kFtGEc!&Lxib_9aU!qV02{d>nu^f9i z0?N9N=?*w>Wc(C-<2I1Ke?;@h*0Tb;Di+w^5b>Gd4Qm(RFa8|wp1#59?b)m8DRXV@ z%xzzm4W}E$>GlS#ov`l{-+cLmu}`dL1CBZ>eWVVSZcZbemWN(@tY%>$WwOTkz65`U zKQzvW@;A~3T1u|IEO>t2@Ja+j6m4BGMnhk3aevqG`RfHgedkUPC)EFx+`ja@|9ZU& z3&zhPmZ~P0Xk#CMnqsm3IvSv6csSO)Jud4?5eEOMV7rOpx^JFu=AfZ)I;2^cZdtnJ ze|e4{0R@!<^ZEEPj}}8)87>wFe|BqeVnApEGE>b1>RzSFu$AS|6c8-c%Z3o7A@@sy zZ!7m_o{jZ|o7lDu7D5H!g7et(&)x@xmjA7j)+)VkML0Pa;2hJi@ck0Km7jfm9RSDo zG*NWZ)mU1`+8gd}&RCaTyp`f0E)^?$4NL2m#Q#FEw7R~KerzG6xV<~!_V#3J^7DRp z|Agm8oJq+P=TuEI6%8@&tj#EWiwiNdQSdtv*=r ztARjnSRR|vfAjmcLwW+&D-MD}Vc4YSsJIOJ_0KlHUR6$p3t18G;VX{v5chsTlTNF! zSI+76JBdJ~XF7_5wcPhi-d7kfoWr6La~qx`xMN(eXszMy%`2R5Z&F48SWYJ}#42UK zTJ^$_W=XfOXXLr3L6ve(>VG7i$d9AAalQxv#%Cr#qnt144y1$F`}|IvVL4lQ!KZQm zSQ9AN%^;nW&l$!&5cfeh2gS$QlR}&(C_@Qw$;XmB6{$){P{!va$P50^G@ue-rqcnC zppipo4&WeX37R$5ksCtUD*|9l^xye0#t+}%a@`=i_x@CCF?P|3D}YTE7d4(=bXe}3 z6fmQSef#o^^=8L%TA;FE%7SH?_`wfXoNw0HR@8A9TI*U9qI1Z z=M|JANy@#MGiQ;8h2YP4=}5%zkvE*hYwvq;fp|k(Z+(%>Yk!ZCqq^9?EgNCl^&1=5 z!raIT7hts3xMEs+zR4;Q`FrWRvnBTKMGWfe3@=F7RrYVc=5&VY74UH{V!3t?0+09| zzu}-R1duc3;sRrO3ztahtzMp*-XZQ;b>Z5oGM5BnwW>2Z%iD!5bnA*DTHQ1UfenZW z4n;UhGi&zde1ZUWp7aPH=RsR&x`qd+GVEFUV!ip;vgP*njLjP_&oS}*xY_l*EsMBf z<&0d_=?#)eBkE3N0lM`8WUoI`^}Y|V#ZZJ)m3wUuFRmzf<^+p|g0;JMN1> zy_K5;IRdZ{Q9&xwnC$Ifa0>cjOkwkzB?@cB=JC18Cl1Bj1iKh=A!FkUgzW&ym>Us)DZ&=SKD?m}jdOl$} zpE33w+w(JYrrZcI3N3V3pW6ga;@6bVv7P{XIPM4U5VG)aSI{sg-&vZ$4A5uy=|yo? zSd^DLrR{N&z&d0|+7&fnUg-Ec@_+wxCgj z$UTeRgghW_Wzb%sfAV};C5=|7LNvL6>lam^3r@fLW9aJ}eE7?+alPy~w}x8`e1zZv zV3~@WCKv)NPgl&#j(%PdbC(-T23eB8QMlO@7~eVH|G?{S`uYDtuM}%(pe@a?z|s`U(rlK(uG2>hnP;iP zJO)#NxsM|gCMCz%F)OO@yJ?xD3CkC~+V-Iod=>7}zj47~GP{5pR9_;;(n_dWI=94vaOUS}OM3y>K4BeqoA zvwcjA7?WoqVhVM7@2v9Old2hFBKT8;7hOc$^T%gOU>n|ssjj0;SlV+>D0=K|YwkHj z4G}t^WS=fAz_ZXib8vYwq15uETv__$9ZmirT_vs3I}oZXo4TsgFpdh^_OS?hR|qt| zNJj*)=5gXQj>_FsB$P=WRt*5tyr7A^R)$20ASQf30>qioz~>&>uakZKpaCpeTcBZF z+wZ#PB%81Om5o&%|K;`;O)Jip%D;QsY%jD1J@^b_b*eEZc`00eX2UAFS9(>Nf_ zBuJv7*5KKcmHgRcjRubuN}!VAGtUXp?#xh~1jd_IY{c!BU>f_~3pycx`umxWtHB$o zgC%&Cph8S=IZ#aSM|$vVfK2@W0lVFs5dg|D8W!}(RbOQqb0{my$6?N9JRQ%V{5!+o zdH{&f5~WglyqrGcEE8~Io4Eb_4fgYjKl_uP<4zU7ITZIz@P68KqOo*5UpB0FH+XYe zy^DwQwRGV6fG$^@?%!a!d5i7oBV-PY`2dk-*r6*kz~Ox3cv?T{SHR;P1B<)3>PiCm%PDQqo6A8YGgnW$lLGjV%mwXX8I66q(^ z3av#D1S49!Ftj`o>q}u1mOYuTdIvQ>MG&bjsia)23M+aV=qUrti(_q5hAWO1^x1sR zrFm~P2bFGEMPDfM%yCp3y{0L|qbHms&@-@--pkWsuKg}JOhvg~cg$(kW#(a{piIvx z0e$1FVW+7G&9^esGU%6pP_0UP=^0}|lnP~|sG!`U)CtJlp0-L5jAYb|q zG^WBU>vSJpKQA)L@KPEM>NIdL0NIKMK=bCgIu&h6`Xhb{g(jxh0~2U&T@}n0vZJJT zVM}kd8&8=WP9Dt3H9@!ZqWGC+sL_E6pYb~Y!fChl;PF&Q1V!qgx%jpYAUj(|Fz=H< zPAt|QGQ>c;10aGIQLy5h&m`i_>`9VwQY?(%xgjcBr8hi%{D{lb6Z*2?=Jq!FDW1+} z>=$6WQZd%~$kebEOgYW87JXa!8Lkg6WL)q z>lGwC{^_kftk=CVxmT_$B#n^Z4+vBy#y0WEs~h~_hp+KxU%bORY53u?;>SOJjX5U% z{L2SC?K}1_zQ#ZQ(Hp$FKl{J{K*tX3PmueLe!dH%cI=8d26SwIhZIle4%G&obm(Z% zP42K408&T5B4ztN4rA=XI5`*%C2tuL)3I3K!?X^!o=lebTh{)q#q#_F^dK>}tu!%)L_VE}5mjsD+9K|)6E8+! z=*vGV9^MPyZUNXxTVbU-NoHTYY*}ERZDsG|AT$q(1__pWr{^S@myL^GiV5nWP+qPe zL$C?GbF-|yTJN6EBi<*mweY60XQ1_#v**a1He>@)50kPQk7Jh@c5Na!tqr&5B_4qN z@*4Xu0T}MF;QVHLj0`!6h&S5i+KX4!J#M{qFEYtI(CX>47CjCEJPdry-xNSB?6#g( zt1wQ45(2qXaOZ|5Lw+q}`Srk7Zq4$OF( z(IQE?X3~WdQP7fp-|w3i@?C_k>C{@;9B92^#9cX_%%=sNNriZ+MUb1ZaJY z&r)f}o-}&2=uM;7cOHO88jYC~snz>P#jiD2F#!+vjkFgpNsoCA)2b@=>xRqo6Sm6* zIw!`qyHOR?3vzAJMpCu8L3sb-Fm;6fWFY*}a z?c(J?zND#L^hL|PN{&8ih~yusZ{}~~Su~nXHz10x?9vI;Re?9RC;Z}@k9g9FClUPq zfBj>;`Ro-Q_JOZIUa)UFzWDkBe&;toH)n!0%;yJ)>}Y4}xS-nwI(I;tjj7vbG;(i! zF?~7>I&ldhtM~{a=xu=ru&%f0>lq?eEH|c42%;SF7E8S^0sg2{jHgOZO36KAbc6S! zVIu-OKVQ)ReEjf$3E;FYc=z#&r>os7!qi-|$jjsTJAG9H>OaeMoCdnrP#EvQ&g-+! z-u}@TI~Xcl4vD)|P%ra!obZZ(Wmu|ymSU|HqURVc04Z=l&|re&6keR8KwZ3xxClaM zHu1!F|9mELqg?yQbOcBCeg2)#T^=KsZs878XxlrqbzENrtfWlc+RK zI#-I}q!%iB<_E-cOVJmF$cefg-g zn&VEMdl9eE(!l;EuMtQV2!a47uB-uMfoAMUg38_-*0l$Zr7`AwQkmqSw?b^^o8g5k z78~zN*+L?zYu4kriPMJ(c?|#>z}c_C_3|zf7ql~~MYOR_dY^)p_?{l`8~fP7N@!8$ z2DW^JxT&|YDPhrUIR!8=xE7k_vm6cd+^3XRamMBT<}IetXziKioH*a!;(Tj!j_+Q* zMqfI%?Haov&2kh~XY!}>W`OXJ#ga570_kShRe2$#-&T3J@M@?An%jwARx%N zp+9?ETaI*5!>gc-Kf=kJ$xFY79QHWIOdgkZkTW&Zj{l##H|vrt$<4$*nBD6h8JSsC zS=CK8Noh#VkzVwuU#P#R2kB+b5tk8%Y!++DEh5~n8K4K?1MFtE77m+ds^xVmGb8*i zw!nZ7J7<%8kOX1*9p_ZnbBa=63aGPldM4#tN6KjFfJ7l@1s*Oto?i~U|M-llia8X& z{`xh(etpIJk1x27iKpiqKEE9J&3E58uNqH4Q?z}Dm_p|Po$7U57dN4)p>J38z5|$< zpoV4N$uBO~NA!L{?}GjE5b|7yoYsTrJmGx6El%VSMuusg;NYDr$e!fEEfiA<|*|WJsKIi z$I=|EP)`@N1}e@eh%7bJ{9S3zw~CL8Z-4-2VH;1dBjW3aWz41qm6`52i9OkRwbr5) zkZy}6o|)>3GULAjz*tyrBjdM(W?2G!O{08E%xAInxPV)LR7^9$vk_>rb0gO;*4v9i zlYra8*lT?VE?VEczcCAmL(sMs2{UBEi~A)_Lb2IWab~1{!>=Sb|Q%L5>Ew(y>p5>_ftTkuV z8rysYy)C7ylKi|oSv@&u)%T|2fI(M&+m8Fc&+>*sfK8mRC5MVzBMN%S9}tJQ`^x+MgUSu z4D0*Z3b4p?iav5}MY8T5Lr-{TX8X3D01P4PnC)FhqLPzV;9hgA_maC5pW(86p)j2Z zDb8e#&wCszFb{~%v`CwDZ*wONxBDHhuZruoVVdC|{^c{?z4-}$`t4i%4}bA3{@4HX zkGQ^hz(4-W2lW0o_=|T}Tmig#y@QJ2RKqwFa~#n}U4r)*Y#eC2d%|>6*i0bc$5I3j z4-MmZf%FdP8+yM&>dm)!eDe)Hz5gfNUOvT{Y#8GOkKg_^ z-u>#Yaew|9pMLt!xZk{0&LJRaA=F6=hKd7paNuBx?gD8I`?jT}IQQKMcKx{NqLdHLPx@lf47Y8`z(o)VEk?c;mwih&Z|~h*d$Ff0jpwrG z^A-yXS63?ZLSm0Hj!qWK3zqw0OZ}3H4Q4&P6>QWk96#gwTv)Caangn=+qy;e_X=2L zabboMrqRlcv4kRwmyH7DS5&gGAkC6N4irHs|Wn4?(uXS%1cfN~O;NQU3=T$Rj{eBPI3zr5dgSwu5* zWxXqf;Az+DfOCI?9&=Ts{y#G;&WZny^DPYx3fw;f^9I=TJ)H;UyyLjN;C6q;?d1jE zel7TuU%$q_UGVPh74Kdvj(OngH(#TP;Qi+pynVdjfBv7|;pd-TaJg*QFCG2jRT#!l z%;_>{M(tkXT?H=JqiTe%x`ZZ*GMDH8S1^_A*+oEJSJwCqv z2HU>lcKZy~fyc*pc=P64=y-7&?7KgEzW`#mULW!Lt3QG2#JE3)@yCJRybp|d!_)z3 z9pC@-j1Qmh7!w%L9@dlSsEFW?^TV?h^g`p?!$t7=BKYQU$3`$#nl6%P1pv&gfBx@a zppi*B5qo4M6sK90Ude^@6l|D(-$n3n+3<4AECDj+%mCub>MGEdnrdh^465!SNSJL$ z4b5V_6yOvz+p4kR%!GZ8u^z3ufFx4`@?HUpP&2azmGv}Tcr--M-OP?w?n(yjGB95N zSO>(sE|JgM3Pi`8R1J?0J1*OXr@NcE88e0e*Z}bP=KV;=SjHPxK=zOIg29%*H+W_D z1k|WlHFtRgqYglo8QfTbixH*7wdJn&+g!V%d&GZb5g#h(*|LoSg8+v#T>>*(k41Kb zTFgle)}%lkV;zBr@A!hwMZliC`Bg}QRq$l|T>ia`Xb~(nE3ri^tj-)q(2T$pAnzrc zlPmFInRAjfxALJCtXElzcy`S3T&9JJMkoQT6oQjDvMQ*WF|kyLG6PQ*MXI!XEN(Uc z)H!kvs|&iU#{O~3x@1YIq<@YJ=H)Kp1$$pHd9L22_$ zQCk73LD0&g8zb|OGT(R889;fX_KXu0h~rf5za-gM-$+~|q4WKM?7*?C8kiK~!T*R5 zg=IOV-n(Y37fK7oW_pl3GQmcwZCb3YsN&`63HRF#0`vG!L_4k94VUW``}KcaFvc^UKmQA)30^&X4FmAw zkKenIXWP*B18p>5>-h9M@N#H)@wB#u8}`TgiAk8)QXswL?$!m5*M`m1U=v7JL0S!h z(Jg85DU5A#gIS2c080dIs$OuiOUqIibPbsywFm+SufL|)yB|jHFX|UJ__JA`t@m&> zz%778>|*Tffnu&AUJy6dr3Z-2!q-ysfFOGV8yqbg&M|?(xe~(;{Gey%vC5W z|3bjh>Ojkc1u$edL90>;RhlCx-6%jLWdh7HKcMvn9U4{aqlhysE#bNN+ye@L_`3!1 zY`x+9E^crphB$QV{@>NQ_mLlx5INP>SYb4%qQ*2=h6iIEo&g`&l_fc8pe`eNUJoMYaa zM~FPCvUl_DRHm3*Q2d7#6hK8k=rPX_la~TP=JW{&lTjzSL?%r)DHn52_X`X9959Q{ zGMfNfhxZv5^wxp)Diz=B{f4Jc&$y2;PN1Qg!scfjQ}93j)qe-zXZ)Xk_glPsb3xxc z3`xx}Mk%WnGE%3z)Hifkx7gzV)J-x8uI(3iw!8ujXx9fQIz;wRb~bDe-$Cci6{@hJ zn;y7c9$@nsIwo4b;?0}yaNIsX`|fWdr^Tqfxu@K0)w%)Kw)M4W}S<7D(VlnM~Oca$1e3MA7Q(?sD}e z?T`Z7i_*f-24RdSw=33=wHO5k*&2ux6Pv}lN$f`tnoHSZ4yMqnHmA8b$hDCei_gzP z9=L3Q%V15tv_r(@G8U|?rCiP8A^e#N1`>cLBtL;fX5|IaEYQ}NXob^$`V$Bck!zr& zArTY^SvV#4^7QhUNyJE|9oCk8;pS0bCrDcW!m=;xdKZXj07l^etFNSqr3rvT1oVnedzmHF_>o@rH=@DY;eSMo-g~yl}$HabdD>st_=bR7|?3?$z z??xk!TL~co+b)o(YbyN$^oHIpFcpaS7|||(bo6!wY{KmD@@KL^Fko$WplTCy0^4?l z>WsY`(D4jJcCwAnzI>)q^ej`DV+hV9JI}6Aq6>2ss3AU4RW;yuG`& zH5Vb+!}6nMc)1U>=Acj2Fkv{xL>FM+dV(gpl{x`q9z>7F8lkE8Ucu`EL^q6JI93_V z%%pQ8lVEy%e@r#JL_zE0@IYL~v%MTM1u8%84sU2nq2cUWk^;s6wCq{DZmhelB!QKM zRjEt3jb!B!VWov7`(p7^#zxV_XQ-|YK)8-uWQZr|qctUh_i1%w_XG$`oJq94WcP+} z&U#_-e`k3O@mhX!D5@EG0l6Z#N(w<(gPl%&W0=gcW^n^i>WG~t)>1GC_m}WENS+^y z^k-rWzMr7jVlmq$;r<7tHwU2!ijn(iu;}>;*qpKEMHdAAX?2it?WZM+$sJ~4R9iq- z?4d0MT^+kF)%GcXLZ~IK5k9X3t%p0wNk9>wuZdcjoync1&;)W^=Z}X#I0#>W;R0>a z7L|k?|7<E&F3=;*+hR>nn@a_js!Xf7--{@n^vhyb~GB&DJko=?E)jFHxI zJlqTJ@v^52Q{045$D9wD#2^p~09IDnU9ES-dW z4b2=FzLPg-cY!vAvja5nU1+Elzs+xtrH+br)l056bd}BQk761ZZ9gqlaclSCPUs1uy)o83eq#F)Iv( z7O-+n(u%=^0ba*+(Jr1uz!*V@gT>3%Bjc4p`A%1KAvYjn%Dk|&cbOP-rUfTtCf3Y4 zx9&%w)>vX+Y_dZ<}i4@$$X ztfq9=h1`0U#GQFac&PoUaEemWnhH zRz8!mwv*7CNOZ470x7zyxoeqBgPIEkbM2E<_@$N5gIN{^m#7C=F8xZN;Q6BP%2ikZ zQ0=dT`NRSt!Y#8)oSQ$hGC5BG&@A`H>0^RcM-!H1N%R16w>l!Mnb>j<62Ncr;1>xGUiuO(kXu;^Mq@>~KD zuGk461SZWNxWvmd>RtTDm*8(l$P4xXW9v;4fO@nS5#DFm;Zc}rs9x_Cg+n_;Utz}u8a{I4z;b&`FgbWF4U-Bb)Eez3;F&umr*Du_|t@eD!0w97; zCahvORiQ0_H-#_TmKE||h@swff+K1PAk>z)H(Ju9TKbj6mE&7olvtk1bqvbpUi18r z&5%LS5}P=2vDmZ*F%9}Z({~Ij_zy!bmJ<{QJ=@!@^EQG!@j!l%U--VzwJh8NlZ@lx zya5MLYd4KAW7NoIb1zf5OfHmPQE5w$4T|p0ifqNvoo%(P1boK*#dvtG0H_V<82(-F zz_ZVzZ97`?R+LPt>(>XgzC*_it#2?jjN=9>2Ch7C*;m_r(eG*jNl#NONy)mTuA19g zMv3%TPv$N!?_Ks6#XIUsUMso2$lvq2bil^|PeV%T_A*;Lw#x(hcEz|oVvY}(#|!pt zgBQ6A02P)uAH)P~EJ~`O?+pS}PfYx?|@JzSA$PKUq({{Ah<2+a;mcU)UiaRQklIqjUb@MZH zaqDc~AwQ6A_ z0XDqV8%nzk;m=qNO%RGqnsA_1eTC;VcgIP|Fk1fl*0IU~*HqV@#1`c>kT>_{NeUJK z;#7E-|B{G>W2qb<%TxG!Ldy#a3oT&;ZK~A*s>6F3tC<&4MZK=vY?gDF$|9})+}@pm zc)5abE76)3K+O{o5JK0oU^ekX?;RS4EZxVZK-(hG%;%vx6S&YiL|{c3J*K;K8aPh} z2>TXApd*dit&xD&TPqe_0ncY4<$tX$!swcgy$qp~mK?0{bY-~!YOJY7#@}TXi^X=n z26M%K0td!NHaT%ZjP4c`rbj`z3Yn3VZz5lJx|g zm;ElFi9yu-03e%v5jMu329(ujgcYzo}((j?cWNhoRsx6T){aTo*jvDO0};m#IJQ)`A!is-NoykL=t~K zE3J<4htno`kfCimw*4)({S}VqAA$V>-M@p%Gt};G#Fztgp#lce0UI9wr}KafMaPco z{sKZ0e=X_%(aqv4z5HNKWBh6vi@j{dNrT^ic{025%?@G>z5 zSDxlAmUD^Ol>yj@M3O5QilBhk1&r~E-a_$eCy<_*@@;c)CmSTHNRX~fhsPM|0Lzw{ zbl99YjyuNia%w%=#u78wdLaJDKg9)HJ`FXz9EOLX*s8j_Gh%w+x7HxtiB>|GZvsDH zi*Tnaw~`2onXodv1taMq&^e((cWb$H4Gs`p7PBA1!bBiL(LFkozhkP&@M-yNU zYN5rX1m1JEGu|OUb?*V*LUHfxb1Fd71`VLWAbnMq#)#(z5+&btY)~MJLEk2tE=p!p zhlojr)}%viV%wr5OE7p1X6NypJu(Rku(9ZD>kSsYC|j3vaJ2wzbWR~DtjfP6S(NAr z0flv)0k1iQ{M~{#%PJU=~to&Am3UH(uM(|7F2o2b zmo<#>rm!?-_DUcQ3*bV_@64=b=MfshL5hy!w|#j}0*A0-`hG1gG=l>aF<4rz1%PIo z!wToX0?tFc3o=2;-Gm;yhXh^(opGp`G{h}VdJ5hcPi{?MTCPLOvGc}qAd{REtQitK z^2zmvc;~VPROnV1cG7zgmVN@kR*FD{Z&-p^!2-fj611Kjzl*LE&>1g^^9);z{E-Qs zvvrv>=Ye^@<9L4Z{ol6a0sV4C7r{L4(BqDIzoYf;ZvHXObVyp_Jgn9zLvjR|jUA-~ zh{Oi>`fKu`9xn08IB3+T;wrf&3$RbpDqtwNA*C3koZz|f2|FL@8(<0@pZz*^YS9Dw zBsf02V1IK*d;I{|hDo-7*^f-{pnDszNYHRWmESj(Ghucl z@ApEO9#HD<&EWfZK5+w+7ntO-x;<$@QFB+^8tl(!QQ$&=IVa4#eo_~=MEX+GEsYGA z7D2{hjZC5`25T$RD_je5!6kePGZJ2UWPbK!@ZcRFv!}_vw}vr>g9(;Kpg`FoL)?&7 zFcy;K7ztIfy9kg)MzhRWE!A4AoeT2ZhC49V8i;*ud0rM$@k;)I-Ix>wLDhTXSb$|*S|}aEEb-VcEvdeDg`&(Pq9T6r!qKb@;CzSi&H@jM zu(F&P%DN-myEUK`djh=zsC26 zMYrR5q1+M(hPgSP<9L+NJ61HavVc=JjRZA*Y;=z`0)UtvB*`K_lr?(aWie0%{8gi~8@u6tMw z9k_G9M7Bu!*kbRuJl_Z&$TMm42~$5|e0YJ~6n9bFKfQ!&zG+=Gfee7hiSkDHR#an3c)j>W)MA(l$IE`v=um{=F)`B6<|vsO$!h}lh~R? zwYua^@n(p4rLfKzqII13;2pG8ohJ4V98=NM3muv&tZgw?GQda@3GJT(Rn4%qjxlF7 zO-`9X0TywB@hpPF#Risy=eU&Z>D)>&qjU#Dtmxz@&5!~w)-Z$uK`+FxZJi5OLDQ*W z2E&cL9CHK%s_p6Ky4;}gy3tfha0-Odsrv{v|#8|^sVI> z$YII6ok?#F9uygS<4Oj+SMt`=a+&URI8Z4|9}!Ae^-}0pL2H%}aieGnMhEZ~OxKx* zQXtcPumCG&DKapAb;r4)L%IaEt>^hb?5*+;gmPt3JwIESorHVDbZS|@(u&yH(h9Mf zpi_XUT9j~+yoY<6%N6HY8H7zhl4rApU`KcaG^`K=`ADJ0Pl3RS;Y-63_m(skbgyCQ z6UR`?8c3YEnB5BEQh`Fn7Ne4B3>JZs(S|K7nS?8(X^nFy8GGsG^z2NK1w%9su`UX* ztTaGS8SAK2!+(zeSjV4VQL~WhTV9Dj)pf_#HTBb2%1A2JWqCgB4^T0RMp;ckEfq#U zSi;z0kZ+v9=eq8+WlCzLNTrZqGvn)cE|&9?YZK?1R@Xc~LAM@e5uSy4zF@1!=An5&3t(V=Ha1O7Y}FZ|McQXkyCMhxZ(QOzd?U|K-;4a z*lf_-0X^=}`+#g4wy(cJ-*?ch;v7@~ivsMbfDUhkxj(=@-!Xf`+~D^-M5vG&&^Q0T zEy|S$q+J~JwJpz%#JOYG82Jsb18u;@9s1!TZck76{L>Tk^Bu>Sn78NfEEI42cl-Qn zz+cecn(y$he%+V1#vG>^#&oal7ccO#2C9+=i;Q8;Jgq0jlNq^WP-Ld$^azU@JOemo zHCzCDrm*)*EdbrvGjsjn6CkGKgC9a7za&0x< z*TnlC3S2W@g28A^V4RW~s;!@Kp5f{v7)H^9zoA?~1VLjEJWD>iMKgG2&h`L~RX5M; zFYa5f_&BcE5_e<@So1YiohfirgQhjN^@xF_;PG*{#!>?z>~+GH>^cgXCCWaYp&1KR z17nB*Kw-?-#??9^A}RE?ZNq-K;5Y^vykt=-3vjKV1qgI2Y0Nvi%2#7%Piw>ik7P@NKnIK0Xi{X;T|G^MhaBMc9KuT8TA(j zIP(mz0tL>nqVRjm_*K$Lf|ccWf(C7DGiL=jmaEq|K}S9T^3;25bMO`7QttU+E(vB+ z$s#}!f3L(eeGeAJBp(y^#P|p}c(%)`SFg>GkzC|*5p%t0b(AzzQCW`x)i#~al+^XM zJU3mx33{t=a_++dgx5IRmR2uYlmOCm!p2$yDk!PBB-9GN96U7^mKMsW=AV2BX1IU; zVK{~-cx;p}>b5fzfkpxw zg1&aypw9=!{qA-3s04{$Z_SmzwsnY3+<$nFhi%7reufiKBk|w%v+#sJ#G^_<48vXX*!<0abWJSp1z;x& z6;RBL0%QH?)RUC~h|&|StRt+;>*tdUfxoK3y`dl@oV8eM*_QK&I?keHDVR8N+1x| zQD`;+dfRf&YrkV&?v_mgSYJpDOB~=qjlIrC#{Ij*Ij-?ElEDCK;jbWCf=R8|seC;`L_J}w7&Ua+)s^&xR>BA(7|#0{?$x%`i_2-{U&%W2JMmaxTB*zh*4DT1WGyxlkreg` zz)~s-Qkn;?JIJwmcU1P|kV9!j9OcTPJ+msILBO653^DH2~n6U-{ZczK6KsECB6vn-4Y;^0lPa&dym z0uvkqx!uX78%(wyx7y+A`xZ$w{!HG>5P)U>0~iTPQONd>LMrt=EO1X}@FK3bXTiHD z2aMORbh*wy$0K2}=6l?l<;vLxJMOs83E4KZ)?s5}e|SK@TrrOWn|goRdE8;97`I!V zg}z@L;7!5QnF(h=gRqlD(3MP{Z^}a2pC!&`?Tv8r`8zWQe{*8~_FrJPJLK(GPD}4U zL3Q}KnZ8c$X%T?Nd;&nz2tDdif3|u1zT=Ln22z03_d9qJfYx@%m>56&X-YjUYc&TJkn6In5 zx#|QGR-Cz3YMi9q_=D}->Xs0AffEZzE_K0p7GpdLZ#GYUC1h`5MR#6xwpynZ)E3Yw z%YG7MCBUjWrbxxN_$2FK8sE=M;q?pyXaTxSkmoope$=?u1xj8?I%|*yG_4ki1=iYn zbJBj=LQ@ef02LGiqN<_;uE}C`jc1%Je0<$Pb9wd{PiF=CxI3gJUS}sd6wm(5YelF89Zbe!_9kn$s@?-t?gbZ)su8Ya8Nv2|wd_+gwZCxSSnKop8*Jkw&e2shal zHK$bJF@M2;RgtOP1c7`41$C3<@LO4lC~uhcNMYgKFxpbf%`pg1_dYobGCWS@_UQ;jK!#y`GP?ZcRL0bu- zjA>f0O>Te$dSv_-S(`pby5Gp8DK-UR-}E@45KiHv<<_P!b0EJ6@#RDMZoOgKcZl5T zBrb>41w;H!7t1gfff=*&^{Sq#9)eMQT^%ljViz35B2=K6#aUZj^?t`{10c{5c<9G| zZSfwre2v5Vf|5RK-Ejsd9J!SX)8K;MMAD+^0LQJ+UhLctB3)$;dhA5c0sz?x4k#T%(zqT2lw7rJB61og}Ai@#S4>% zEpeet6j|Rzo}E^E-urvb4(BTbO3TKvIDK)7qC!~~HfOxV76QmRq{+yPcdpdDy3~>9 z^aS`=_9kl}My(5ir_Tvv z85oHYHGOkS;hd1Z!CH?JR58yn+(GK0W#RjtN7D^^V?m?6~0h=@XuwKj0dcS?NATay;op8;$YA z1~6u@U3cKp(H<_4>+Y`M4W5MZ>4<6v`2fH70IVCV`SVSr@(bF`a3Dc+?_#ux`R^M6 zyi!&N|5Gi>Y;JW$yP{uSgGoI)ZZJI{HcH0BFvrXeV{U1zy05>a&%Xuy@sl7jWt^WM zofF%b0XUd(#6{w{J!yW1bScC`Y&o=RfnQ2U7Cokg4RCPgimyd{f(yGIE!|S!!iCtJ zn%aYfX3`{Dyg{;d5!tDm`tC6Fa8`+mJ2 zLW423y%^GY6Wu+WLb!x^ljsi{^Fc5SLzGBZ_Qe65uiqM1m}BIdm*<;E6{e#sZ z$hET4c-fhmagmbX9wqE3@MHs^@k|FaX)KBU#^^l@mvWpfpOed50>TkeCg@1IfP1b@ z>l@TYG5y3B9H*trkJi{s%7J7;6G5mMylf6>BlhYT4)jEP%}bQmUPyws5Xk};G9(Hj z42eV%&;ls|DkYe0e9SfYL|%(EtvZPW!JeqC`d&9HAZzhVelp{jV{_yb`yk18l375? zB0|?c0e~~OxOCxXUyf~=OBRP_CMPPEu@a~F94s`otg@i8eNopy08E11I%@#IeRVfV z+Dn96YqExI$?)NWbeo^2~cH z9a?UKr)XH_v4A|TUA%`pG0%7Ib0y8x-mq9dl~B*VBA>4_5b8#HGz2ykZ5V6^TEBSQ z?ij9os3%9Y?ZK583`pD2JJ6yAEuxzSOwsxUmv8=im=4@Oeh-`j(3C@9o57l-yl~}E!`*9;sW2INt_|*1Ciu4rw1-#dZ-0e;c?vr8UlGxuVI)McggyWjrhj!3M!vm8hxqWWGkArgIVw z0b=79rDY)*wHdr$tN;`M0OJx1NV6=A85ui)b3D7%IyPaql>n(5lH#-Vk)W8%63sS^c&%&a_yV9Bi z$JPUIgrI6+d5y$}6k4ZxapyfkteNIu*nW-+9zq#{>~U%CxOMvX2sw`0kHM% zMb$NIafL6i{*Wkw3Xl_|Y?{-oN zKc~6I%&?w*xiw&ZGbUAOJ~3K~%@j@1gfQ_V2#- z9>Hpub3iT)@{Ck`7#ZJSXc#c{#tCh24*ni@w0(C4_a2^_24Dy<6llt>ZA)zCgbWXX z@Fb)L8HjEnQ8fGpzpqWm?p`WqlcS zq1!~iKjEK$_<;96{p{YR#gl@SoPR-|RMP(tV+;Dzz)Tx~nx^I+j7_NfEQeqbd;pS} zNZgZlgE;GJpt?~jSgdMl(L+`wzt8h5w0czB$ZD-n1xyTk2xo&~#LGR_f-b{y-*TL8 zMX`m+#e6arr#hkJIs|vp&>qz$#?Z7znku9_vsMBuAX~!$1(37u*uuL-STe-j%ss~o zNGAkZ!L+-ayrd0)>`<~;2f>mxKtoIB6p{t(uk3gA$kYv2VJnc~^{hM%w~2U*GUpn8 zfA4YdLV&1wZ7MiOM<^LCmmIV=@p~9&InCfz0LpEd8Fm!4tCb+h(d%k?UCFRYW}INb zg=#~UZ~&(`xV6j#&hc02dJY$zTMe8Z8bwn2L5r4sxg}~jdVgj!%Z%t%5K`bxtJZIH za}t0rP9tQ@Vb13)3{${$CTR7ggbd|uJ6m_8p1%SV|1p4hk2uXpIwH+;5M^O2u+C8$ zLC&IX`#evOCiX)Tn3LC(l*b9gaMCP5UD5&dJ{~eqX~gMStIM)1hUS9IfQ$ufngTNu zQfQ%1z{d5neC?OrY|M(gX51i$w1BMK&{#{vd0^k4;=v14`J!6Fn#I1x9~K?R7w_Ow zlRv~cY&oq}C?H+WaOEzikTVQ$ZIYe}4lb1k?j4EQmUBw}zreB6JP7jmhtxfg^V!LJ zmow62TPEfqPVCIY8hjOgp;?{_eRE!khGCyW#ssg>iT3a<6#>c>3%-YTIBUX#Ik= zUt=zJ=zI^6C(KVjLO&_&0JI-&EqnY5Isv;s0g+K_>a7RIyhFAPa=Ak0;TFc{XWTwL zd90us`m0yy*DI(gx2;3PAodDoAs6NVbOPfJfuLVDw9AHe-O;w)lR74VVSsg5k3Ajc zf?w;5romt|w4=i$th(k#38DN|622RqWB~2DL1lVa(1@gui$aF@bLfPefP~VfA3kDk z-$UMhhjw|5^;FI!HIHTjM%G#qx2%U8N$(S0Ts@-Kpa4S6c)j!i^Km zx34Y($^#&aM6b+*%(H|cKo=K*2WW>7rI5~D_SYG@zT=U{tLkTXU?i@j% zO^qJ0w8m=C2QvT#V;r6d8`^N|PD{Oak44zFbPFdVkGVAV5+rsY15P01-ABrTlRU+r zA(9M<%s44+kvVlI@9)WAC@~n%$aqQCjPvpk0a6=~fi_1P08-6DhnzGI_PtXd8 z`Ax(ftibX7?dxZv{+-TIiAc3nK6iN5s`SVjHigZ50$#2oEq-ZT?Otpd zQ=!KlrW2R9576To&!7Je^ZgGH9nkxLy%@H)-=Kddu#dyx{?^fYgB}C=asbCY>RAFJ z)4OUgIZ+2>-@Sy|HE3${kd}76_dB^E|u+e`)dF9k3BelilT> zOu(ALngQAYn;8H6U!cGJ9<>7+ zRlx&*jf}1>hw2N*Ndl479$FnZ3R!~1*5sUN+aww8nyY3?FxWB1@R~GR6zL_9kz!!Z z2Yf{2@3iV=cBCvtlY=R&@nNp%M>i2NjTjNdKEVsycmcqOzMn7;I?bZHjZDVZVurBV zx@6`t=fF6}7VdNI#AFkC7#xGS&{42xDEBIMqZNbCUZh!@!q>_(cO`|T8$ev3ZVZ}V zv^5`S^U_M(`Jf3u9Gb!+a+p)Lr8XUVJTn>OEXX`rptNB~OXl5L$G&gjdR)ns0xc|c zF<$o1O-n}#X{k8@p!*Sl9NGQjl&BMbl^Zi$REdJ(&0#@w8mnMp0BL!u$7)y!!^#;J z(%!tTBGd)R40kaZpH0K5s4Td5C7iRST3pjyD*4rB9%sakI6-$kU7x=8!bFR>2eHo- z)D>4s3#bH;ZO(jY?aaS8f8(mdPO~7%RiZ>%cCD^iy$PhRxmc=vX)9)n?Z>i3T|C3A zc!bknWC|{{oiFf3b;=3Ld?|$l`Giu-tjwRK(eb0LN+t)qSRJ{M8IQWG+xqdb%jwnx zc(Tw~jJskviGF_9j|qN_V&BUf;k+d$=7z^%`9VcfJ17(+WG7a{gp^GPRqmL{f%=pXp&D z!?~InU~{51_4PCXnt3;q)zvr!*x|~zHrS^d^!XX{r+-2FvmbH&^S=c81v(A$c!ADO z_~D2Dg7M-2mK~aSD!x3Azl0C5)xULkb&hpB%(^q9XwxGUp?;Kp+n@aJL+2duVe=Ynu|8Orhq z6mT<++Y8-NQ>8*WZHYZJ7d&)Hm#a0bE=^q9iGHG9o&&K)C3M`$ z0AwkewcHJvnJ{T2;_0e@CxKT>rU$N}tZP_nx?s{fOnz2iMJDD!E6KkAWOx7C8%W>Q~WF;q`qYLSfF72J{^!e2?cWU z+vT9ZL8mVPLAK?A5c7m3cUAkYX>=seOmv7Cy6JSY?;FOP5$I@1OMdPoV(HfQZ#5#i zxm!#rK?;yvU8n;n>t=?qB~aliP-y}!%ke(Twf3{FQ(@{#1QWz6Cbxk}9Enn3fK5vA z67U2<2%b%A+p_vOPcoXI@9bEUAiz?o5Y|mfkdM5Y^ASi|szq9q5UFs21c!sueK!1v*j50a$%?`N=+QVzKH*eAQSAYua!v`Ec{Q!HpLtX%HjAFoj zKzfHYLDLpvQOFUX(9Ctb!ywks_6D>K`rDuI{NpEJyI}4EsuOeE@ag*}=;0{R6pKgf zmk0j%`QkYLSAI?>H!7)MIW)3dvYew8fbg)-w17xiiUg@u(h@gSvu&IrTuO_uYazKd z0t{JV^5Tz`8St=A^Z2((>!SELjxn+IhQ0N$6!|k&w1_CRW*v6AwK{&JeXCU!k!&; zoHt>b!BlbFkF3bwo0lu0*Ec`vbT@)lx84&(t6I2B!UDF|jw4(#is7=Pe>rh4`0W-* zaIOSA2^Rfg7J;?ZEK6F` z_&A`qI}EXAGuo$_!43~Q*|!ba2SgO}v)3+^t)o3W_?V`mKRf_vu;UILcR&m_r(5Hi z$K07s*fiK-nYd_C6IIZ>Ff%+x&&1ID7Y^~KIv||Q;{m5S*qgzlND$K?zuF=1I{K@3 z*uMG`B(HgRi}vf^U^||0{PRCx{OxZcFVo*Ia3E^}JF3UFv<`Gcxtll_YQPpXXYUux z&j(a*fGKRaG2{8;^pK^Xi(fGA190X+f4GM_|J{VB4U8+&ipAkeiy!3Yi=zIiIrlh> zx(3UFF4bUV;w4f1k)D3uMbf;y9NTo^s?LR>vJID@cRPld4I9Za-b^ry9C zCat$yNg>x-^Y&SY0?yMJg(@n`JK`rLL8n4zWbeivLcDE|&WYZ8x(6xXS@_z8D!U=H zJXF1R^r-ci;0Q<{OY5i_&CL zMI43S>vbMe9LIXQk~32nqje9Yj_*3Hn`XG(2JXj!i?MvM zQUTYD<&;EnKSU~tE9u|N%Uy6mh^qtCre!XHRq><~VM?8~0yL{747G--+1B{-Nnyf2 zDGGennG41koOUv%x-i>vyWtCc0bq?uT0+-nLh`ywlu2%p{9euvOi1kSmpYTAd#T^E zq6I`wp&cxQUF0FbBj;&dOZZBbNs@U$=Vyp`85mmVdEVSAwSlg*3NZo3hffewTz~xz ztzV$O{T|i~{jz&(v?}yIU4wjpmrA)!;E4XX2Dj=pi5Ng|Q)45V#2B?E^3-V9!Cf4c3SA1Z^I&JK<%F zYIl-MU;=q;karF3@(SBmzwxnXWbEGWur|^971uxgOU&(n{_Xc@pCyw%Y(ys$z}?Ba zz_yP5_8t1SUjvs8{rD5+KmG*VEDbnb+NNRahH*bIVHi`rJvgX5IlF}Sq4poB*%u`E@wXod;?$aJNIxM!+X@ccBx7VT_| zV~NAuDVT%Vb*b8Z0vDDJkQf(2L5T!@Ex=ccm@Lz<zw82S^vGXNIB}87ka@1MoI)J+*5cbhCsTQUROO>mwQ>@K<6@!qj~d z;Ki`q;>j#g2ZN>xg$w_!M?q-#{W>S4wWYTJW^@nXi(}0>h6IUbSs|ZRJ#c-cMSH0@nQ?xb^juRPGZwdf3EZ_{v*q)H$J7r# zp5Q$cuudob?!1{=XbO0V_3^|L7R!ce3URAcjuQy@64hiDtuuhUu8P^Vg=T_Qm?gb} zU|DHrp+PsXanP-NvUn{o&TxWQ2Fil^ z&hi?8rTg6tngqXmyp&>Qi`8F91M<6LAn3DL|D_ZYUGpx7mPEpZE>4OFpX`TZp&Lu3 zLs_6c;i{Ai+$^k^f+kl;-!X*z-cHxl?skt+y<9N9e-Hckg#PXgwl}|q-tXvd-$YoD zVcuVSiu(r00Xdpm?e0f-bgF>6WgkN?Emr4(YLQ5ZHIpI zYux+aVEoPZz-o`kfl8@ifZ9z*_|#`{s!e&U8)9OZfOx%1saqoIoqfo^bfV?+Eb5 zbk|&-Pt~Yr76qcYV6>t|EQ4pGk{KgwvyHK;uf=j#Ym31(2fCF_fnhWI5W_0&kmCpZ zoX$yd4v=StepGpmVwAubhTc63SDERVR#J~O5g0tQqT(oNWgKHBFKw+#s!%FtZ%!C8 zQ__$Yv=)M`HD?xVW0uJ`Y};fmxLRW$;f1jSa7G(u`5r;=hOm+b&`=9G8o*^qG$4(n z5h%41?$hdia)5W58y7!5jX)L%P_PKT^__wW13(GF)twFVk{oT{aUaL2E}qk?7h@h{ z@ja9`IS-VznY=RQAK;1Ar;oV*?|%=x9BA)e;o&!biGF#5)(^-gn4f-v-kxF8t=f7Y z(7OXaJ4Sisa{UG98`>5nuh8789a0#r0sEez8Xh(R|LzF6B{%5p#^Btdk%;AOZ(gB) z_Z{{(f8rKJ2=r0CyT^V3F1GYd%OaSw{+{h+)G&Yf@{VMxfOVG+!M60ML7gesF(-#Zd+uGG7H*Li*I4&VpO)8 zCIj%w@g7{Rs$oqGZJokL;MSNXFzc8)BAB?Riz#E38qz|V@j1!7UHDcYJJ*|__6z)B z74zX4ne+EpT1p7eWKLltf=r5#>B4NgJOEv=n_=AVu-;CYWyk%%^V19Fp_zp}#^gvH zv=z8RB3cy?<2EhTk>XoV}VAh_}TJG?;OB1|FZ zogo<|v=u%%g+@LYk8go66=Qq4l5TuxfgT4 zTM1LwXu#OjwKgC3QG#=FZD^aQc7#PImWx;l?Aq3tHSzp+wI?1*P$>E2pq6zd2!2qO z=@qo*?r|WC`?spj*R!}M3%E=AT$O@+L;=c*FO+&36=p&$aV|;sHCJ!lbxV*(MOX5y z)gY;0(I<5FWwDT)Z5K< zzvllU@9ml-OL8l*1GwLa%&e;J>Y3q?+#$8IdXUWYAkz=fkJpRzBr}>!q)bLGxwgZP zX7^NgS65YLM#Q}i=-~ix&l+lN#No<@yJ0icnHdrH`t=Xs05||DD-ZOvF$A5XU$j09 zP==>{>=0`;W<gkQ zk3>KrH7S7t)u}|PbxSB!&3Zn_5NaGkOkNTNK>{wH5;29fdyuk2B*+XE=STCm^qOVs zwQ1?a|Ak)1)+DlsQ&CW8NhNHB5(>bXBy2(K;}8sEM8D!t*ja+X%ov8N5-r@NjyZNn za;`%3S$JuNRbtBY;sGvRNdPP^9pzn`reTFK9AmH#vIO|ex`Gzz_9{U3flbeZB6x&x zZ&9tDtS`J%Sqm-Zt2JOBJM0*xghjlHOlO_K)+Q%w4gCt{Sn~gAB&cS6LJzK8tZ~u| zD!X{G@Bu1&o%^@;G6b`Yp`%Ev$nY7K&tVFe04oU=b8n{i_eJ*x0a~XJgFE`&D`pXn z8*Yb{C-QuE!mxqsWiQWFUXMwCQ4~FsC}N!ofW$b+2aVeyk4uF1(ktSjOhhr<$mevQ zKukXKW_$XSa!Rzq_paId`lUBJGdly{pcLq$s3k!_8V>nZ%yZEZ!h@3lVEvFlC+BAY zds9{*48a6$;kg!|`aJ_t%sIz6!ITv6@{l7-@%7*vSJH-{=1_p({l(s?{WKRQz3_Cb zre_*dx@i%=pcDj{S^1B;JZs8hOb%%6c?2+q#8?P)WbTp|AZdnl^RJn?F7qCqA>>6a z%iNzi<~&xbjE;o~YWZ>|OFtxNl;s{$Ml^+TxpYz9qL{OC80ExZ%In-8Y1md_W@h}w z(5$|Zkjf)tHABq&J%RIF0}q)*(B9y};>o&nnJJG_Qyh;U@%&eR1w9L-vy~b!V3$u2 z?Xdld@%#}Uq1v(Uu%{~vJs%^<+q}7I)fR9{Ma5%}Wyjd6vytgx(yNAHT+?S2Ub}sL|+t z!*M)9KPlvSX8%9!SG+wn{KM0MCp)m3p8q;tzuRc1Ek}9UTX*Q7=9^rJI28F~>cIeR zn?^|s1o+FNH1#FctXN5lN@fq$kTAa^RbfWEr#|Z#hZv}oPD2{~&0j{`57!jqwvcreObJq7jCBNd18SdFA;KE{< ze6#dU#j`nRVJ`xHCNoU$U-IGzo>P${ELewQK(|+bALyqubO_9E7;eFnV;Pvc`x8EW zdS*wExSI}QP2M05hPu8?t!4tv2RQ40p#T7Nfb`J5$=c^R-WxqKhY@5bcc)jx+*S^X` z2u}sLczj-fp2gP`a<05*SYINpG?)MYAOJ~3K~%B!KEuW7%}g0spfEvhK4SrE3E;yGLY#j-~;`tU-|2L_<`D->aXsJw?P16a>Z5JkAI3AjJ=B&=T5_1S>=_sKh4 z<}|$eCNcLuua~-^MZx6sz@?(76<88?LZU5|CsvPN9`;2k%^Bd_d91u>f&BDz0|@VG zU&autg1>l4r>F)(>v_{;am8(H^{a@?jkFA7vKp5u(Cr= zXXxuY;9`)64m%!U`xWhUhM@sa@(FE+C~*Dw_qhDk-$LFQ8ovx~@^GyJO#cZGfP1bJ^!Rl}j?c%=P#bP6_-pQA$(11BTBoP{x5C*dw$^^47YUP!%@&X2&gS-ylLa!sw3TH10 zm;;zViU4euae>TGG-QT7`5gcnrCmfBD)zuxLzZ2}k14u7DT}6fMk(Av+H2VCqNAw2B zp1Kq&4YCRPc2xaR08uA1#%~U-Oy@cMRjEGC+8CoaR`lKpnrDJg%v0#RId3TMN_s8< z8VF4!I>to(Oqqf(JNk$_>@c)buQz2OZcng~e5zCB4b+8SOA)`VD1oxmQ2#q z=hO2cG4MS5^M~4_zI;SdpcSZ?3cSL$s1Nctoxpf@AA0GzOnQuqVB{i|mxzif!?eD5 zs#0RFpmhfGUV;nMzcSCs@@Z6pLN4Y6vwY2SHvf(5FQBUKCj!YHZ~3{;l}ny)Ph)-3 zZ3JnE##Lp`am|ZF5pkY|0*#30QPC>!oHH@U?2yGrUED_`?O}cX1d4M_)~l5lSUc$T zjHD_E5J?ywi54tKygYvZ5I{(giND!?Akv#t>?Y=eRk{KC*pV zJHrQXe0qXCUEs%{J{0aVM5F`~5sfJ7%)d9FDbO-h+#%ZIzfsk{Z;*Zh>;`xT#tyd~ zQ~Acq`LZpAyiVABODBaC0cGf?C-y4 zxcbpyUD)RBCx&*{u|Ix-JZxwW_ZT0aarxU{Lp~|=B#?72`CJAty)KjyN2DoV8M<}= z`}-&O-wPBWpIWS6Z1?Vpdr|z!{R7@zZ}|1dR1mx{Xn!AHOEBPf#eZ=r2#}SsH$#o2hw=NPo`e=iDhmRvB|PWT`!;!a$u*_d zBArFLobdugvF5XPZW=ru0!aW1#R+mwR+9URpAo}#deagxsZ4K3*5}IP4|qTb@ue)u zqKcvp&M?+xW6^Y;K#xsd9arL6M)Kg)D*SFCl=CGBuB8RQQH^?g#?Wk$@;NUy4ExTk z>r_XM0Z9*BOMy#;Twad=X$gFDcWPvl`(cYNzjV-cdbPRvSrX7Z;iwOd) z^sIZ8k(qL1<&sTMH^YayztU1Hnu~nyQC>xAgw7UE(DbhHj?PIgs6!o^kRy{$a#Spg z%)~W|sgn7A@)KVGImFJ-&(+ZKv1*R$Esyz-Wj>a9Sg$*O^yQO0S#eP2{2=B3GOkFD z%Ii}8C1BHdJ_>PBdZ)6bqXUpkpj%{Yb|hiMVk|4Wm0_L_T4h4(**(1Z0Ain%v%#H! z$Oe^LP%Tt?$sKp+d8_%5T-2Jc7dy=XKW>2S4FBfbMEsi?g9Jdd)WQ~`(-p@zkJuGB_8tA_Z{T-3uHSuvo;uo3&(KB=BK8CJx8FnFJU~tz z{&a&svGtxGgZ~$wG@x+$WGNqUVcXS(E+(RQ+;=>W1KE52_Zj%TcuD<(e=ZE9sG*aq zLnI0^*SW9#FF++S&=buzZ$0F~unEclU#xwUdQNc21QLItIPy92+IfglDJH1Ow0HRI zA53sJLDdSba*F;bURA)C=t#q{7;O1|hX1B;&F?l99AmXQXAx`<7v(VqRHE&dq&I=@ zwE}eMVT{QOj-mn!Ercbg48as{}pGU^m>?~qv(jo*)aH`2mk;y%pCg&1bh)Zw#W>1ms%|(1lw#kC&|9bim5yeHVSCMskHJv7@8qJM?(qEl%;X>udPP0w zM`j{LF1xPxi_H+@Bd7=heSn$S8Zx?4)PB;GShW{@dCv4ovfI%#K+-FnM%FY87Qi6$ zV9$)!xgKl5`j=Qb_w(Xql}US!E2|NNNfFc;NXj&y%dlYNG#t`gu97ziGy(L7uWg|$MOAp0;8_bw$Y## z0K(dI?hV^deva*Jcq9eUE7&6Y*Wkwi?5rkGGA(+iOWPo)duV6j=doX74jc8`7;wA6 zZO0fp#181T#qJzj4`~d4H}=#eP;QXn7~g%5qrV5PSB!5SaXb&Se!_M-0p}LnO6R;3 zBf)?XVQU!xBD9=In+}5fgB39BS3hFJb+nVdBM)b|f2zL0`sF?3w815e+~#h3AW`QmZ^ml~k672H~eLy(1Z)3#nd zo^ofIPXR-X!=_t5MNIO}EIch)3_8#4@I4M!t9!9nc)tm&w%HKy93dV>x229mRU> z>5-qZ08z#z=Y+@uIuy1?`1^IOU=C`Q=~6SSSMy?P592afmO z!7exGrqIU1%xEX>DQ(cxJycJ?YXRI~`wipr5q7-<@CjL534)-pI0mo-27&5`aBqO# z)=|ByT>!fg+}Q!xj`D^}3$RSk$EO=H%~KwTfFZv_(d2~oN+2iRPXMr{y@F}B!ce*i zqeUjbm~s;-TVsz&6R4aB244Yw610!8kdHUmrz;IhRoLJEIQ3Rj_~RA+bPe*eL;v^- z;M9P_U_U%@4}Z7-$3p1{8L9(#XboTX4exI^Zp*|3t8)B3eErLTQ=ZXY9*pI9^Ng-8 zcf>hLA-ICQX&`0!ldOj)@B&lpw>v|ZX<@~AiUaM-!JSWAnX3sB0>qUSw%VTo3=+KN zds)V%rIHKKRYKk8XQdK5_?aH%U-Ciud0*s0_B}RaOS%ln_3)aO6>Xo5NvM?RN%e?S z1qjwPloQr^DkoWr`sxf9bNU9xkjlW+1ZqHm2*k|gSTh?uf!=Y@OVc|o$@H!yFR``c zrX+w*FOWl<)_kN=u2ruryHr|p{~&mPWAM5SnJnSR9aXKc*1a?LG}LKfLL*!oH3(Ut zc#n-w&JjIN*$!{uxO}3J5OzthDhhFM>K=`?mH(HM{!|wnp8H#;D zncXcyehsr8SMU4u29=VHb(gHu*E^^i42lg9W8->l0NAA7$BwQY$GDNlC<`xAa%SSe zl!dc8-8vvdL--Es{9m9gTpGA}t7>jS3u zFmPO`5%Ii!@UXJ~Yi2jM#*lC%7L*|$@>%5!9|!EXVutd)fcSa_c^!Z;J`SWjvWZ6x z1V92nTb$`5fF^41AzO}tAW)YqRX(oH=l7(i3N_gJC;oGf&IsCF+P2Oo|JpM zD?_xPG}F5;q316E2gcR$4|#ncc$X7+Cv_@>6&J^x>unAkJLhCL{N3a90-ieb%X|3cU|qql?jcV*{CYsf zK!>1h4ZTHCZD(!OI#+cr=Jxw9@#W44R{@7KwDadw2s2^KL+++h^U8*up#*>77SBY9 zlG(frubp3!?4aQ@@x)lWFTp5vF5mAhL(RNLg<)g7M`qZ{R7zQHL?ne9QtnIvh&ANq zFL;6Ee$6m)DZbe6pJ&QxXplv&cIp4J=YqAZdVki%f@tUnI zWkVJPEdd%b{2>ao00b#qk7!!ndxP1iL>B=3J)b#dYGxLq{>YYe2{aQZB_KkcaUccJ z)T~t4;aOR;E9-t50(nkjjbScoekVM1{fT84woPoo z{UjjbjVuZG32xl9@djg$b1l~@wsFTL0TXy2;0br}LLWM?j#=A9r_Qbq{?q@iv1 z@Npw|QhRVnTkw!$lLRn>WV=eldI_o`G);?rb>(mA2g;OWMnW53{!@6ns$?l?i8o-oYur@wfMhx-lh ze|*M|AFnu$!F}*wEcjywu0D=Yi%KBVOg84o@Y_g3NYMPVY~^n+_GgGIgD*7_ma;aH1Ps*SyONYo7G-VX1EP;O|u!U zqugewcmgQTa|eZnCvX%%RADHxHF;4UMu3`A&byGKvBaA#I)o(W3j%gp0VseYgkNAg z!EJ$tmtnTFuvtu1psi292U(tThRPCP(c9A?dV-J31covo?T%M)gN zo`F~!X~>pxDs3vIQatlBsvYh}j8MZH+_1LAqEXD+i-&oHykfnSP2$tTwR+fd7h1Ge zqDMMF#NtusNufX{XD^7~W3FBGgHGe9US0-GmZTX0QnDyDfh6Z&o5J^_ymZ`NVJwOe z5XYII=V4&%(Lyk4Mye`QH`usBbmRB?IWlou0j-n++!Iq_Por}_L)DL)RxGlkiU|9j zYCDIa)wttyLmq4a<{8cc-0OKfkDz>+8tE4r~t4Ngp0y)0Cq(5LLxMm!%Pqxd&&&bWX^MNl`|2=#70U^~h_g_#Vj#z^{7pf=7c7|%Btmqrs-52DnA!JTFVLbf+`}AuF1pVzFLeBRD zXE*Zj96*0~i+=ZtT|Wxg9q{u8+}%UAdq5gHZd|Q+*2@Oq{G=TA0egH8`}h&q2k`0) zKR4KiN7z4nM017w(JSbQ;9GmIeZe&jnJhu-msm`TY~v>6F^T}^;AcJ#KpPB4l+baY zhcMd(G6WK|ACbXL)dgbFg3&SMtO~pV6&eu`_`}OM=RWsx7^OWk=|)<*Mcf%ehZ8hD zM*ZINhV6g+1&)4$eE%NDMnlsN!_R;A3jgNkU*Nm>k^Os`KfC%AA36%0uAj8N2qE(qj_%#zru-r4dORSu#^k}44PC_W>f@NrSdT|nB zdU@8eShG2cEW0hAmk3FFa>K|i9OmVvCO(Mg3+XiuTMAcm{3=o&(Nr=s^A*3b+0z@t zvt!71X9+40*UQXR-a6ZbMJP9M6d0$tDnj(!ibT5=eEPg5nxQ?eJub(jvBqJHVo1QSUTi5 zfDtVS(_3PKDuJK^xHI$;Td_b$CcsJT%auk!%#vk@rm`+?cqATKCZ@i`0Re`9)|K}N zaMfC4$rDKM>%5eHb!w?YFPu9wjN^jz7HOW@Sa0q0T0jM8tc}REoby8OXr5CZ5Rd&X zRURex0|8IVay6omc7}{A+-}hR3M?F^6O?)K%(Bx1&p7X;bw&j|SLqq6P;SyP5)9{l zO<>|SGxqCjFY}mSE6!jVtjMz_bNx7VB?-$go)HL{I%)|kNc=Zrwk!g?EPSmQe)E-J zLFUKHqnu|Ns4;Udj3|qBVqsxDqn+;I;|kyeZD(eE?-447vTmD4G{h95vs_X|T~-Yk z&r?QP6>(mGK?404r-;DR0n3O=I6|5N?F{&*dR$dSzk7}C{tM_9Vch)^=RB@0it+e8 z#^d*pcE;%s{}|FX_&6}0_cDHEyFQ8ah14+><@7b8`xyQ+NgU`d4D#`Y^O#zJ=d!c>L}OfA{VQ&)0#|)?vf(XMgcE{`~*`24B26IZCD$H^c5)gZ zj6;h=5>!#-49yfleks75Ua|C!K+?PCIKZ&;lI~o}6m=gSEVFD&mVJWBU27s35i3rw zVUyB-6)sK?T-nrEdcCHX3kjb2WwwW1`s+%J7xWa(dH1Lx70CzzAam39-XdYg=G+7i zQ4<8^d^rmix2S!G#ri6MY7C?BPdY)OOizR)k$7%Atl=_X-aEtCz`{*!A*+_TOAeby zCkQHqMgWW?_uJy(5C9{9+=$OfCBvjrq9Sk5ehPrka5B>C7olI0oCo^dE9{r2m^3z7 z-%e*Byl~X#v9Eo=VovjwUPA%*a}{6qSc3!@o@bGNZ#i$0+&M20TXT~keRG)1vrvgq zxfZn6!XTRAwGT5g(`FA2^kv;%6uIFMky=^2QclIaoCwn6(DxIRzbQ-Ug8 z*M*=s!JxZ@_dZGI;CoqO#^BoOu7`YAVK zFUC`?C5wpjV*K&0%JlHK&vn3yD1hYgL51)ZZR2r}rw3h1`K>gOiPL-FFg0Vpe^$r23sZqwNqtfGjs`_!4;_ajshMQrKW14=N_Qd9AGmG z9xuSR^pHC|iXe+dqFNQM@3pSQ2L!$M--J*yBgIUC|zXg8usF zr0Cr)u;(Y(?F@SM{_zt~4LGK?T>o>Bg6_MSl zGr>ddfRhne4?vFt)(7Ov4RWUZ%MLz#Rzn)-9{WM&0>-8@AiTB$)-t7Gl9Yv%F+omN z=UM^u=tYAG8aL!DTEB5_RG?#PwJAM?I>MNrWpWCT zf#6>M^es-m_yzj;OZ@PB!ry%T@9}txa#NyEb?jr{*WW$j*Y6&4`{3JeKElD$Z@nvy z;{{6)0I|X^{^Tu0fam8O@7_JKc6aDsGcP*SzwB#1_k;-jlmCNigTmlnp7)`;pSp5;w&4i29(~{*wnzjOXN68+JL6f@{#OMNA2*4BG z&*UDqELl;2l?RG^#F(=>U@yG@5|$xCczb-t4)XifZ04qO&T~D=+6KK=dC0Y8!BeK# zo3WOX4V(3p(i7D>fRQ#C!zXT$7!;n4_-uw-awAkxW`IgRHhYE{*~(~gB)t|X|Dyp$ zv#Y>V#SVoCJx-G^MQfQ|078q4k}!_=xwQyq$BmqvzvLK+JIrX&I}k>Pzz0FIs7CUr zV)!WU66^TQgIQDqA)w>238n5~sfWT>(WO)qAKt>y3fO>5Zm9EVfQuCfl$a-XLzBK3 z8Z=IhV^o1;tv!t>Y0-1kp^P)TFiup~SCk0lA2+U1YtY~>VLJmpSQOW((30}7mS!vN z?&lyR*FN6}a28sYiZZ;r?f{M*uFrGqlHS@e0ggyfpk7F^c(iJZ=aY-XLeR2!s!OOL zgjpqfl@gU)SET-fgskH;=Ww`lJ!N7j=JI%^3<2u9FJCgJ$P=2P&YP_N$m9rmd?ugA zb8HB}8&ET;3zLf*?`W^Esr360E?!gOKA?J{X*PCLZ|>HR-E5%tVx6-~#`+A71GpU_ z(wBMo%p*;FN|P#$R%Y)32rLj1afu*RI$JN8pn^{!`pyhpuPG6?cpbo z?G8S!u-g^KryrQm;`GdEyTLTPhXH8Z9PM;Z5IFXr5ubpQvRHI<^N_yroQTl7=ws2h z1lrQ>z#_~I%^i_sUR0_803ZNKL_t&qgN%mB;`o@J;WUWpu_fY)-+itp(%G;_i@GN4 zPp=NiI&wwHaB`iE=T`Q(UIQE!8N%U(+yD&9$%=Zl_`K%cx8R({xl#$>KOjvaYT39G zjY%{j%6t6r8U2@k2tB<4+J-;dm=YwE}{F``>(puf90r`Fh|#{_T4_KHlgkifGU8`ubhV!MH~m7+`5c zAFuo|Maz^Zp(d-*))hKa-_f#%5zmoF;xeVfUUuBM0bU$ zv#qizCy1l~wUy75N_$P%NZb)hdkyDu39PL46%0-eSM=q@qEtnYMOIUBn>n;`Ov9`) zf0cV7)nh z#>QjpzeLK4$&e4#CIW^XlbfUvVK_yilL*?zui0LEr7XKr7Ycnal4Qk*-x+r zKn2I;f@2u&a?d!kSXV{QUt>KS!Ik5Y7{e;V8esCyNdBZpJFZg4(?C<7ygtCA{6fr2 zfK-bRd?rfee#w)6+ztdmFxFe4va#>xh~$?=7I33FL6+u*V>rALjzoa%G!MKF*b$+B zGguPBCH4P2A7$gmJkIP>6eS?317ZZ*(mKm-h(Y>&d4viCc_e9hhH(Sfh)nN@`a)0_ zQV@cQunexQmto0?D}$SB>Gho83T_a~tV(3`J2v<9Bvy$MEb?hN^RoUM@}2*tVIg%7 zCPC#n6l5X=0}MXbGv!J?<6`8e2T|5@DSTG51Hf8F3EUG%o+P_XKpNKt1PB>w=I|p? zCO3kD@7n-^!U0HyNHbi|@8?Bi8GG;t6Htx;k1TX(!?^xfnd>eJJ8pnB^wS;2`TWx18vJGv&_nYh%!6cP>E5sQF0%K3=Qj0 zAn?xO&S(vO956ljOj--buMcI2S{-tex~8{9UKpU(xZdH=^X4o!b13BS!la_SvL^#5 z9qG!tqv8sGaLCU(dB5$%eddDm`2p-Kr9D`@K~l0PtQSGt)8Hb;LM81 z&FeVWhgKogRii9$&Ipo6n4#Sald;J45<0iE5GEJvv@s}WHZzE48@<@TmV8GlvZUFR zcPxIcu`HNLmyJ^G@Jidf6xfLOtKM9C6{5x2h^)`z9S!3FbRPN)@zZhuj{QL2HjLw# z>Gb13dR9~^m^^C|BG(9o!D@h!C{v;0d;kp~xnw_QXg5ZW42M_XIKsGahpPc&z{UmI z?~&mthr?_~dN(}htDhlqMWY1+?&f?q; zxxdSxpC@kG^Q&?1RKyj^1!V{gzzBzp8+2SC?aVWzJ+gC?f1A$}=Q6pyu8`hBj*p5E zxFzq8V8_FtttXZoH)qoL~I}=QlrvAJ6mvjvf2=e-FnX zNbvx-4-C=T*kPAPB8sl8QgiUWw(s!UV?Dc^H#lY%zp65e6=1fsNEug@T?jcI&(}LJ zB4i!e#%_aDi!gdU3a^Va3IQ8=dXTzGYVq=3;9M&Ohj@ToIG{TXp&kbC5%@thyn=%u zFAPW=0=X)A-Efq(;t1twK-U-_C>6uINBK42jnOCG%Yp9vIg$-sjQ7u@q6*&}_9f8! z1EUMal>qd(;SYZLQ-}%nJ!%a`-ouNdox}WXfLNV}c_co4y5ZBO+sn^ z&zL|q`BE7!B=F4(_yiXKyh^#CLU5IhocCYAY%2JcVb?lf$U*V^faG(A)Ei#NU(aU_ zZ>^@cM{2`Wy~L)a7|Pm+?;keXd;x&?^!}tppY`)ZJn5jd;u$imgrPBbpOLi-6*i0> zM6&?G8lHv-RUnOr0G|aOtme52`-ZmRK1=Tl&eyFgjGXs9PE9HVmgz$9`D#0Z#B_ zHa&S1A`_sCaktEn7k{t(b!SJA0(S^+VY!52kJNt4GZ7~^FB{j*(Rc?nilDAObW;YYz-To$diU!H#FZqr^*76dN=4y-342Zt!uS_d5upaQNzdngcAa zc|L5N_4t34=IaVbhxU%l1VsQUKQ4$yp(yiTW+H+`A_1LElLKc^KnOm{Tj~>_=gCSV zN`o89$b!}Q;2!5=AVcu;T!pdeu^RQL(=eR@Ulh>eQU~~2{#G8k5+ZYbYqIKhc?lBp ze5H(>aH{r8O?~X;1Qe8^>1ig=l-41#g-o?Nqg-ct^0aN-GZK-KsN+}3C31rM4G>3` zm!dG5$$oWBrvV`GdpRhyGlSR$Id?gg?Mx$2at;OOH$Q`F$8lWYeqjIM8`x!s>7)%a;+nI%T-D9{a)IV?gu{;?Zg?MM+a&{Y}6^?&~FxLrS?wT>gk_c9u_%-iRv?Voym_K_E$Y%0*-c$qo=`mf(X zo8WZnb!OqfAO68>T&_m}KoJ_?Uw(1MI1KN9ybw1;9)jcl8`rS479PMF-&9^G%W)p` z7aI&x0D=4=FX5K}Bp06L)Ufy8ycLG%px!D6g0YRcIJaUf4w zRB^ptF%ClufjtuNO7z@~%v!{`O3%|sFQq4)Kq}mm`<&kG^ma?l@uVb#68G#>i!gj7 z&SCP&C`?*}RUGVM(|e!F-JHEW{Q~V95TG7DpxXmOid!#GPit<6?Kg&u?I0&rJ0KgQ zf5>d~1LgzTScpBt{}S~R(|(#sL6ggsYYhow#tbG0)Pv;jEdJ|pX3{)Luc7u6Fb2lB z6__l0O|n*IobM<>#bf=l@AXR#8UpymxZ;_nGRV4&=~+uKniT?qFFUV3!C(G;1<5gJ ztJ4%R9b3 zuW`J85BvCuLpubxW5&On6uv*>`0>}2E0IvjR{*S--`sHPu)gr$7@*bD#f%iXN@Wq=m{-^)pk8s@we)aVSU=XAH!#5vZ zBo+RX_jE@Gvc=SNlgnoxEa8)K#%qlAfeiVwl~z9U1ZL%BTkheR%~b%B@1-J3{@NPC zASh&ZGPk`)YqUAWs;H3QV!1XzUg1&75=AO5PmfGNo8gP37-Ywc?0S+4{H2iQy;Uf` zvz=RxFUzhF5ApkKde1YG1+2A)0C6i&&O*6!g(L)UE_QJXGqWZv*=jo_F>8_G$l8A- zT+agDxz5wuYJ;Ii8Kc06W7dd67z&wW0td_oT5Gd3P0UM$sf}QhT?B{HV;6CAK3b`(TsDO6oJLB6MHf}mJ28hqoBAVI?Ip1b5E@MetL(4 zRS1ZnC$%G!y#iROqz60b2+B1iS1J<3jvKHMy!mm^duk3nJwUhM*TEwE%d9>>_NW8c zYLANx?0ABpqiuIAC$T7Cm+0>q6Oy$sOTo*_`3hka-pcU4!I@c{`*ME@V6nmW=Qu}O zoHIb3^~*+vr{drWgo$y!%z5lf&t$W8EVSNg@UplCrg5E>15jW+_icf^c_0@6Ci8q_ zfpnfz5P-itS<~=Mg(opr3FOwJ_3}(jC|LVSGRz);C5*6=hw(Ct%v;Q)GYP_$BibqA z4AleX^qNWV;=BkHQKY?{XgrJ?T4&K_Kb`?E>5MrEUWS;6Ku@n@og2pS3}%%o+-_xb z`8dKW7s*{ALvJ6xfj&Lr`t3VlpHT+sjg=K7mdp;=;|EATv9Nh0k@1;GRcLL4+khPm zZHk8Xuw_x^xrarS23Di2VWgzh{+Q33i)X=Dh^`h{2s>BK4X{0UhtdAW*#?tE&K-Js zjqR&nK<{41c`>xtKZRYMxSz%q_WTKU`3S#7-{AzB%RU9ba#tddHz&AWfSrI=@6K=; zupyW%cgMf~oA3CG0GG>wzxof~ z;~0hk!5{zZ0bB3*`r8jLz9%C1>g_#_VfgUj0#(8J+|e`X!CwdjpqNpqKe2EtLZ-RT zhV?0|yuK|ZaHsGgm@2ZRQ=s=2g>l1z>7Cx6wMc4~b=f0>rm0lTJOEV!CKEcyKP@=H zNr-0|Zk5C$aV-zwYEd2~pV`b|*`z!LsC$8?Qk*Y9s?RWMxW^F!)y-$|XqDnux?2?~ zX)&K!8YDyDnZcDL^|`p@mK}pdjNJ%|Z7$&?JUdVoWQ7HrONa>SIm~7_9FVFDC`eK3 z=zYVmQC>Nghnb)!vtunhSuggNN21Aag1ZRq!;KlDBEj=%F{8__tb~o2k8)VX_1)lO zM`n=I3&m`{x>9*osF+!hHQZhn4a^|{R(b%xHR&V5h3y{d&dk8LF5AqV0I(OZIu*e4 z<%VMzT8q*E@ZYe~Lgu0pr=oUT0$u(WF?O##1tbT0QZ)q02h@20AXO*w5JQhn4HYhK zQfH_E5ss2N+u{wfZP>o}3g<6=4!b?#c>V;HJ1TA%%nx$Q%z{%j2&}dfL%oQ#&Dv(8 zy8A|!^1{)BlE+zLaFo}|>zU$}NnUvtn-)!kr88LgS@j{##YS(E8JPSNO4OMNso||e zUISh<4LDFefpc#I+&`%Rl|5-K7uFhLrxl2uUb=iBFAq;9wISC$_iB2AV-jXv+Vltl z>6NUoZ=S#aHD!ePGGFnG{NDt$GxEdU=r6kPXeP77H3Gy+Bj1en$t;p?V~1u!Lh1oY zPi&s>l-L0(eZXy?ZTD#X3^#TXvHcRKluy2PmYSnCcI!Aj!0p1$6j?tC0w}|RtSG=l zjihmKuaGXVfAb#lVTYbiWq`?@E_0g)*eQQ(fEl$k-lZ||1>m1s$dWPuGL)Tkr$wir z3PCT3Jl8z-Q2KmBnanXQo?Rf4p~8ryETycY=dGiE`E#^~w@jFbmu|0thXB>%0=qrq zc=`eRcYg;QPxQo%2rVbpOz&ER67&y$igtbjY4-tkf$`mU7?($|n6zT(C&*cu$=n5g zKA5ngs7>x*u+r;7!0eVezvw-9C zAw4`T5G9kW$;+_@(8DRHI-VvIFne4p6>5bRb7oRF6y!^V zmi$hStX_+KlXb~ry!p)loH_0+ZkuZ~v+X(WV-Q;QQ(CwvviA(9O=U9|CF-?heLd|V zfU*{uum)F4(5KuKcpRQN)gL(V}`B|I-1XHP=o4R>swQhV!e}IKTZPXx}g{@8P}&KawC?%vtrnv1Z~JH+mPeq4g7ro7xm| zzK8e@93w(Xq0WV&{gLx7p}2ewxD+J<#6;HN^vElD$Tk4)5WNFk21;VQ#kw^X^Um6H zq8&COL8v@YrP-j;YL3dtP3cg3a+V94Yla0#7iNnyv`Ux&^CiSz8hlxYw4_9Um8|Vq zU&|;*0X)nFmk1dqV$2zhVa&vUxgL|>njZUf9ON~Ya~bj{Ilstfbi=rQWRj4cP+r<` z<=RV}!(uOcg(7`i>6w!bJ8rP!0+o#hg6lF~4=_tk6#?}?+g@YX#{#2JWzwC^(nNxp zm7DVIa6nGIfD2rrV03!k<9@YZhU|5WG)NZXgofngHc8Nm1ak`Oyt@Nn+eCzcB9h=S zI|ohRj>WKL=aK2y@iFsHm)H(69Ikh-(H_2n^t(Fyr9eX{iF8Ilwi9Gyk94o~_xZe; zxa9}h>pwvM>Q9(i-8Onh;b;$UDR1@*d|Yt*)!$$||G;@_0`I=adnaA7d$4yxU&4Vl zLT+#D{Gs4;nb3n6C1t!hezrZ}^@ltB-Qy$fPA7;8`sNtpDBS$HgXQ=2m1ES#maRE< zzWMUAX24(l)pw<9zkBxyx0|DPohqInU{<^*J_;U@1b-+5Y;9NsSVAfA!ISVGcBGYg+4Kl(W|Gyx5DgRB5@6-qmx*kR=J3vZ|NZfk}KAl zVk~XL5@3zNvL7utm`8x8Y=s4&x~iD5O;|o_K11G@ax{2hy`hNTASkogFcJbgIiPL? zJFPdUH;6Oj$PgK#>x927E{#+!Rtm`S-VhcUu8@1`uLP%bnM~y9x zvmxX2q8pgNbE9zUw8mM$)>)DupY6Cpx7Wyms-D6>6neIindYE5yTq-V3ryJ zfirAOVV{RO_n3QCE=)rslcGko{+pb>-$*j5F!~hHaOOaZOpkuft0zCR4jZp&#yWs~ zJ3(+mfBj|UeCYXgWen5e?{Q9n)x@@tIKnc04Bq-kcFOu1>DV1*0q!9 zm>&JrLkLe0m*15*v&p4h<{h=dqacZyUPV5ijF^DcI;!)xl{~Cu7Q_G`@MgyGXFpEsrf7- z`0(L^=Zm2`LKns&r$-_;=;vg8z88o*JV#xFQx+0ndX!Mtq@tX_F_S5hbgs(y{|Lm_ zl)}7exZ-6#got22n5Ehy1Tkuqsr`a;`ninrxu5HJ%JgidmqgR;ECg_?lFhJPSH>uB~PMhR$!!&~jT(-t0->@X6Z!weftFHR=HXc4Ue;M6)l z+Zt3G#<4ThkVq`7V+RT(W@wasp9N+EEha5Nq9stviO!!gi&z(~(Ne%#%4$naAUCer zm|4#VaP7I8$!%lUchyiM?jef0kHY`@%$lpbDcdG4oOc1s~h30@@v6yzTANcIUOm2zbv5!4>4`3WEhkt)QD zFdAG2Oa=Y?2GGuR>kc~}0Vk->EYmbT5Jng~*jPGn0@Qe|3Ce4{fTWZ)%de0%G>bZ) z7GPn1_H!xjwY8@hd`{`qjHr{=1%-5)}vV_d$Sz&q~^ z5EP~-+t_`^j|mA%4s1ENbzW&Xn;?L-dteu4hwJIFP>hF#z%hn!irFtb#{ zg5q+tgm1Zz7B6h!I%d|h1dkDjWde{*y(1#f?H=vbSJ1mR{LHvv+#X@iAL&>@f`Blh zeav}HLa+}oV_zeYBQl5Wh-IY5oFETi=aNfg@ERh4g&YvFx-Zri{cQL6LNEm!^>$|C*fZK_ybUe`)~gRp8ckZ4qy=k zUI`Q}g{dbSFf(H3YbBYd&7w%z%NA&=(-O=wFzGgTXNwi2^(YNy2huB6^|fl@85T13 zZYygx@0;juRT5Gr`~JL&;^dH_#f8` zKtvszwc7Z%wE(v}!`^mySf3$K(lR#3@V%ZxBRrL5ToObMo7v0xJ%~?koqKg9$#obJ zMs){ze2>lyt#Gd+K_->SY#}yV;N@DD(n2UAygX2A|6n+Ow@6IkHG&XranNHOZMiS9 zVC=jo?S2P|(-T%eq>&4xt?K*nt>9Ot2TweN;3z-_NO%efYR0kS@B_NN0_=dS(>OcaXNkd! z_azc_uTb2}>U0nau+~-_=hK<{(g5Agd~Wc(inK}E_k@%JA5Rc%=yz`@WMM!%M{-i^ zlXfOBB&n*54An*+U?xY%DBhn0V3uWV2||`ul_>|(YoJ;sCYXO`5dJeC`c!O5HAj=BbK^l>qnW-rww8a0Fy-N zxQRvp03ZNKL_t*YdXW-d&zxf!+ zkRAyhX`Ho=_WGyj4?kfT9AG4*ogr<;o;Qrco_BrrT;uH z@vjB-{f;kp#~1^Bmj4Ll5yosO8cd6NCI;}8nTR3@awc~!1xGbMPeJV&qD>_;tyuz$ zXn{6|iu6>GOBkCw6n}=o+=1TYMTVMra)!eCNZ^%VQtNmWKTQC2K#ISGWj7KiF(N_^ zVr8->7>S1os~Rt#XbQO}jxnt~wz$M>^-&q(3uh7p|emKJa56)n$bW(LRH`UF@O z#v^Y`g{NT!iU@qLeo~UiRcQ@o#x>F_AVP1I2+8}}2#$keMh?_i)>>;kl_7_h2Pt>N z%mz-2F4iV2F>QzvGkhR7u>1#nmVil6A8WjNi+D3Z+fFnlqPHtsj16cz1N|KLyCKWN zFi|1AgtpUK)*jbSFxikLDa1C|{us(9_a!@}*x^-r!r&Okfny)&Tb}?Rl!XWWle8GJ z?2QN_^#cjaD1u{i09hrXfS-lO*=k<3<|j*VrQrd|eIsbCVT?f|LGo+`WdQ=#SnUv{ zQeh3X2-89#vH{Urj^J9+&ac_?)eis%1SjqpAL#9l9J>Iht{NRW08vBhceq_2Axi!u zWK9Q)+I-;!%d?&2Z_2Cy+8LTu3GP_>@jZaxf%K|zzwHqcjx!TQiqm{V?X>{A;)}vt z#2lo!oC}7j`zLQJu}TQvMYiO%cu#Kk_1vrL;GN;?7?*Bnr#Aq0 z*nWw7W~3npE>%K^*SgKYL4baWtuVu+H0oKTeS3I=+pqo(_-2Q^Jwwip_V!D(uin6~ zx7g=^UoSK;RLUde@ocrG2?U9d=KLx>V$wFW`!5KNG6dZ^`kSATlc#+yc^Yx4OJhe( z(3xIof*w{YNMM-5i8afPHo|$Z;}ftq;QA5!?H!KGdmKMJLw*Ec0(rGTdxM@EgH3SzJ3JH|CJ-0ipwXx~I4OxDo(*ehz>(w9^-mevk3=Yxwbm_Ua9MYrvBSJ!IjX z)}BLoNdW{e6HL_VfNckG1m4&LM<00Q4gdWg`~)BV_FH_4=g)%rFVy>gC9j@7g&1A{;pYXCN0OMmh7lgR?CfDU%&SdZ3fo5H7S9eOIXFXX)bZKa zdYR8S%m#8JTZGG69;U_XSeCR0aERyArp0HdHcdc*b5$w8oSqU-1-kBoSYK@%?-)#8 zNC8LpamR7&v|4i(BV)BmR_EsfCg7abe1L6j<&i*oLc=06%On~LWuN;X6^#Q1Xp3Mf z-C4Yp4f4ER04D*)jq}?`UPffPDK?m0>E%;}=soPX5bzocp;pi~Lw?8*rU9zx=eKY> za9lsuTsjd9V1bo)|3)jb3_p4wUEs|%7uNgs;~P=5$;u}p1J3= zL82{Kf_KLNq*o}If~J!@dHD!IFCa@&Hy^@tpC*W2);R@-2Y1aQvs>3}@(72rV~ruX zP@*l8I7hTF!wXMY&3fH#0YNdpEPRYG&b*A=+V`KS7Xd?~E6^`q>AW59x5TJC&%Q4p zXF@p?=)eN{$}pSHGzG21`*|I_{ER19O+B3QpZCshO5B^Cow0b}v_1!bq04rf9#oLC zsgbzhvCLtuc<>vq0zC=j@v z*aYp(#@c^6z-(#MiZiqvw}3MYtc~4Jv=`61PLXFJekQ{R9JW70+ZlHG0JA5I>wEa^ z7UA@HzDn^W;I=5^CGmVgmk|-TcHrcYXbJ3Ph@ZvFm~81yOg>3jxItqJ+LTGYlZ`}u=WIYLMuuT;k*DPGQ;sXanhs| z=C*Yl2g9MQvuG*9oavRF#k?DIdR+mG;m{sRDKEb&js%7vFolp0n4T^7B>kfV{373Z z9ZE6wzpRYHqry@tm>KquO6%U>ID(_Ok(*RrzVHCr4M2zXbDWFt6hhhD9cgg`+RhZ{ z4v2IZZqU{+cHToE*tXz3IYHSG!qP)SD6Bler9z@T5ni0o-0<>ZZ8Z*^+2r-1<~lzk zwe|^MGMt*U4ACg}BY-wV6NQZZp|T*5=+3S=?k0?vX$N;yqoY34m8TSWmNnY`86sc~elSpl-t zQikPTC?CnfyGfi6u$HFkgWNxUcXMNG66^Jaq{gYP_|+b1sS)pSwkB zh{dJz_24YKYR>0;Ck?|a-0tv7)L83LN=6v!(GnK$-2Fe~y=#+X$#ETc+#_ygRX^qh z5THnqGRdf=*~->z|Nn2;{j#Z3KZE=QQ94BJ{$l=%)v(h(~kf$^Vx8>{$5^fiG6yQ z8yv?=Iu>(=Aw^o`!|_~;D*EXq#`~}6#ecn{{hJ@){FA>%yMGD0T_7(z925IDKjkd8 z^ggC#u+~FTPNX5~gN}rkpQFG0A==$1aN992?=Wu<@OdHlyL-jYXW@n}`2qLH-OH#) z7Jh(xZi3{@HsO9lxub!~i(PpI8klU7(=d2fyPkp1Pf@fLxW}~cB8M!1M}i>(kRe>e2G5FD ziSN@pgz|3bI@Y0RGLb(#I>?-z1rDmZ7d$sJy=)2IV$5kAT6n*NU(Roq#|(!>Hc!tV zO4-gCA?)Dy$`CMW+aaRTKKrum<_K`pHGxL0qT9?;G(gPF1Q z4-Ue2GQ`YEFQKq7dd*7jnHAubNC<~Ji&jLS)+!+`vjhRqwV!|&P5>fX%u6J`$0AmU zX5QdJdIX<4Is0@AaB!l>5fi$-Mhf5>Q-B9;9RTwpkw$_IdJzG%eusTr>HR~{+lb(F zJ_QS0o&~`SWtZJlW?U~lzj+2w-@*!qgktgVCh|J*Nk>r2@jjWao5mV{Pp_uOKFE0T zN>3nn9=|i^U~x&?>Kv+W(fP#yX~BOO!dK2fhM}YbxS{tKfH-7wT%urygO-31=bP=?que{(u#3B-e0%nV0J#bL+~5+0J_T+kMA(ke=VWU}iMEK5+wJ30o>CstphwAExkQYW z5+o(`eSZL{d$PMvynm39o&dT$iv95U4eqyPWO}f$wiDnJ_TdenhW3-saQ7E~jrQWR z0$u&p7uetZ5`MctaE>mM3*<@8VdN!v(hY&@&|d!t+b2JUZ1=HAH`soIT|YoicP#jb zN?C`qhpk-W`DqAyc&LG8yi4vU0g~9fisy1yWMNFmg;hL~heaXHfo8yIL$e8tOlG<9 zyzZf|Z4cZlvEG6b>fr$%58tAl{~SJ_kOsfYgv~2_PzIY1%>9CKyU3e87`5ZizEh9I;{njfA9@`c9&k+y)F}ylkZbe`w9==BcFDIAN z#7I(9C4maWu)K9l-tY@GDOC1_zG#R`=!Ahw>31tbX)d7~E5o(jXt0z!}+{~_NlDhU&W zYio5Vi-#~gH|9BhEJPqHEDC3{?5rv@r^S>UfnmNOyKcB7Amz2PYLvNubtWS3Q;U^r zjsa~7cR7IR6er9lv+MyJ3Vluz?N*gu&Oxk`BSB!ynRblZD4^S=1?Y;UK7dyb!R0|2 z1WX)rz4D%=Bvk=)z$1y;Cm`oYXugrySzg70TY0qeS|S^JdyXfloFIA!8;{Wb0Z!c>lkr4>~5ZhFD!!9JW1 zcY3hW2&r?n<_KX#G*Iymo#@*J-Pk!r+s6LM#vDn}&fFp7!zB1ikBt^^uJCURsGVOy zw->Q*2h1kic4#MGAiaj{7UM~sA>j)@@EStaGv?%^2Z{!X!1f2U(@Uh0w?0f_*#&U~ zCdyl*GnK%zK*|dov+Ez%=qRs_HA`i%Cb9#NP3KM4w{m|Sy%CijlM5`lHj78Hwxs~e zB*gcD9s&q*0EfS&8G_2o&fMywcSIl`?HQ?S=blNPNeB+94H<4-;pjCc0zQ#5+#Ui% z%Hgvy$n*#&AsHj!=yu>A^@EGqMXGt^FKr*3m>Qtmm-FenGFaCB%TXRz)gZ9aN$tg_=r4aj@SF$R2FBwXVD8ZEv%~Xf zRQVFn*!}>!Jwni}dxbwn;fZjb)D?0A z^i^lEOGg2Mn$b+S&zwfB2j}~Wb;c_%bVZT?!Fg-=;p;Pg{{B`HX~~2?u2)9@Hj-GZ zSCSg191;;^dK>3?0jSE^NGmjzW&ofvh!S7{aS@)J<^4&Kgz{`TvQr1vb@``5C<_HB zM9Dda04E;Ll2y7HBAwH!IuatKJck)fo^LA2XLPTFmO?Hc!{e7yB#t1l4ey<$XE1Nd zEtzxNR13TnB?rns3IJ=KLRnaZ=S$wZqjimWSkgbO!d2Oc^-PxD9wytXD#o0v1)nn% zXj%QN*>-LztU1|Ej+I`cKyv1jH6bW$O`g-2L zSeDX+1HGU4`7N5HAC!S7FJeAarV>8<3q_?8QjH;i-64h5`$B}ELd1A2zd8~c7biL`Z0+~z>*4Z{uULCHfz7f8Y5IdeXi z!Y}V}%pRT@Ibn1;A5~j~5My6!cm#Q_lJ^lcS6T;Op**y~CV4A;PKc1$)gwm48hoK$kccy$9A=DDJrB;jUNFex%1(|7pc`kkJI|DQOq{dJbOKGkXYI z^W~fY$Q0l(zNrn_&g>ceQ+gF;MIziX7qiEJqIf8kIKqRSo<9MybzgcMJ>A~V`rQ)v zunUI(GoC0aK=tk(`>+2IkN@TWLTmSszCliB)T&Z>008XiJ?#2a^ObW*uo3g^6YfeN zC4jUu^u?z%RObzI-k|4Kn3p$r{MCO39xuRshh09<7&~3y*l~II61T6vg8pWpfAT5h z-eH&bq=E_HnWXv4>S(1yAzRGRjlXM#*)oEaYXbP=0Q?cM35uQ|dKPDnU53noDDn}9 zUnY$c9GeS7RLC9U-8=Yn$OpwX&ajiimAU9>4I+~?G8PzN+S=bI|m{3 z`Wr$Nq#Q)K=2Q2bntuOC{7(q}fZrbY<*Oepwr7>T0f;obW5Ws1S|}6q2!qD_W)@6( zX9O#hnzSzN%q`6IOk+>OJCm07k&+~VNUT3nuVtNQB<7 zOqkD*Zna9Q*^K9L3Ud`ww(xgSw9F#y%=b|_E~4yn3>?D7RgQmX>js1p)AGmx%hLl9 z%zY1Kt>I1LSgWrvr1m|u)iY#1-I4x*&z@jAlxkVS3tV#y6KcT)h|JFaGXr{% zP%BIJ=U|fUH13(!8pfWzF?kTDO(qGevhAN!0jMnqEp$>);} zo6f$KLBvdQVuh(zLcRN-GFK`qhBY%}o?AczlmwkZ6q*P+fWdsY1cdF3{qh@DGLBpA z^`Sj@SFQG=*~(^QF=r}6kj9`SQLJMMJZEYHuzFO}y5(3|>FotZau?(;1{w%CZ(Hy6 zw@3k^;S5L9=;R{w0>c_?CxI^d>zKoxf?wI$!|b*|qATYuZ;W%N%9=NzMJjXvhMq zgRyq_D-yit&x?Ccmyvq_S1Tp}BysvP@K&%t&#(v3I23vvtjaYvhfyB|ZUIXE{CqTy z?4*=O>Hz&v`KERGW96H@McDya~Koy zY)+5sg)rO(WlE#`@%@nr68i(j`(Fckf{z>Q@ru5kIL>h+&+Yz%dHWXr@B!N|H;CRt zKHVUGf!!X^?mjyh1bOG6OL8xn<=A75g6tYfV3qU%`CrIHyLjZ%I=yfZ=HD8kZ+pqHNQAqfx#T?D7raUH}r$1Xd6Y_IMyX$-OPuw)CW-gw|y6ai4sE@hGjJ$(>V zWXEh2grg#@w*}nfAh3?pe{2o6jH@MFGpU=c&-@wSS_H8Y>wm~KJKn=rp@{>?=pY|a zo_)|gf)^pASlF@h`y4!nRa7A$4N3sO^zyOOhGC8foF{QvSp4n=l1L}0mfFne`6)|3 zE3lp4=Nv36dX5oZK%NvcOWg?(wvmI=2<}^}zpW}|f~3}%12x8AZlA~B+*$qQTJwOz z+@;b?I-ofQ1cKHTbDwC+y`!fyQlX8J$=Hs*(WAs?XtBQ0EkO8l3V@Qm&dp{bP-l*w zz!>%kS`#KlJAml@De0j*L;HPIjv{F+kclmJ$fFUYxdSK==`@HYsMErJ01e+XdIFexhJe>AQ~HV#B*0&s-0+~%6Vc*~F;p6BQ`ePB zl~7d-Sfp_1Ql`#xrO~@oq!Ir{7?yix(6c5dltz&4pgdV1vb@6<_xy~XtDHQmdvI?L zKpF%Kj4hCrVZ_7PL0fr{B1jq%*bV_OZ}0gW+8}ZQ&OgoJFMsnlkOzglP#Rcc0=KB5oq+odx3|B5 zT@9xn{RF;WP`R0lwK}FHz?d<|m@Vht0k#3jK?Ff@F|X-RBeR=>c%X zc6tr`RfD(W>3oHD_ZjT=gl9dIJ;>I9xc4pe*ADTGMsfqIgX1h^gMhWnJez*g$fe^x zu#n%m|9m=t35hnDKDobKl?7pWc6tk;cj%BZconI9vI9^PVPEG2WYc3DVQNhP+md0a zvw$U&xHpnIEF&zF>lvP*CW4o`;YDlsHlqU1cFrHqtFz~6sWgHwBoHIG&`<;ks03Kv zH%hDea&eHw8EbmThmi;$gsjSAlK_jr#&a)}OE|$<3AXSc$+HcBAjQp&9vs)SFdSl> zEM5SfajJ<_|J;;y7R1DWV9c~4P*%Ln>|%mvc}H7sizWss7+0#EM&I;Q+i#DSz zRnV}I3PTGFKljiH4-z83u=SYR2w|nt439*O#TGrz9Q3}F?uvOUfFE5zR@>!Nhz#9n zc!`b*!_%|iOw>-&=oWJaZ=@U$sSsZRopxeqIVXq?xs|Y;0dw&Md~#fZ_?|TM`%l^W z$wn9jVQkp4+!;!3kk+|=g7|EN7K1O$5gyceLv}q`ca88bZU-$m(YAZ^(>)Ch9S}6w zjJa=u4lSA^?v>d4*^k!`bD4L_s&PGfSvW6A8AQ@%gt1~_xKTCq@Zwfj5`r-en=X%I zUDqtCnmTU#4RC?zj&{C-Xy(%qu(kf0$`}aH=5V_~`ir=eqx@WvxNqY<%wM5N^aRdk z_d?GqEP8oH3W3`=RH_x?FObIEwV?SyR@-MTl%a2*M!w=DJjMcV8^m@%6>YnRMGkA8 z2M?pdArQ;zVFA4m3Ai%EDr;PM-tzN6c~Uc(W!j826XZr-DKyW)jKq7H29T`-Gyg8Z z*76=7lvxSQ<7fh4#?sX1(_nZeV-7$20=0_vhh*p4bo58zxf5} zU0w+6E;4D|;PQz5yI;Y^1>?In7{C4!?bA1NQK}WsfjLiwNE9h14fL-9YLG=vn8|LjA zIaal>B`2%E3t-yMKH-@sp8M0VSS(ceneIj6?;U9F3>&BCFbjQJDD=>;ly;>B001BW zNkl(v>?Yby`nVEq-?lLUS%1i&ftT13QwE8_}Fc^%27v#@};ekm`6 zwUNfa5?rX9wFN+>zMq%Nw2!3ADlafH7a=ajku6}E<@QG~5kDjlU1Lt`iJPyu664Id z0cHa2JWLkeLT!i8a)3xVSTG{NgNNwB>t3GHoZSjHg>uPA&M~*q2FX3Er~@mco}uCv z;Z`1asr-?oiz#Fc!JExHob~RjyAex%3Ky z_IlSIq|zZ=!&@N%NDFZ0d;kOs8D_HqScE?^|LFjn6R_uc)ccU7#KMB)QZ;xx9X<;r zNc0F>(!&*n29*!vm2Qw83H9KpYYKH%xek%24n_dgrO0x92>=Kj<>(;-p6w0lQ5pf$ zrM$s2LT-IKgk{Yz$E-76-ZllY;&t8z_Ho0uoq_Psr0UO})b4=W2w>PF^qK|(sdhMZ z3c(J@J=?|g*9m7x-GIrp^BepC;6yaM1BVCBH7tCexuN`{M_!=V4enRKMgW~gkF7;7 z(D@$HUmcW)0AOxX=Cq=6P6K`=b;7c47q}KeZi1iys7Ql_a*IF?bq3PglIJJSjT}D1 z|F6Jv?UloX)OE@`x^lDEw*3g4A`F~^A#!lA9=;~^yvcf!ts842##nP&2q+xMbQX>2TqYkDO|7;E$@%k}~`ZWzD$3b@I z_}uBCZuifMTWdMn$ zuRp-;`)!{=ZcO2n6JiPGVv(xL0AnnekyxM2<|{&zdH6_yfrBs!Ar-($GjUS@&t9KS zk6n7{n5rP*9kc)~Bw2Q+m&1K2f*Ibe)?^iRc!=EsV43JnamxL-kgI?e2l9?l05Hv} zV}mvgfgWG7^}Hm?j_HWqwTe#!`(V2v4Z07@o|ev2QK6#@w;I7ju7OCZj0D+UvO9C3 zT!5xMymyn{Kw${7hj)=4C=~TWR*u32t@UL&Yl2KF*_7^c4AKTX16M#M-is{;^aPJE3na*V%>bR`{DZ@6u!sYh zTa;m<+{mdMg<&EWB#G?vSAxK{0GYF}qV(A5chB%P9b(wM^ zN9dK_MF=1#nB8Ev2S)aT9NPCsu9+y;JCfd!^B5Ce-gsNeFiWj-?bb<%{aJ_8gIDmm zl=qm2BbhUNMPO1h97DoMgCST1%g6aB?_~b$3BD4H9PW=akaLd8yg%&n8dmMY(pa8F z8OfKqU}}*vBfWg_ZAq@xI^}hr-09B%VYP`11!DuAorJh)o{dxvXQ;MH$S(3y3fy*F zfB83%moL#?oG||OE3T0$kaziGu-{ze}tZ1 z@@$MN^!^pDU;YE^@eO(Y609m9LGwbxQ3znOpd*Dpz_6@I)Oi`bms21Ekc$G%p`*i< z9`AN-n3yn)h=L+oSspfEa$agkMzaXJFFBk>v7R=d3-L1s^z;hnPyQVZaOa+}dBOGl zm)IZPLB0j_0q{%g4Rc^Ov@VbtPKP?Pe?ai}2fBUFs_9gqfuqoLd8HD}<^E6sRJ@Mp zQE{XtmqLgNbfIhk3LK@!RzkS(kcaX?;SAbUq4+b^&VsfgQ(HuY6}Iucna!gUfFcS| zBtPFO+-A<_HCx^=2SM*hV&llMt7B};Ge~9yGkU}_9fXCQf)!gO*zqWwfrQsh4<1s4 zJ_#UcW*Bqz*KMNMdW+(aj8XaWN`?1Fz_~Cp^v3Xkw&lK00FYItGYT;zy-=k*=#5lg z-bXWAG(NE=4vsa`0(gj{&_Ne3U<&%yGJ6-& z<(Q>Bj0Jy=zzc{f_vPM@+`Py$kP~uHfmz8Le?O?k^_zV3PJ*-oZv6Lq1uHQ(35WT& z@VKVOG`|sFO0S$8uDo1&%V7Hma;-r+0u0jg=aGk5;79rzj{_^TXwR}9{H0u*yRaw*I*N9yOUmqh?1VikT{=jr$cQ+E~y_j z{lETKKNw|LV#C9*l@$>QD^DY5pxTLPP_U#2ECq1IPnR)W;LXcuK7>&nX|TQLi8SxO8rn`pg5MbV)Jh|E|lK|yqo&;fw+z6OHNISm7>_>zP7 z5T4w90q`P}n;d>Q6bssp3h(Az1$t-bn%=qeY#j3+SMf@S@btWf;_*pko7bo3wzCg% zf{*~X#Zgx*yHabLV3>d#v~oy9Tm_FP4; z0)`FJHkdT%rtsTWa5v03qe}`a0;xU}HYfi}iXq6MLOIN<1JJI3ucr|vQN12jd(N&a zrFhc#aZ)bi{?oj^9M6zOM=KW6Y=_EycOzr}KA@*h;c`Y65}57qxrY*;VCXbL+@;95 zzLX^!4LvuQUBiEsNxM9w^v*U|i==ssh5p6EtF*k}m6q^qb%X^TGv!7*0qNT_d+AODedaEj@HMkFP@R-%Uw>s1HzEpAz4ue>qkW9$;C<=(N zX}0HEdo*9`QP%bH9C{RUP|?s6FVYFfq5unm$c0RABtc{ucjl~M53scT;Lq6W*C*^c z;Qhuq?F0;>exNm3&zWZv2hQ2daRWRYjgi}1^JHtTeXvNQ9)9)h1pvD}Ky-)gk9-Eb z0Fp%(w{;d=;4&bM^Ez)k=64U+e)N|I^6F5nQ7Jw42g><~0Eh@=B$r`+n48!43CUEH zJ6#pIxp#*FgJ2C4!P&_Om)?N$Xpqh64OAhQv`VcC!uI#ruixN0zJ-6e10N#NWm4GA9hke})7Eho z#nsoD{Qge<*Zt~3J&R)i3^-b+@s9vmWt4y?g+SBnql@J!j0VgRF($!-p~N5(1e(CI;Aiujh!HYVGZ zNgSFQl&sDu^eoYu&%VPpqX0xTLRy(06D_v<;2jkTWX&Q739lkjksPFD>I5M234?3T zR*`}Vx%blf){;0lJasGQi=H1hhwlS@+X7h4@(?5tkh-ZzuKX{fA3gx^(5T9Qi&ycPK9dkc6`objeG1D6j!Q zPn3o*CmAnFkyVq7Ls&HbCK9Ow2)Yaa9{F-Ph8C0q`4Y{>??4@3PlbxG^iiMj0ES7{ zY&d{LIS{>uAdIU*gw@aK8Ju&Vat;BU&!+-sKmunZdV_m{$Y}fJNpmxyjkGeP7||Gy z@x1^H4Ac6mbT$%ns^gMp*&Wv^>L6c$LRE_aUl2W?-O&O(d9FdsNy{?>kM%Ze+F_F(Uz^DT_z6Fz zTTrv@kRWk}A3;%g%^XNetAK%J=qwKdVm}ac(qrQM-J^&l*CRiE@OX)E4wvlO!mGby zTtC3=9_@4o?I-L{-=Ljdk&6%w*@eUeEGjtUb}TR4@<#DCcGws346=ZELYu{7N?@{5 zYYyJMSf2{vCU+noB?q9T`JSyQ@}mdNSJHhv(KA(8b1HQ<^IROS z>Bw}qXk#Yyyz`^6Kg<9bkbXz+okj6O?GHy5F%f{Z+EYb!qOo4%!gLOJglB1RIPyE0 zViMqa4ye%6JFf3w5AQJ^zQ(wH2ki|QJez5Z!x7O0h3^5T+7^aLc!Klk(@8C{RymjM zSXIF3?QUy661a*W+tgL0$p__mZZ8MM;}z}XWG|QoyE*3N5q4o!GjziCN7#OYxMPkF zczpN;-u?YgasQhWaM$5|homtzeGM3nc}#8aEJ-u?=7FInusi$|gubi06T0x z!R-U){D9l_JuYv*gS|2IFA4gzN2R;~FvHk)dIYsW%0t<#gvw}DCuTtq| zj@_b%a10w!VByTIjnA1aLDx1d{DG+yvgd_C$F~MWK42DgiLZB;XG!5l?=_@IuIco`t2RE4L+e2pz(!TOvOfB;Awt>Bq! z+UXTmp5w~E6y}Mlh9Sj~ab?sn#*Te|LQkdp;s-S|%%hB-&A@8Qb9hbHId*f{yh7VO zr?_qPy&6P#W^6J+9+;8PpI|8Vdn(@W@JLvr9v;<@4&1xK9L{i|)U zd_UW028lH{|I(?s3Fkcit-7oOyWp z%(E?wS5Z|8!W5$9?P@__4P=Ra7OL>Gtlk^JIVZ(E5P4U!Jbgt+q5_N1Z{|u(o9L}$ zWN0;cst#coQN^ZIRA!L_7C@+_X8}%1l%fZT{H*eZF|?M?u5su9#9>V<_1IH(<>=*I z$ORYH*%m4_z6D`pcK ziQqYA%6N?saC+w?$cX{wj5+kkx0Npk5Q+JWI8C_S;I0*B=Ez9{Q7xiGfZ}&^kgzr> zQc`$(0C{!`k^0-mugqyWh0^6bw!UGEK``Do3^Pbnst>X7^ah~zwe|@NMb=s(=3!Nb zQnB>bi*$Rn!CE<&A6JuRnnLo@F`T->?SY*z)R|_{s5CCO_jtLz#{S*UaR2F_$Nd~3 zZA0%)xHNLUB}J4^kR&=bFKFO!u0w0WOZnPh_$%8B#4f@L1$#YX8l0&}>l6s!K4BJQ zXH23}J!FMsG(iw~usk2k zcN6Zds6dkd7YTCGV|!TS?*U^^*y||3Rrzh@`Tb~19sy7;YRqJ=-N$Jq1@>x|53nr9 zn_~=*G$hhI(kL@}SZGuZRQOho-grRd6b2h$)3}e?7H44KIpxxEkV&=VP`!tZ4+L!m za$`P9c_k;G*4&M!N3?kc@EW)p{BDPz5}5B;h6CWY9k>nP?hf+lr_g>z|Kv~6Ui<*_ z;SI*qTlmxa*xM4ha^U_?!`B9L2B*U>H^_G4+)S`2V|K{7!F$lS2w*Y^`mS`gxEqk+ z+3A>16S|$?*9c1o-OPORfDiV!&{N0tX~)x-Pv~DoOU=z-R}b6R05k%xX*32+&^~nd z6%m~aW7DZ8McK0#V!)YG%N$W+2L~|SVHj}Vuuls|OQadO&~qv?dc-&A9(&G&7wk$$ z=>W!lg}&|B|Bt`J!=L>OcIxnV6a99AniDWz9OK=94Tp4cL_$D%JCJnW!;rQ)t9aBL zxYvf4z2O@Cg@@qEAH}PS7@8u02w$mmmTXv|g8Vnbz045tgYZq@6W@&4RIsl!sz_tW zrIuD_8JPq((+Q>&te9mN4U}!lGiF5}k{&c|8o6+ZRORpuEYOvTq7+E9DFZjZieL;@ z51X?K2(T)Q5rA$+B0ik0kETsPNxRW|FqDVzOrTbZ7%M}hOL`YMAa~$)V}iY$SViWZ zAZRIdOK*>nQ!X2G_pZ!Al$94*-piODH)Br3;cxkj>FvyRInxJv+h8DIPB6A|Be5)Z zNO9KX#-T?t*yA(AmEkP|w6hAi3<)Q2UmggA=Qu%qEd#}Sb&-e=Tk!C~yz(R|)w1b) zD2broi7&4UL+~tz!4F==|HezOzyzRZ+e_FSc=+%hNn67H#57b?6l1dbFZ1rQl%k#^ zTLi)@gr3h{`F=vrUm9F##5nkKOSikky65jEtEeVCsc1>r5`e)iK$gO9SB(7$FTVJz zSRW(j7CL}EMm8XN7eXY805b9ZcqXNRoNVbacIG|d3Lc*gb6x`^N_{R&tdHc86f*(p zzXf>cjcx?9{Uz)&Fvk^byGJJT^Z7%`TIT4*CWOFcLZirM7}re8qXR^oy1)4M z9P&|-Mg?&6^d``?O!BX50bw=QK1zb@=N9%yhDn^m@=lgPfcjq2>+pC;Q9|YTn7f&8 z2!U=2_ZSIXN&(RWjAmh0wzH(yC>20>!Lpboy>&|7N1nL@XiGp`@+pjgtp0V7!>^rU ztZDE@VMg35f$6;6;NLw$E|Vlk4jPN5@HV(awgteoXSs-adWm-b3AEoKc`rrJu=!zu zy`10a@L*rSFo;grZD*L-FWguA&h!dX_;AdA1tYH$)+nFbqrx#^7-*vd>I}~gCC8l! zY$N58jt0Lt?EQe<2JqzA_6^z{=mYT3%~u+;IvZpHvpZyWwA%*15MW9JTx2zD5dec> zX^25?+>;&()S_633>_^PSDcLiJb>3>znU03L$&PQvDaA;G5F*)fgA7^@V9{J4j+c= ze1wGD+)mN&Sd2v}!EjKZd!^#~1HSqS3kI-? z5T*c2DTW1|KqiYO_$MzQSD^!0KqslPsGvj8^W!0Rm)Ffa3kFbtg*hAo#5Iw!AQT=z zS9=yHI8fd>5qdS*$}W^_!mkLIsVJni0CnNd3QyJbHp(-a^VC!$d`i#FETxv#13i0) z3ThFQpl(IQlGE=2qy)pW$OQGQS&7*?y_7cTzP>RwnD`Zi#^WAA@6ZofR*T0kg`D5dLOwO`HEa3 zr+~}QHOjyzKx6ZHsc>}bFQIxSZ9?vkEKsnyCQJz2k$r&cM5f`8JDgzbdrG!ma`-8Y zhz%rI73kJs*IVTCgqJRhY6AF|+E0uGg?MC|NqSlq2rTt&M*~f2k4YF?)5xhOS&APU zGeLHOd;$T-F$CB`Arpjd@aE9-%ftRvxL@PG*~izx-m4iJ6jZ1cX~IUfLX%xLvRGxowY(XH~% z7`o&9OWR=M7B)eG49#sC`+21iXnK=Vepdbqa&b6U%m=6)rv*rTZL4Jwp+dsBhikVI zFfFg$3PJO{9So@$SeZIGS4Y~UN_SaC*YSE>+RV*eW696bAj|XLO6~%PwaqgXXB_Dj zP5PImA*)I{jXVLW4O}~sQpG0M?cm1ALNMwVR{PF3Z((133xB+F&u^3W909g_jKP$9 zNC+L;=^one(9W-sMw4!L><8`=MNPuuDi_#3c>+S8%*zhHFpm(%wr}nJGi0F*)|&aAkN@t^_;jJ^kY-g7#BShjehGA|3n*sw1aaatJh6ix75ne>YZQS5s8VcMX zLYlHUBe&Ui>Q`s$xH0y?4H`PpNJ*xLcCujMUv;8^gabs#e~ak8l)R_m$Z?_Dv z0-b386{MJ&c`*5XGnmlToxt4!06H8nL+=D_$CgOB__?NaJn*VfXDm*M2hze25*rY-11=ff?O@JXZS?qNBz%WA>Yw|v{Q?_`emcR-vD*`}N-iN54WCed?>+XMIuD@j}fx^lnw$U_bIN$lgC9~& zJi&I%WML2vp6^L02X|o#6>Aq$UcSH5R34R14EjHuVH5zilk&Ghw40%iz2uny8zoo*8do5rlA=ggCM}ihj3JTJw8$&*x)_p z74U&}_bEnu6Gb8cutk9Buv>HlL8Q%0gAc>`PyZaJFMfjl>W9$N8OfK}KYWhcS3d`) zqJRDwrrhxOcmEarN!fdMFj}Fq!9ie!DUh2&!fEPLV0)$qVHJW+07m*Vm;jUES~>!f z$-`hiU|CrWVEO=T6}E95S=CQ&TZ4fzU_>4u09@yQdV`3sCJMq7pbYQNI9m=zM#eNq zaO~!Co6nMO7Dk>~=AMVKf=nGsU2ApjOgKi50+pnpav>SpqfK7t==A?r{z|WW5kV86 z(b`FnC$jS5*gQT&kS|Hq!mM!j09#ZnN4ELuVHzN-#dQrr!s%2Tym}Od9uk1#@6sYS zFlaN%Ko0OTEpiH#3GO4RdFk1TXNg=oTG~rECxPosx);mbIxnwf)8)Z)a5E(xgw27b z8<5_um}CnIl&-)&A~Y#6&oQ4tnOgIe;?A5oeES&4mVM?H>BF&4r$ZtUIz!BGQuAaE zVsi?`1klH}YmU_>PJr@00JNZF^0^DJrCu_22Ynh_T}D+!<aZ3?#ut9-OH%p5K)9O4#pc0xZjM*FtUVs0Zumb)=zg6N?IAToC? z5*@;eI>!a4`!B*+xPe~4Y|$n_R6iC`ad|ew+nH4p>CLo>^2Q;PD)gYiJ;0*ERiJHy zw$6MZAi{^arjfG;fZTxeTxV6QieMi2|1yl4dwuQLgQ1f1lYjL{OK=aPE_aPTqjD-w zR_=RGpsNLX*R7tXx>TWwq(P68;U61S1rpQKRuAU|XvEk1nL?6)G37AF!2C_8Yc)E` z_~F_FQIcU&npW`f8j54m{AoH^pZOjgj237bN*#F@d@UP!NE)#Nh z25u837ntnOc^C6}4LNpCMWs9Zk)cWH2m)s&zm2DFqJ7(hym|?H{{hMJ=_-)ylmUm| zBDg3HJ>TQ>--?d}JVQ-_c5aQpHUp~`;Gu~>1f23@Hl_& z0siWY^Wxu)8@?SoIs^kDzcSkR`+BV{{d;}6IfF2}N;k*N9=C8`T{QqCZ36_j4GOcSdHn>4 zK;;gF*Q?iD%*A6!-x{v4$Cs&fFe8YcS#) z%1gm@3=cv86gZU_q7a~R3>^20Z=PQK7!Til2SKM`Y7U!wDN0DR zbpwHZTA&ud0kVK%<_@MYrYWRyEv0&DLiHAV4i4$KiL5Us@?Sk=sxvo{9d1JX{=eiwXfF<%~`!!#yx z55zgn(4n9&pd6fW>7jGXC3{0AJ@aP7*{Z#c0O=v4o}U9Rco8a1mEf16L0WshwLOopT0vb4DC;yaNJ<~6Xd1D+2Ptt z6YiC*;qve`9)A9RWBk8wAa5Jmy+rZH4B5rKWHzG^gUt+*_b%I@X1=vF0i5g+yWJo{ zV|1F4jiS7zz;r=yOdy>ikYooSWuR(=?42G%KE;f+0}PYYWKo1@$knjq0E3+q$%-Y9wIM?f|TwN1%7?I;p&boN&J^$v2=3% z_Fw!L-uSnCr5^98R3HZs<%cj^2@omko8FQdL&S&>8`(%>a)*gjAe*%3&%RmGICzd-Y}!3PN$g8Sd__F}XZFJQ1p{ zBAx)23D#O`u`U4fwPv(tThErcjr8axIF1lVg_PH4RW%5vLzy&$*8-IwPUXL>PEiy| zHxk69Hz&Oanjkg7SRC=#gIb$0yeFyPwFNLzRuS$7-!Jee%HSTH0Pc~BBlFH!F`VHg z$Lg?f00Lp*ik^^pqW|LqHX+*4w^wNWU4$hlXk7wSgWxy?68q9>J#+FBT7p04DG?PK zS}|sUhLMutHm_=P0b3^WdaLpp$R5E6!9RKJM(?I@S_`m@>m%glOGt#j63pbh5Rhd{ zEWR9CvNNXL}Z9hvty5dM9R(_9_FYETU7gmbehsv~?DpsR3o=D=BoG-I3rXsLv4J+7}1DM`=6(15k&B7!0jYOTT%S+`8xq^*Wfg(;~^BA*IwsmJGPL#!|C7u2e@Bw`_-?25yb-!H(Y-9GtBa*PY zQA0Je?PkqMY{jtCkL>POOuh=T<=tVxV1mRwcBL&tBM zJNwb5(#Lbr5!^5oRBtob7K%`EU9cEhTy4DDA{*l~@lY(#13qjvcI=vg~IEa^epAu%L|Q|n-bSS1@zqWB?Z*D>mr;SKwXTWd3ikJz7DMR zeGXEIq(?8qy#a7QuWx$gRv&0DS)A8PxSu(~v3PZ^(~IXHZP8;i=eSd!yDIW#sAtTx zmS>>^`Jv#b_Ez24*XMDVN}@I736acY&LSBP5b308^3Vkyd6~73>s;mlwDNchEg#0_ zaM;ra*gnx-egd2CIbXd4w=1AvrFmoT-RxL%_gDWB?b9FN_K$xD-2u!F3#uC#hW-SC zlaoQNf^N}oeX?i+!_eB99Cp*8w@!iI6xut~I{f_=*Ps3ra~S3jxH@iQ2X=#dgUE^U zwCymmEC8>C11)+X@gWPpO8?;F}Kz{z1} z=Iu3$;y9h5HvlweT8Eu6ZNM!#9N_uqsX+i$~CWWe_Nse|iiRY0D6C z$uWrM_YOrMLV6N+$E}P}4c#ahp$HRb@XRSUlzHT1pq|O%VUzA8+i_*l$MgA(jVp@j z7SA7mGC!BkYaYOH;P~8DQJCI&s zh8n{vv#4l}ab*J~BzVctd4OGsIb47+o?_hi3@v!CkW>&^A+$U}b>dZkC;$l)DB%T? zGthmf_5IKE0Is+lIq>dZeG32j4Uz|s)Ix$8oMH4LCjquG-zUQ2i_$2-ol2d>;)cZW zy;S@f06P@r;hZK|)Fy}ZV)?~%Lj%XBh}4eB93E&?)6E^)Pe>0Tfn?07Mb4aVX=)(D zrJ37CjM1@j2{XVS9?cetsx?w%2#{gX^ztm-v-VrHE0o-4hNSUGvgiT}F$bO=&GaVX z2t>j0+l(AbftWKF^guZ6nYWj~QsOKhWa<&n zH*a9S{1T@h{RG>e{3XNyy?Y5$1?F6#Md1;)KA@)1eIp%;06r9u3E#OdGVI8LA!mhd zqfs+=1?&zs3D{hsO&VCq>^`AwqQ!Z+*|lVc`wk0m?lv%NgpM4D@9b37 zK&rHHqGwc_KpU?+!(-fCSZRC~%7WY^=E$61ap#)20gde_bwnE0^yt#1XfE(!&|UF( z9r)(!D^6Kg5XN^oyw~yh=e_cP{?4!870CUL_Y}&*UY#`%LZF03RPpBD(jAwlPYwqy z6ta6Tph<>zxnYx-p!6+J0L5|GY?-tv&vV5x3~>z0Cg@3yK0wgJW2P}yi~N%WgCddB z79dRWx#B7L%u*YlVK%F1WsTPwt?dZvqJK=50YZ9c}KS5szMNFI4;9@ z9`eHCJyAgyR#^4OQ?nQ=VjKw;fCcu}9kav9GT0I*YAQz}^$cJQD3rj6d|tDlPC~KcrIJ-rRd5CNiXCyR^!zL`LY10K^%#q4gpqp(YfQyuIT+W z^UV&P9f`aZZrdO>b%PuGb3!9G>Df%hBl-Y4L45p5-(P-~AkKs00s@>)9jDWVxsOul z84iO);y=8M01vJ?2Zd(lU8bUzIBQ3R{fszQavw0gfYC~(PQWe69GK-71z$PW?hK2& zGIU?EK@gt1dzcMYCC1z(DD!!R=@y}6B=U*5M*)52$!7jrgd~Fx&fU@a3qamN(BQR4 zb4IuiGT=?XrE9CCTq-~u_sFntfQ9T+UEa6?ezwj8B%TjoOEUq)i0if0X3ukwYmh*T z7|s{AvgI|&GkT0RKpV=KF55zK;K*-JAnip;a<;S39zAn7>mB<#F&N&V8^Ht6Z8n#3?dhDnqYV1 zw0VT7K@Z!U3Cnpnx^_rZjcvwUaWjB0V)txu6&75sUO>V2_&jHy#xlzUCe{a;*g~#AyRZ? zsTflKNQOP1RSxsIEZ7isQ%K>I7IT~f02sqcDACK6f(}J7_e%MM-bo4DgvA)TUIj8A5IvOz{D9vV%x(Jr1=z_fF=9ItXup z925)wf8ySCNw(xV5BpZ;-c{XwE;9fK2m&usD5Oy6ha()pko^XJQ$K=V!HSUo$)aoq zDUlLEVsM!m%(--T)y~Z2AM5*8X7xE3f-=J{1m<*CSM8lUb6vi5PmqWbqi`fZ#b6@I zNRn3~@XRUFJpn`ALm0OfA(sNM$084NcnY)hLUwv~2BHUG#1{jonbuDFlZVQ}D^MBk zk7Rm4ULu{7k!Deucx|L1=CQ0*qTwlx{&IjX-Xy?B!{|>a+dXxQJQYCZAjxwGS20e!O4$hHSly~dzeJN0P?lK* zy6mNU$LJT-ZAbdUvVt!)>ZE@@5%T1%>fTheIa*_JjiSb&{C*Z@PRJWGKW#|%T;l)c9LL(K*kp26+bX(7u!?b%fpEw4?QC>{Tlm>4KZeLS%=wd zS7rrfJKP(xEfttLV2IEzf{x7!@Nf_R<{id&@8J)IyMOhsvAy|8$dK!S-k;-I?Fk0Q z@&0RuY4!l5FxcV1evgNL`EO9Zc!l>r|1apj{D^IA&{89%-~c?5C=_B1UXHx+4oCAA zBR~Ntogn=zh(_Yd8wNJ?A&Hbj)98WfpRh& zcToVckAm$|(MQ8kJ08l8GJuN>pc-~B@OxmK18iTPkBlZ{ktRsfJcV$$#91|^h*qdK zJjS47=4cpgptX+S^x}E&Of^G2g*UJ62gc#(&j-K`2BU;wZPkFyfHvSqI4Qh2#=+>< zR)LLExrXC72EKdu997dv_70^`r=uRo%!a@B^@&WHZ_l^B=R*G<<3AwIZYydhkU~m| zU%3H6Py$ZzP0a%)$N(~lvVdNtF%`PJXQ{LeXgzuqtq&gVW&%$zU&$>TK9~r-Fccer zOF4@(2QK#7A{pGBLopjN;RdbS9wMzwQPwvHv&&=6M4R@JTq*)Bw3qyXhn@s&y3;28?&rVth2F|$^&PDTJ*M*M@F<8AhDRKWqQLaGCGh0VX8t7i;-%8b7CG{wNs&zy zJAtaLcUs6eFE^hnzy1na z+oIxobJ!@+H2G&=;`E~*1U-Itfj=5rL3qVk@!I+`bG|uY1W~9rxN*Zf+VJ#3#U{`| zaf6J^pnrlT`uhrYL@r$o{vDB)uvx*jSL~;X?Y;tU9e8ah=M8p>Ji~&}-6)20F`Nh( zZ2+Zj*qFZL2ArkCNHbflc)lF?_#AuHha3fn-16?}5Eu&>bOTQNhUN}+;~GOfZU;Sj zlb)mHQiNnvM^Fa~GL#y7@{CDy03&$CfMeibt2pn$W8Gqn?!Y&X*JxWe7T}kL4kph* zGUWGp{f^K5{{Zg(zL#{+Hko?@qu5f4FI&P+VlP|3$Qo{Ngo_t5BqD_+=ODfGFbmL_ zVJ-1N;!x$!5XkZR(E}|kY=Ijw$c<-+GII9ro6VoyRj?v(JFAHdmNSuWBp`58@B*;) z3y>aB=eoBl=Czy@QY_{pS2js@FgFAq%`HvOphRynruM{e1DbA?BVrFAkGCfv*Lb`c zs>RIjqX(!gy_3XfLua~}LA^B`!*M$8s9s_0?bq49Bf$xCUWVCC?je9^V^B-v3rP_O ze7l5CDEH%f#p&*T?gt#1%eN{ao|^=I2qb!enIs)mztLxKaP%EN7+}O0egcJF<~A8} zX6$kR>!P_nBbm1SIadjBJzl%MkmkAnG1!^2yRtp;H21IOhf_VX(&>YsEtpdO+r zSuK7a{W1-$vPF0v0H8J>qK9b4?A@bHM=%rV(Xvu69i9{}W_9tD0zfnguUmk3OK{g< zC7MB_Gat$cZl;Dx<0kEl9-i-6z@Q+syoShsS6LCC5NKIxL}0cc=i8Fu<)vMLjR55e zwtT(uV$@B~=XyiS>)xtOWL5qA=#&?0h}iRQ^W@WrTmLowr5c}Yt||Ao=$Sb4c^py9 zWR?5tDCG>zRSwczBygVf@{Bj<4`dO^-H!H`e+&Qi1MIHAzq}`nJ)>Q}#`EzV&;b9% zJG}etf57$Wio35jlyM5r)xN`e=%VApZ}IWFzs2Rl2V8&t8&u!W+Z8~AV+#N{B)HWW znfb^xRGVVMEG~-eu6c&?1iF_zo4xGO*x4&En5k?7+ue@sp`w0Sfwu+w!-jIVp`1>D zN2@MFR1UiX$K_yUcEz^uC{}Q^7X3JZD8@D5xc2Nj*vG(g8~E8;Lu@)Ri7oktf*2#QH$%kzHJj zsb=QkX&e*Ns#B~l^t|$L%J~;|(&t`gzvlwkmtdMpY88UbjK17w+Tf zEux&EOl6K=3BY(g8a7V$kaw*BF-H)9w<(+iDF6T<07*naRCWVoqa41#+kiTq7xqPx z1vGQ&RER>wY67$xtp@bgqj%z>^g|&?$WdIg#f+#{t!td#jH<~YHuDlko)aNPqH6v# zmW2BfA-2(DY)(3ZJOFA~R0XXmd`zpBg*R)CM}%WBr;Loqy(#pHX8u(IS}dra>mM8e z#%G$q)l<>0m?MCnT7E=$Zq6U(_gt7xW1XjKY_ zf+s+L+LKgl=X*R~4_sTv%xyeIKyrZ-?Kt8=eg?uOPvl^&Io^8QQ z+K(lMw^^Wt=chc_;n0{vg%M!}9|POAvv>$7`va?g8?u2jW_A6X%7A5G=H!dDn8S)f zc#}ru$x}GnMPH(80pIjW&HLQGDr(*1?QsRRJJjt-HwH!*3C&$t)(y9jO3-6~nus{QSVXZ~iY_pAKyAH?(nO{(3wi!9lbk_?vWct9$0254I7z+d@BI-P2&+Xmr#vjpa-q zDL`R}el_w9sh&UovfuIk@B8Al|1ld-i+5Aod~#uW0Fx_u^CFo7DG_1g=?#?n&`WJJ zQ>lA|n$|h6Q5b@>Mg%U3+2WxJMG$?8Y=S#pqqBO|$T()v7YM`Cvj-|7<+u&^3=z9K z_AO=)s*hkPhNFe`t+pt=kE{lE0Q**N!`#x%I`90QLTo*OEX|*A;LA55G_- zI1)sf1-6i-6EC02GXYg7*pgPrEeMl!Rcaw99$9hg>PZHUVas)?f1EsZM#iB>c9c9n zd4WTLF^sHz@c`8Y$SQ1s*jW4Y5)BrJ00_k+V8>z}BTdC~Gw;eKz{ltT9tXpGCXmK; z*hV1IvF2^X!StA~Ddq{=Fmtks?JRh0@b(eF0jsa6m^?p!BPBe9yw)hjlLD=!N07qe$yO&^>Hlefg$UP+a2A^Zw)tP=>S`hzPTjs5s8 zunKIa*8mIyPf@W6$q7%o%qL#u20h|qG}Qf$Ubq8Lm=zB917$m7wyZT@?b*V49|0pN08V2h0f8w>K?wnKV`JeEo6uGWzyvBOZ52SZv?$JfGt5}tV8YH zw1&kszzYys<`f>~u8AfW<;@)s$8uFJ872E4Qdg5(? zT1u%AX>!BUQ^SYvev5W#czV3x{f7(MrRP}Aqs^SpEc K7gZj8k~-k6{&1d%kU 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�nE=!MiRRsnGOjifF#$3YJm%M5sA8R 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

@m4jB}J{v20>zS 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._Y`k$XpS5V`G(kJw`f{kZLEuy*oWdj*zmENfe z2@l#^9w6kE;cKXI}FSs$ss1&oqXeheXpIY^a zZVe(=wWspjIPR`E=B)aB!Ko1=0g{@U%#|>N%Wm=e+ZzZbLjLR{Df{N$(2p!Im(DA3 zsGf>KK(SzAuUcu^E z-(OxD@BK9Ikj3X$C0|EA+>=sXi5ZLuW_r6qZK0VzCLmkB@Tg&Hht@UCQBWn|^W^9s(z3|r6NQ`731TUHD3$WXpx&a68=@j8ik3+_ z>1@^KJ%n&-b#a>h{r;FOx7Vt#cna4f;nw;nN^XGI1sI;U!pga~P|w2jG#BsRryU?B zw8%%-Cx-soxl3;5R2{~vt)~YL|8@;kih(*VB%$a1ZhWApjgCA;d$wHnP)W3&Z2o{G zhS4$VhEtGi;6sG#`GAL9Nb)|Ws4F)26pXW3pRs{is;;hHgOP>IQ;fc0%~$mp7F2Mr z0VOO0RrWguGTJCg1Nv)zvqsP{|818KP&F5&IXoMT?~h;9eikS<*JoNQkdl_Rwrhzw z*g(PKY=czOoHwxQB#L|Q?%_{Yg>-)}e+`30kb`wC2OE|(Jp#eDNN#Ufh?V*ECAF(x zID77{`1_Ja|6RUk>jfa)>S6YJk=Q&6fSLaoQ{KqnU;i2+K2d}4+Aj{OYWLK|Y&nuj z5eQJ8X0BeqU299^HkXT2sux&0mctW=+>o4xI8q@1V%&Y%$#wOY8Jv`XccZ+41r#L= z?R`ls-7aeB4F_WbfxuI|{kZ_EWe$J(60_TpB2ul?O%K7@+;E|obpDLYt?LbRoudT6 zuD^73?}o-2g55G<`BN6i#*i+{$R#+$2Bx@GSWQQSg%){-?+(%66DAJIXA(+LyMcHN zU=7^9jAmlB%Zn7ewA)Z^F^aRUH8NVo#{+@2_?dm#Ij;5NbrOF2`HCw&flv8)EMK2F zqeCJvDYftokqYD!^Vx8bB5rG3)5We}u@t6-m;uFK{uJiBaFiSB5@DpS`2o_ zfZrqfSP;0fV`Df>lZ?8f7>F4370um)`VM_L2=+v4vmz^Reh1M`s&oAG>FLbNz=>%BVS!H&sccvXFoKx=&#c;mGkuTbn@P z>rqPY2AR7NMYjs}#})T_SChR@SzC!N2-Shk^F zdgjG~&#OuHs&otJwQ*C05akxR%vp+_L$9{HzOQ z0}>S}+j^TBnc8JXqAv z?}Ds_l#~rA9SBrkB7sQHX@<`cLgb=NQhd(+$er#4Jq2#QaLbmoU5?W)n8zX^A)%^` z*W;1T+?_a=eV4T4;rNx!2Xh-lu#E6{mN)zVrm?EBVr;r9hSC=o9xu?+S0N z5ez1_{rSU07X+nE>`6kP$n`-~Ix`k0cd*;?xZGA$H33D?Bnv<0ZJC{Z>6mc z`5-~~0rmE^@RJQjlM7~q>592DO0FJb$~HoA@oLHcxv2nC=J&fzhUqN@0z0ob$`z4} z+2C(@GT=Ud=@C%zZX;h7JhGbspMf6&XM|aDX-07pQc@Yv9rRnv%?!c;Kk+tVI5gYV zlrrS8KHCjsOm6PiTnNi(0aSIlq38$G95Qvh0YEx;S*4RWky}zp{}cs$62*6a^(5iG zP60y7+~@7i|7KqE&ing*pVepGLE=w*a6n?0aK1gs%UKBwUuJ9b z@j?e?nQw0kawL5pKFASV-bqEIzBZ6zPgPU@_SiS{)5f>#{+eqJ!Ul5F{i!m-sn+6 z;fbPUOkKbh;~pF=$!=|*oFjMJiw&<0?Y!jtVI?P$)%y@IA}6lkC^|%S$$yZE9SVdxdn-6heRHbfmZ7R4*{{>P+`6SAdewvO* zYjyNTF14L5-*FWv4JHa}#1*P7>mxYa#T(~aMx_&Q9as(*Wlt?OQza`)n2AryZvea&WgfWY9K zqKU+{0>LB zt?;Vna}*@;rP*Y^O3Gg|;`Uc3v$EXZ`~CNAvSzbgp@T<6#2|HMj~w1+vnby>5`90r zZqpEdWj>23<6K21B04E2d0}7Q1u3i{6nmbqG>d3Kcz>`J)=K?btv$01MJXVXbhe39 z;z{Sxi<>?-H}m{#CklW{%RVzcht{oRZ2i0xZ!2L5uHb^M2-o}TpO-vBWtHpy26&$P1iKr0MB4>itlq#RtUn44a>{bNsq6@Yt@$$ z2_zszn@+j@y@X{50fP;=f7!kAKQp21Q2AwMf)E35iy4?Iie@hgJYs#B4bz=TS)WWx|Yb22hEp{Vq{UM4NJm7;vSCRox} zX3J|(((;Ml^TN=QToHhC7P zu{emzdp}b*hO<3Pe4{1pqAupbtF8J93AlOQcd4D}Vxf}`LI43`ZV~f6FVlqv?xh%x z&$XxRt6t0sX!3N3tQ9jG1C@UMM#==712Ji7+lrgmG6ei^lXaOQ6CvG91EKN2DrQ;t z9%H8pr44ij7>@2xTcM06FSvowDj~*H)!#(aD8sZ?{wvzDDZtN>TGff z9s?CiOii8byC18BbW30U?XiP1H|_$2j0e8Y6CHxXC*JMeB6fX8p|bKo#x8-&`IXy@ zGq(m$_me@(rjL;ehN4Y-)Cuik)RDiNQ&Nq01bntuN+Ll8LjtsGB!I>_^+&Ruin(^0 zD4vE9*Pe|f!K+RGIGtcFZ(6`9aIHVDhTu^3?j)v@z+m$ktw4NcXXf6BY%oHEc+~Rj z<9D0?wEJZkbq>-A7sH13yMsi~OlSN2Nm0UTg)kN&dlFS@crdZyWbRDcQ=-eEF&r!I zfcDoWllei2C%IFu%>6*M#*~i%#K1Tj{a}rThr!O*Z1Oo9d3_X|gw^V=X74M3Fq0OX@@^)Xs;SY^T1UZ|>*hJlx820@x$Q(Kz{O9fQ+{BR3tPZWINmqpC! z{^^1Fqq}}=#dJeBirFY`EZS+jZs1NIfn}TWsVZ#N`>5mb{zPD>V-hZUy3)mwa6Dk; zzGr1jNfOf?4-9jxijyZ?2bw4rgT+=BP66EOqI=i`aQqUyJ6!1;p>dR3$+u|}GCm>u zqbDmuVftgrW-~&|RpK`vP&k1=t$mZXW&W#PwtKy*oc=WHfb(`48QxMLC5 z4AdX(088P>A+nD@G|<-3%aF-Gp)p`p?3KRihRV9Jmd%yni|W7Z2H{g$r~yeWGI4G? zubY;yCbK-~I&kSSL4~?ksNJ{4Dhv4uj!S`$HKF2QS(oDaDg#Q+2<8zX$z{>BgBd!x mq4A~pvwjb)zwdc5vd(K`Fmr^f<=QsX6LMKw*qRps|NIYU!Y^e2 diff --git a/genplus-gx/gx/images/Bg_intro_c2.png b/genplus-gx/gx/images/Bg_intro_c2.png deleted file mode 100644 index ae9e40921f9d2849526f5388aab4d6ac77752617..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17290 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 diff --git a/genplus-gx/gx/images/Bg_intro_c3.png b/genplus-gx/gx/images/Bg_intro_c3.png deleted file mode 100644 index f382e73b0c71f240427d558049dd1b5a5ee29ad1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11446 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 umyc|(&VT={ZgK#ku+CmtHtfpwhuqow4nJ zaD4z_MyE9l;|^nf&p`kFiS{E uNPN&rIHZ2^01yPl$M=UbItssdz{cQspVjlZoQyh94}+(xpUXO@geCwr{XO*n diff --git a/genplus-gx/gx/images/Browser_dir.png b/genplus-gx/gx/images/Browser_dir.png deleted file mode 100644 index e4becfdbd37deb2f438d7991bbed56735ea64eeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^B0wy_!3HG7B;uuk6icy_X9x!n)NrJ90QsB+9+AZi z4BSE>%y{W;-5-$J64!_l=c3falFa-(g^20mQpf@4$A?ubv$FTCGiITF;F=jt@r9Aul`Q8)n zu63_nre+BIS{}XL$g?X4}{qpZT%=2v-HoO&|e4l9GUm;cI*+~ o*BUMX2Sl9=f7JeUXWYjS>tQqRD%*2?U}!RUy85}Sb4q9e02}eKegFUf diff --git a/genplus-gx/gx/images/Button_arrow.png b/genplus-gx/gx/images/Button_arrow.png deleted file mode 100644 index 7ddab41ade56c308ad58a53447fb1e4ad977a63f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3386 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 Q4*&oF07*qoM6N<$f=kwSeEalr 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 A#Q*>R diff --git a/genplus-gx/gx/images/Button_digit_over.png b/genplus-gx/gx/images/Button_digit_over.png deleted file mode 100644 index 20d5a47d81120f6fe629a5a1958a22bf3957f90f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2277 zcmVxm0GEasyv{oRmlaKG!>$Wh*AVff)dfh2DP#j3QkR7d}9JO_MH2^_2Ha7 zbH?Uk9I~aYW6#;M<~#pdd#$yPV~hb{XlMvK_V3^S$C;U#y_YUsx_4n=!7;`V$1z%K z?$$8IptYu{smb*8^vrg3bsal!;K0x9{n61;032gX4es#a!%v?*d-fpEvVHq@`uqE7 zZ*RwOoVx~=9ZD%Gl?rFhoZ-ZY6U1>G?A*EY`PW{1?XMQH2Kf5xukV|fnD||9Z*OkL zjvZ9zC;0UA38rS|DbGscI6_H@Rs72iW1zcJ(B0Y0qr=~4{ifZ#@x~jx`|i7DU|`^v z@4fflO90N`;2?(%9eQSbeEcs10|QQ9Umu@*^cH9SJ@82(1EIn-+QG{z+bW2QH1j&z>iq=k2%OZZ4Hd*Ym@}!>{)B^>ub^C~*AbD31-! zvVLs@sKkhglPjr$MkV)H4X8=&#$Y0h4v?`=5V*LWM`zn2fBHLoduRvO<^x>Uy)QRC zJ-ub?)~$@5K1Nqtg^g>!096GYrC!N{le5v2{E$&8Y^ua9r_9V4bO<`YC=VICgh3VG zcX8c_EgN07-Rp7u*sJvS_cJ#)w!votFIsbWu&dyF|XJ=aqLI{e*BIVhb-tR7e z7MV?uOBAdrnFo`BM1#52rm^|cK2)N(k^y1h<9Pv9Pf+y@t`9*3y_-U&D$vx_gfWJK zlo9|T1Z&rLpjB$n{%8t@Nr1_?+incXXw4|4YDOBBancyfC!ae`ql&kMtcQb?5pfjac_E%J@xny4C;bxD;;KUYd2ghB|j9L}1(O<7+#V9lCtRLV$dHQLA;pw=3tG*X#lho&xF zsdB3WY=|$pM7?^qV@wK{f+<~xORcO3ZWVx*Gt&Un;?M#bv^GiVNYlris+JwO+b_8x z;gTF!-@#fNluE#AZneu-(MGO9!R2`lqcBF-;dJU+wOqlk7%-EZQ#fN3TBVypC*`UJ zsO$0f6)R{Or>Vm!rI6CpTx#QPsfsnwuLdv!ndUmJWtxN)QkgnTn&&L2kd5GX>h9YB zE>{gBQBokKNGn8==Ts)o=~OMNs-4+2cOlJ~`n6Wd1WLsS5fep{D86wLHmNJMuEW`N z_P$yn!1p8kP%UejvdS$T zChK|<*jUupJ5J*oAsgQV6>Mv*l_rc8%>{cF4$(413ZKCD@%#wSS4oR5>H)u!{FaS5 z`?rt@l;b3m6#nXB5deEuDk!ChgJ@>BT^5x5Pc6J82j*gDWQ>RYx=$>c!*SN#EiwfVb z;<_%2)sTg%V$lQFCxMLWN5oj(*|fPZ+u6h-v0e3GY@(Uzs|9x5{|FZ@T%fhJbu!o6 z+xzn9=qM(?k?%aXj^7+w&$T%}fpcXYF08}FV)b*`S;Qppv)A&RJkv)1wzYU+o|%~$ z9LIS%fAQkQPquB_w(rW7D=km`WFP-L^%h4zfbRAxc}LX_)wX4qGE-kyGc%=7s>BnQ zuM|0Xc0Fxti+uCp?=dnmLZMK&E`)e8-_z5>@bK`&@#DvT7)6ouU2&oSZamZEepvj`Nu_ zI5-Hvda^wgdn}`uj%RtjK=(+(z*I^h2 zD5GGEp)h>(@e_vA&+l%x23DRtu0dFVF1MJyOoQYZh80d!-ebi)e!JBoJUX!=^OXv2 zf>N`(>({Zps1${CTTT={CYDX*E~tR`r)A!n_NSDAQVQMBK@9_{n!&w`7BX3uWqRhy zXh2m}=(+}7(_ql7NmEL*#WCA~%8QtBCT_OP>_TVE(zf)q)jSo~+P25e|2-ep{0C;0 zmt`M&EM9Hk?!!#AIQC)IzLuU`J|@0A4z?W3vX7I4<&`UHX8CE$VB^56nRC22`>?4E z*7!CK&h2h|Yz=ch2On!(3s3X0bJ0VNr<-mWFRnR~HH;&^nVZ`_UV7kAGx2fH!6vs5 z22c+^a2ZQ4J(xSQsUFrGHm;7eT%9-v)8Q+edB~{S9QHpa?eocP9!@nF7$Y!^t}TbX zzfHF+7lVOO3T7C1W#3CouB@y?Rdo#l!4M4H0HqX^8lcnwqYMnpDH6woH+%>j2jte(4ANwhuBL;_|**Wmc!IIl5T2pdMo%YzS<7cnU z8q!Q+DmRClKZADT#@B;|PYHUkPY`bdD8ZnaHHTwz+8LIh2dgw}TDKA`osT(3fjYVQ z+;UjrJ9W#~y^G%5<{|Tr>#21weOq#X!_7L@Q~mhkH`U)-TXuH}s_QTqgDlICWmzT_ z;V=LKLuPsM%yfC95HZFhWGYs?FQxr(NoP8qDIV=$Z;m-mB0s?m$1dE#HDOx7eEd>IBzPYoj1Ck^a-cLY4 zKtN#HkXs|SwXCknWHP-{MMcGtS=FKCvK&A_l59601Ox;G1a21?0E05LwzMoC92`6< zH#RmNN~cmkudEDRQ`O88P1hkjT41`-P+N^1k34|ZmSzw_plKRXsT6cw2V>b!RWZi$ z|E3d!5XTb|k|ZG*41#3usN>?*J{&swF^0xt(^`wb=NycIPX zWB{nDs`}BQdGv=@ua6{xa-haA453AV+k&3!19;`NpJ4O-ZTRYwkE5xn2|(5;4a0z< zD9|)5Z<^&=O`BKEk|ZH_4@OZG=(>)<;ZeN(&LLdt=`Z`!t^xu)FfgPQW#SK?`SN|e zJw1PM;=~C?Cf`DmYuEZF&UFueJTM&D8Be5;Rx*U{WtOE{`Yb2N}qe3ci{(B{LDi~ zjw0%`YoD8sTPKH4k@~jJ-P`v`Liako^}wr>f>DZw+Iv2D{gpp^@WmJRG{oa^Dgyu^ zgaw1)KW$w(?@wY0^@gVDi!&Jw=IZ(ddpPXSA z`{a@N1jQJGuIm5*UDpwb#_;C;U*gzr&%k_A6A-u^V2mM^N=IJ*%O5oN^z{Du(W6Hx z01(C)Iy*l_N5>{yzt%U@doy;b``XaW>!oq38lbDLj_Kl8Y(D#QvppWPmN zCa<8)@vAB;@YJ@gczXL6Ek$VcW%XO7zSeT1l~P(1Roqe2Hl{=uQ+|_ zmNRxG=s~QY3(rFbhr3_}%@~E6RyOs&-u--&qA0AhvomYZISdaE?}*0} z|Ng&SzZ)JKkFJd;)1Z_IgEseb5r%`0Flg>1E`?83Wf)Iy--@TVZ!OBGdB&V;#}i4s zd+;#c|L_>pjP4viuR4W6bB}F4t1##SdN9{Hxmd_(XMXk%f3y11rAxbZ?%a8B7?EDnX&COSpbaGWqb$CJlP&7aYs&rl4Fci46&~zQ=E?&i9mNm-`QLEvVmFLwdOAcvz%L?^X!lQE`)h+R_TP^_ z`sf>NZEg7Mv(M1f)HG$#3l=N@094o1e4uC2-wnxu8URk6I*AP%?n7i^;^9;}`Ll~X!?8=fL(5fFtxKg9cN2VPu+5I zm7oV<(1qurgTo9p=+W`B-%IJhq1A-?a5^7$G!cdfeSsujjF2DC({ZHoo3%odJ!u^80ObP#2f=H4El3# z&^Zq4*Q~_zyS@a*7~b6fKDsVl<#H=l4{pcV($iD7oLnX7K^S!5dFbFU!wi}+U}SJ$ z;K}We-F)eryPJA?diH!}*Ej!b;o>@UojZ$l>sw(4*PsEQv$GQ&9UVx-V-G}QvA6pN zBNOMY4AiC-b(x~5P}EGGhcIYi&|E&8Nn92_CFnsIv`;?5psiZ>;!}h{1KFoFqOo}2 z-mia^J-hAk)W!4X_wIZ7<&Od2d{-CNu3HB?WXG0CbaZs!()lx3y|(Q)ghW%+Mw zD#ME}_6~IqkHr>Al2nmalmKtMpi0YV5ErAVtvx}mQ2#w*|78{E{scI5oI z^Dpgt`Q?)U(A(Y3HD|!XpaEd@+BRJ1I)j#VZD#_qyhoPh=PN4Y?_a$h9_#zvSeOBg zj2ci>4F;tk!l?xW1O)P5z?Fz6KtM)!Jn~TDgOIILRt;$y25Adm}D+t+H*n*gLdIlf*yoH z`{W}G+NyOIK7^1-JI;O>Di9z_-K<#^^XD}7?b-bY#{9;{$dW}1-cBZx@3n8-co8L{ zXoJq7>+ET)Yi$PrDCyL~Xe{=0Jdu1(f~0ld7-<`wNX(mvB}bAewVF~|MGYf+LlFRD zlV3_R6AjvRa+u@T_POf}8jfv#>g47#rI-l@?Z<4&YG}T6%gNB(+!$2sG0^Xqs8y3u2xnqzjw~6WlL^8^o5R_%N8#jZ)~XlPcU|%dG(t9 z+-}jaQPegxqF9t{&^h#WU%;}JE&1O^MuwlzH0?<>qs<+UBwC}f^qTQlDmgS38;>QF zTE=KY?p7ip$lh2afLYDcVbD&4fvJ7_4B9$5O?-JA3Qa7(hGviLGBFB`J2#&xUU3Eu z&h{et6rl&}F|g)vYNG^$w&n0PXt?yV>eMechw(Y`S;yUzk1eiOoyD)9UB<$m*QN*V z@o|}l_E_$EFxTYNZ8iskK`AmBEqmEk(?E4&Z2r7Ck=8Y<8doe?9GcfSySuGrbyvge z+Cj$f{;Jh$J~V|!A~KGey4ffdw`|a6oH>08ZSC2ciMp1VolYe;7>2$inNnAbM-v;8 zY2|)3qa&Tt#uG{=rKlQHR4r^6MvXyf4P&e^KTu9D;Z8_baarbLVFTdDvu}1;+vJVU zX)69&9R;G=Z~3Vkzwa(;oxrt zZHASOZNBC@5a;+=kB?)E?-RCp+$ADKq=1wT$#Q)5?7H}ZxpSpCjrFtYX3eUv3WrI3 zeeH?m_bxu&P+!}VR+PT9s-0ZAbm@35RPWVpEL-9JWJWP4t3kVh(Xg&(8o+2}G!}19 zrIZzlnwhWbdW&u_$)Lt&%9zY3tC}1o-tZThvrM&@A*VZsau#W^I3GPr>ByN_eq$8_ z=e#dNQjeX=Mxt;aH-jo?u3L-labLAt@qbw856u`)1d9Lw002ovPDHLkV1fsI`TPI? diff --git a/genplus-gx/gx/images/Button_down_over.png b/genplus-gx/gx/images/Button_down_over.png deleted file mode 100644 index 22860db3c7c0237fc9b84c14bb5d1d0fb8b40a54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4287 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 diff --git a/genplus-gx/gx/images/Button_icon.png b/genplus-gx/gx/images/Button_icon.png deleted file mode 100644 index bb89bf530ec7216aacc882c480165cf62855a8f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7741 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 diff --git a/genplus-gx/gx/images/Button_icon_sm.png b/genplus-gx/gx/images/Button_icon_sm.png deleted file mode 100644 index 307580db0860da764445ff48329e3197f957d0dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4985 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 DIqqIB diff --git a/genplus-gx/gx/images/Button_icon_sm_over.png b/genplus-gx/gx/images/Button_icon_sm_over.png deleted file mode 100644 index 934bac8603bfb8c2c34b15dd50d3eeb85ca87712..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4914 zcmV-26V2?2P)001-y1^@s64LCD+00004b3#c}2nYxW zd3LqMlrmpR8Iw|)o#iJ)`|D{dNe(AM*aF#2A%uvug_cs05<;}ZVzE611qJH{4H~rM z!3Q6F^>mg+d|U#qTD5A(>eZ{ieDL7GYkl7ztdz=^QlgX;QYw^^_`Z*nlHh-J@Hx#ymn zP*+#?@5yBHQlJ-LC@BG-9)%uNebV&p?J=O-qq2`fMX5(T<^d-sU=Cdc(VjG|3E1+k z;GOpkcD--Vun+b(g6nyBo`>i8N-1?D7K^ac#4`~2@3Pmpd8R{d-BlAr@2+JYJ=qM_au%d5h#iaG`&lpN8zayHHR|+t-(%1 zQ!Chx!1Dz{Xi5qd6Gkeg*JuK-F(9Lo60IeNTLnvBiSa^hocH!A?Rq}0>or=I_03_! zhW+m|&phLQnEXE!0pEP{%>m1oFaKdOnf!ufSw?Z8X6on!V}~WM3_C+S={u}@%jM-- zmn}Oznp=EaPf=FZmx_uCwAPfCmQqkq!0z3_J>8UU>|+qP|^wY8PJ zxTdV9;{2hSE2b(gtXAY(ff_2UXl@bwepQU8R>nBcDDgaBYONO(7Z=~YdGqGf$?`oZ z0c&e(tJkhw`%B;VC&o;}7*yeK)kUqu%@pWB_1@W&X3;X2b#J-!>{ZI-$x|3QbO<#y zHB?qsot|$fhc3bT_3PQTZ7X$k>sY&XErxDk<^;)Cu7aWcHBu_1lpJbS{KvxuyuQ`I z^L?e1s`GvS#zTh=Z9mcdPe{Pp+S&)%QryapO+=mykpEKub#tFTM04i+=kXwrt+O^cu~b*D3~8N_=0Euob_0 z-r|Yp;@FPTQmSp~bo#2cwzlK?g~ugeZEfwOy1Kd-EXyj7$9!f@Xk%z)8|XBNq|FPf z)4ceq&4`gT+;r2;^y}B}j8!~`?g6C~zVGAvK5N#j;of`a(XeYfw|_zMl{pf_P+9s-c+8FPlKokMqlQVP%W+Q)PyT5Epsi=Q)p{sT-I)y5C+R21b)d|y$w z)#T0xO7MI%Q0F+#mlBD@F-mw00UH||dn{VCXq9DIhm@%%EbIV&nC3)}tB=di5 z(|^zyzV@}RQB+iPw(6ckH-MBfqkzHSbU?(0h6b*`{!0{zclge&icy0#t_QEaY4QCh zi)cw0T4|OwH8owCeNQ9%z~aS=f2fqI5dtx3M3QsMlb{@S?{j!$vBP=iU&!5e-<>1h zUm3L4nUsCJs;Y|L{qAY}_-JnVo~EIFZe+@6j~lPD5ds0sE-fv6DEq!02)Jz7vWuIW zn{PHv!x%d>!FlHfK40^ZG(TDBFmTuu=FXja=4zQkw?${f3zJfc!ongR`{iS3t3Nl) zgS{UF*Ij;r%j_v>07D2dx45`?bo4$Q2v}EF_tUs#nWa5EE*RN{&^B!eo5z=?=|6BZ zx7>2;8Leav-5Vz(VNr1po_gvjeDfT>^)NUdh`nTYnI@EMrim!#QOsP&T{vq*+;)=BAr& zrZDI8{nev05{Bdpν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 diff --git a/genplus-gx/gx/images/Button_save_over.png b/genplus-gx/gx/images/Button_save_over.png deleted file mode 100644 index 7d1d50012b11ab13a4ec967ab4b05398fbe94a90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4618 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 diff --git a/genplus-gx/gx/images/Button_sm_yellow.png b/genplus-gx/gx/images/Button_sm_yellow.png deleted file mode 100644 index 68cc1eae2e92b7e3d1a4ff2f48cde53a70aaa969..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2838 zcmV+x3+eQUP)iOA*NbI;pz&el8}(_zg^XBR9{~ofk1%9#ztyu zYdL=WIOootv&WAg-#T;V%pWaYy!eni_FC+&2~?6KR>0_r9xsKqD|;FD@=#I(qbI z=FFLMN9~UTB?r5y-u*T;pMFMD>m_=6HFRCaJHo=3Kb&b(@1yLICESzg!?G-d5QIV@ z)~{dB-o1P6`Sa&5+OlQKF1P|U3e<&JSXj6;H#e7g^X8GBo__mQdkb~B+fUWsx6yGy zCojvOC^t-TzREp!DPXB|UDViLqp|yAmAa-7a~|}v{x@%ul6p6WVGsxec=gp+*}i?d z{m?@X&3xybcMkOfDoGOS)~%Z%Nz#G5ygX^qqD6Ns%!41kMMF~$#RVqQCIm@M41g(v z?ZCuR!FGC6XtcB|{Nb%I2Wmn*|IAOA`|V$%>pF&EuyW-}8X6ju=H})Ua9kSa{-e&$ z&i6AjGo|wK@;eshySrZE{6&=obCQ@RR_2c!IWnWLu#gcW zM%?ryZ**E1YUZ%Nf!_1g5<4a94_EOmcFvU$He8_=lh8&<~5Ug;2sFoY*DyC2{3F7?(PsZVJbl zhG9mX=>k=Cm@*!Y9j`^#b#z@PFE5Y2zCN$VG|l9+w6rgrSnL5{s7MG6!-^+6Js2sA zw3zZp@1K|~4J;K)C>Xkmrs-&!iK>IDfu@6IM0yLkT9p*|uY7iUOva$+ZC)-GypkTPi}A(X}wDs-tKoiVBMAIMM~HM!;r_fD7Fw zLI{KqWMyR`NfI8%*2e8#`z?`a>I6d}u*B6sUB}u^c_a*la5#*t7^s>Rb)>5G@7=IB zO|Wqae9N-1EDPJV9iW<~ec|MWnmYmV$9)Ys6hhZ+65|H~)gpzvlYlf$MNtKE*hW^J zu+|MQ#1)V(WZi)F3y_r&ABEY~)dhejF)>kTZ*NbwZTqU)(uFt_VFDy1rl5p-X!R#j zlouP`I<}=pPC+V$p`vO6RkP6yC(OgD15cO^)YvSq8_?1Y`8gvHLSULEe!m}|&v!Y_ zG|leT)>Z<6K-9jbXL4o+ zl$~By9LQl66b+jF@Rg$CXqInjX(2T=wL8w^@qCb!l*EAp2cjFS3(&oeg=$&W?Pm0) z^lV&xxah;-GDUn>LispdqlOY&}%YE?PLHK&fC^9m~Aj>lK_4O!)sJ zE?juAsj11kbLUR-^Ya0x?i~0uUy>x^;^LycJ1({#jH)@blOM16HCxviOdh8q4Ci^K zFzx7`=+>C3P84uRfxeIfQq@5S__Ps@HcGs(@kNFWOGZ%?wr<^u$Kz>fYHAwq0m#eC z+aQE^Y15`nY~H*%3e&Qzs}hq7R+6OXxN9Y}!K8^L^I80zDt@))Fuz|V7?&duA_7xf z$>8oD8e1Oe!uc(%I-y?E2#X$nl=%1rLZJ|+PMvZS(h`VyVqacf9z1jAOxm;0K1*3y zS--tCQOJ<-@^Hne4Gj&; z>gwuPxNsrvThQ2A)Gec2mkvds*OI#)!!S@31zDC+6a__5IC0_x)z#H_JRT(_CFPrb zzyC1Y;6sP#kCMcyRjXDXJa}+(Fc^$iRh5d03g*t8OIli56sB934poN^lx^GnfU2sB zEXy=BG;sLvVLCcGC@wDEUteE;^Pl2GZ#W-| diff --git a/genplus-gx/gx/images/Button_special.png b/genplus-gx/gx/images/Button_special.png deleted file mode 100644 index 0ef9c75a90bf102d82badd98ae94eca700c9418e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4759 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 diff --git a/genplus-gx/gx/images/Button_special_over.png b/genplus-gx/gx/images/Button_special_over.png deleted file mode 100644 index fe7d7298e4006c35bf93780ce166c101caec34ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4806 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 diff --git a/genplus-gx/gx/images/Button_text_over.png b/genplus-gx/gx/images/Button_text_over.png deleted file mode 100644 index 1e6ad5b3821cbba7bbbd7bbfcd3313e89ccff188..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2855 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 IM6N<$g0U>1*Z=?k diff --git a/genplus-gx/gx/images/Button_up_over.png b/genplus-gx/gx/images/Button_up_over.png deleted file mode 100644 index df777b2f7730c6f3d2038893ca6028c65e8e6f83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4136 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 OIsn%*y-}v)9Q8kVne#vZ diff --git a/genplus-gx/gx/images/CD_access_off.png b/genplus-gx/gx/images/CD_access_off.png deleted file mode 100644 index d7e5f7930837af3302de5227b9a8ff09910d9e89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 877 zcmV-z1CsoSP)4kf_7p{FEkn?^#d7r#*&ItfJJ3DG{a8T*G z-WAutz<}D?+EM`8#>R#!7KCc(!2bSz&d$y_JUqm4oREKYb(QDmXC59NLcW!i6)el5R;z`4dwYB2^LZ@G0)iu( zOeT?1QY;ojc?$~*EG;ehYhQrlIOzIkLp-u(vx#L{9g7FhG!5If{oMBX*L59D(|(!f z74NORSWVMtG#Y_iub!`bJ?#Om>yk>Ph{xk7rKnb`oS&cjMI{mm5{X2BP$|XD%?FcXvA$BZMH6$pp4D(=;&*gL=JACX)$q zLF+qOUtbUSUSD4Wvka|q&E;}9j>GKitluSQb?5r}8r!x5IUxa>rg49Nk5YVJv1w>Qe=GU;^sa}(&c-)X}z{NL%HfyX4w6{#}N00000NkvXXu0mjf D5<-ZF diff --git a/genplus-gx/gx/images/CD_access_on.png b/genplus-gx/gx/images/CD_access_on.png deleted file mode 100644 index 3dbaa1b0fd7ff894f620dc541c15d43975c8e875..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1812 zcmV+v2kZEWP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ?nn^@KRCwAFN(|mc@?`=~Xanup5x&g1GF{78_GHMAnkIT3hh}8WBh9YJP~&hHhB`iDXqu8Pant zQzNUPla1=357shlBISt}DXWA?+hxR<)`kpC#JZK-WJYeNU62eJfou|TL7j+CKAMKt zKW)RW>-D~Ww)?G~8gCf}_sx7965t1_BBo+0!S> z^|#MQf3H4Wm%q9eK_gHmO286xC^3H&1V-Q_AqNGCfTTlo8KeSBv67)oR$1ssHZmS# zMOH8gGLfJMFfr0_6DrP54fmvlF#*+}$QaTo6l95IQY2RM+rO-R=CJ`LLj;oMCV-;E zC|74mA*mQf(3vO_MzEsNTr8||OrYemGUL-O$Sa&&owH4nI5qQj?!3qau$sgTvOqxe$Aqt zaeusIa5%^5NUmwcb#*Ls;Nf_n%Nc%0R=B-f13>|*tgjIWL?{W8B6xo~@X>fcfa}0z zBq|+|GrNsM8C1@GBtg*dFC^46@k|n0MQKg|q5w~r@qE|wlvN%!pj5g@ju3ZhPYH1v zjZ-yhiW12SI_CSUW8NGu`KzB1BQXS$wmE{^$h9QZdALEr((#*?-3^~C~a*ig_;FD}=A|ElSQyebUAZL27gGjFVF z<=8409`p$(wdXu0dV}lMv709DbSr4is`e~Z*-isXiFK{W;pzSc=RVL?WA6i$eP$$Q1thl;#95F9FIqT;#kaB_VOhKxQ1S zth^`b2ud6nGuR_SL79A3y@W}PeI)x3lg-BHK$93EapoGJKo&9@rrBqj<+(j<)9-gS zGg>xN+oBMB-T)|tLKMoJWzZZkC?J?4&TNG3N_AQ$ErWxC3v>1s>?}ECGDz%l4sIjP zA)QGOz-03qA;Yf<|9^)z6_D{6$$zHlwYr`BHyRP$3J_+D2Q|>ql>I46eiS^yZiytpi)p^XjH~LqcI8;==>O^ zo=M7OQW%p>q?8z=k*(R7QE*?8$$f8a;>S}w`Oe&#vuDrw-gE9f_uLD>)YOy=g+fvY z(Ga7(yN+nnER#(gB_4Sp%@fDuW%uy^B zSzcadaBvV!2qBM;kBLMgK9ZlB06;#UXK`^60T78qXf*Wn^Z-;6XhgKMv;fdl&*1+4 zo|TmqpT4cFjrH|)PEJlZJw5f6%l!O2mSvI6W_`Y+qoZWAS&GG??_XbEAEs%twzftz z8f9i?2B_5g?(QyzVPF`B&#&$dl*?r_O;e)^*L5ir3Q8x0@C;4Ua2%&5r|Y^NuDA1r z!(m27M!3DbC6!9yx-LgYM?|AhOw+9CS9b@hhj?LOfmkdC!1eVto12@S1D;4EXl-p( ze!8wxDwT-EV$9CYDz3S?IVJ15u2xt|$@ccP;xkQ?uC6Y2c6LZ6lNg3kH~4oGczk@s zwr$SN⁡CfI^{wZQGQ~WgN%Bwryz$70Q>vbMtE($EHa0xn=hF#PF)%Q|^z^hx*WKMsCX)eRa&pph4oanxk`E3J>hdO&NoDIe z4&iY4qflz%!vp{>E-nCAU0ubpEFK;n2nK@y?CtG&Z2SBBm3)4F4phoyXlTfnKy{~} zvg-c=O$Z?`FE7&WNx00hRz z$A29j9@5d#L1$+tfk5Ef0mIZp3}bpMS=t~v8V_D P00000NkvXXu0mjfy(D^* diff --git a/genplus-gx/gx/images/CD_ready_on.png b/genplus-gx/gx/images/CD_ready_on.png deleted file mode 100644 index c4865963e1cb74a5d7726dbaf22b9cd10ab21106..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1858 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 CJutM3Q?;QQWw5csKo z^>aUe?Y_qjzM}B+xpR&u_CLYW!Xh>|WVyv_7~*R!WNSPhpxCPuD*(f6AX^A#yBxXY{)Q0QX6d3;8mb(Q%VT}rk1`n&Q7REs)H3* zAeI{l+mlFORVYgx+QbMna)*xv6H~3_x!IYS<>lpNk_7G%w^z(=cn#d?bOhjse&~lf z*S+lO+j7?|LR8ei&OLkByJr{8rlXm+Xf-F0EJIol8xRyiHZ6vl+Zs=DyT+{ zvk3~T5fo1&Vps&SOos9mQiUENvyN`pkGZ0(_jfM)-9PxF4;D*Ho3=D3Ie*VN9GaQs(MKL+uDisxu`Ow_?F?!HvDaA82vS+C z43U09QjHpCA4EtTu&F^OK}QJOks-_in$%|_!wRY~LboVsHZr>H_Lh*_w{%qx0}nFn zIvO%L_1#GO4?g*h1N$HU+YdglkKjvo?B2$UF258hm19SbVhe|9C0$*+igP)^`=s(` zg2qTFJpmAB;WUbN)u{1Ygs$)LmDa>oQ|AL!q|q2i_Z7gS>cKfeo?5SDB7~r+rZf=| zp<667HMvQzxb)(3)6``7jJo4MwSmvQlh7jSsyAZ75W44xX)XRE!ARzpBhF+`DCd#-VoV{NuRh#wHELlRg4 zi)ogKDT!KOaiERL+mu@F8e?fR#%Qz}2S58~fAV=!G4~A)n2u@y0&ULOG5uRbd+~4H z@VXlwn3x==U6zzyIsc-Ix%7pXk>^dMA0H_wD;RBKhC;G?D4*sWoby=1Z> zi@=?XZgK!r1h%xe>E@d+|JDEJ*DiVZvB$|h`RsYQ|88Lya2GW2l02Lb1X71Rzb9WJo<$I4DI`Gh`X3;0`YhQiC zkN(S_{;A79_`VyzxoO)JvkMFCKXi!m&pn@OU-}AK%`u`Xh(#shU4b|-KA;l728>A^ z+B8C}Yhu+nOA$4$*Eht8;HSU+z{9Wp{4HO)VsUPXX66`g~g%K!bEd+vV-pXF?s-o;C=xfbijc=mgRG%x7_;pzK6fKW{7o(e*RT=Oy}#~Y|G5rim#C=rzind?6iVvJRk zil77au4~jdyC5TdFGCpRHxf zt_wZC-2U)YS6}nbXBHNA7OG@o&=845pj3mJswYxZY-w>m$CatPwdu{RszxudMC|(3 z5;ba^9Z>vQ3M;9dO3#RuW$Q~#l^Gf`R8yDG;reod4-t)#*PxETjq zFbPftT!TQs)*`sZS&4p@!Z3!ypGSNjEtCotq8N&*e^~E9V2uz}**rGB+_K@0`|kP1 zKGqwshO&~3kL^aM)3Lku?)|`zeDuR__|YHz_;3KXYSkg-}kkFA=VMuInz4e z#+bVK_S=8;w|?`tZ@B4}o0yxOWqQjNUUbD396fTF?>zP}MJF;j-XNA?csytOnt2Q* zUIK_}8RO6gVqkPtOaEqCG-gm@prxxj1lf%^}V_QGN(KRma> zO6l;ig*8obm$TgMGJ9g4vh-LoFoFp})+x!l1=210qxnkjPe-Wx1J^jap;Wc3tdK>) z^g4~M38n0BU*;$cpou4=L!^UJRH`&6MNzV4^H%?=>#jYvch}BGtHXqW*U&oHbUK|T zP+s=J7yZIdeEdg$>SG`M=;K?qO>u1Y7`Na4Rq{s8buYi3@yQHNiS#%>LNm`qv0Ay5 z>R9L+&sS{J8!3HBj~M+`C_<*-Y(^t*(8#jIKl$|UeD>B`zjSb5vvme6ND{aNII{oY z|82VSe|rAj9VePDL)GJQ%dVX}*?Z1j8hMl8A@rpz)O%%j7Xf#v!m#zsFtx==K zdI%s{Mi7IDK?%&yFHF7ZZSQ~Q8{YJ`8(3xhpbvP}58P}v1As{O+kf%7|NY*te*Npr z96HLj@l9NG!NtrRo8j?;_t9Bu(`;lZ`PdjV%ZP-&Mco)d#DG@rrCR#dsBu!HGCC=p zFb1L1^^CO~omkpi@A&GLEt8YhT5CcGYXdpxy_-(;pGTj3>Pug^?Uwfa-+6>+GV<{j z=bUpcrB@z%^idX;yQumC1T zYU_kQK6{iqzVEN^Qy~89xF$xQ{`B#jU|BepA&cAecxyP@=LeA_KRP=$sb>w9Up78*s)_52M!!! z_ShWrOI@0oBlgmaDsmPKl&}+UDj0gj8o zI6{mbmkA5=N4e=M^IJDhjb9Di#VTnBi`oq*^zVD*(dkeB&rgqi8Seb%H}SFH#V@*&t<#%{ zmAiTH;nJH*@@Ii@reg4Sd9pQXJkMaNWQLu4_xjG_u?LSe?{RDZ03ZNKL_t&^dFpXi zeZXrYu~ITa&y95M-o5|lNB-8|_@NK3|HNhT3YU}K>rpoK!_P-jy&LRLeMjY$dp&CK!C6OZz_<1^FSw`{$^T6>jLz)jzlc8bJGwd%ymzU;nSa^)nBA`(c#G^tN5REcCgsL!rHG&c;d`Y9(EXxoN9XxjMNJx(0 z4P&8Qv)OC|T>H{%U;l$24NJG)a%=v-Kl>Ni%=`(t@4kDu@Z3w-x@{+mD@!T&x0%=e z-5SqxJPj!&5R0m?U7iuF#cL#zq^Ln~WJH9?$%&bV?!MzDpabaG*qE%Wtn_*W53hlH zyODnQM?U`MUFV9mYB5F;m!AH$c*!b%%s49(QXyGD)YEut!71=EDML3N#VP%sS;BdB(9 z>d0vJ6Z)+YeDoM;aANkv)S;~Ls_omhELdwF8VIM{xUl>E4?p~#-~WUE{=?tA^G>iSZ`Zr63Ri0s*BM4lUF4WT}&pYMjkTu?`iBdL290r5X%F zJ>b%g5!2U)1&Be35uyZIt(+njdidDU6Cs3=X@ouWRp^GZx4-UHujTqzz8+_CmgiS^ z?1@KdFE2ATK8baKpd|zck_u28EJB_}70~DjG4|uUYScJep;3ois%jx-ii)Bpy$>OE zL`cC+(jeey6X})12%)MCt)4B@+dJp&-1?>a?)=JUd&3XB4-ISpI-L%&X#e)#{+sW+ z>SI6h5B`s>Tei;6F3z*>kw@6JZ5yw=_BzJ$aiT(57V9Tg4PAs(p|Yfwz%|ZZsA?4! z$q=0+2&SxFev}9nC_EY>MuZkZqbiZnXb8qAS(agh?$N`C=XdYk-E1@(YvuaTzy_e% zY;w*;mo|?aJ8{(m_dl>VM9ng1Q3H!bhsC8uyp~8*tgI>LHBjhI5kj4WRO9)8jc)RF zDfa`rgeu90v9A;QsyR{qnE= z=ik2T?t3^sJInT|tz2~B3pjM(5c?1BXMSac%@dmt8P1bZABIvdOdUm8qsDqDNS=&X zNQtPTWPqZoc&~_*SPMqG;gQE5XL{=<*KW6aF;gQS4XXq`c69Fe?ChWAt=3z!%(+4X z-NI9Z6=I>7(h#~rG#w!J^MEDK`_UT>GjN1j4A(eIA(A?goUFF&x`ciKEfw+%j7wcj z1Y$@XP8tnIi~&^Q!m-0QEicSHb#%WgSsx4CGim_?Q~1dHZaj3$=l|FHf9fZG{HJ#A zIcH^Qah{_`4szi|mvG(n*RyHMw$vBNWQffvGa=@np@RfLtih{b#2^AT+o&o*jT&bm z6x3>8C(g1Fs%YN?Rf)N(q>iH+XD`X*3amZo7*$C1bfV)*1(6z&L^lWVu$$aFcqST0>-1^U)eL z&JL&!)UxS8=r{OQhWj0)oxn5&<2<5mgyC!-smklLyFum_i@naZ-u$+AyyH#7M_B*f zSE1)umd^k6-~8>*-*?}GjYBhs$W4QySmf(>-%9Y2`Gw=O8sl{0GLYIps9K5uY9ksV z8X=m9GeS`UO=?xT#@UCH#5?!@92KxQw7y)E3?bmXk~bQxtSoWUZMVsuUE6nv$er_+o40Ja z?ukQ>HGH>AZf&YiSq6}ZiV})|ix8ydZjBnJ1Md}U1#5+}SmA;TFW|BlUh>#2U;N8E zRP|(?8MG&X&4+G$Z}H)GzwcI{@gz(F)4(oZ7TD2-E%(eEJ@|b$e&78j>Qgs!GkNzLpQ1f8oXKnw~y%_~8B%B4Si^1X^e`um9o%-oMVIVeUYswE9XqyRO{`Id@SdnHft8{t=7AHyG2pOsxe5)+ zm@M2;EuLgjSDTULz1Wgo*R|vuu2JKx!6*$=K}}Lc1t^Nah$aPbsLxRE5brS9p`rlR zCPCP0Hkh9|%EONzy0p1<&+EMRuz~c20VCGH)FP?aFU zY6D_YXjw%1?xSA#=hJD$Sfj>s3IgKgq)Gjfd&EQ(B@ARE!D=ClvJ6a4Of652nTMyE zEIgL-fQRyh2FKipz$Gb}7!sM6NJV0;HKs6tNUsR)fGOM;^lHi08gz{sYtT18HSriq zB33|rN@kd7l-}#k$fiA;@T_^k3)sL?>3aplVE?CvSF~*iCWYQoYD1K;9 zm53T88Zfmnt457A5Wr)wSaF1)s2H-`64YRVQgn;WZ+-WBucNzs?6aT!{Ozm?)*jYJ zVgXeCrolCE2WXQd@B*+XA|4S6?GUwBj-aOo2x}s}YScK3F_?;U8k_fhz#c~=SD_(7 zF5rlS&_%>CKR4HU;5++XxX>{#6OmDQ!2Mv3b<0yt=oQc^Nn*T9MP_R?s+1UHbrG%( zBL*KLvE$Riw^pHRoUN#AJ!!dU5Cv08>dXKeq~1rgP&61s8boqBM7&USYe*w@x{GYt zx{b>&zj9fW?~DlI7#cn01CN-aZh)-S>{uI7jeU|jGE`G0gUd6Fv8&z6Yt%T)kYuPq zX`q;t#E%l467uSm4Ki3jBba3PRSiT+Y*pDt2Szr=uzl;6r9+S0`xjri`LlPhF?m;G zp_^wgd5>9+6*JY-pG4G1<_u$#6G$T?#Dbc^HO^L44Cwz~Z7QiV_*%D*6U0P%^mmoR zwTEVv**7ycOV%3Se%=KaZe=))P*~fYaKzlq1}}i|+}ZP01BMJOgj^v=i4gID6iyNX z;w-4HdBW7F@jOPK2*dOj5kyj9cPoa4xy6aaPVu^PFSy|QBpH?l$vgNyY=!>dNB-{n z4;?-9A8eyJGrf5_oU>~;F^DY8oghRF*~Iwf*`voV7nD+$F)d4*Nc4e}jU;APaS685#1t?Q!5F2HTQIP5&-CKAZvDb%9)_;9c95`ZD^w0^>i^>p|Lfgf z`d^>zh#$XE>ewDIr7xj=kM?)H9YO$KC%;tFxfQZ4UVxn&P+duHbFT3$Q z@7+5wG2s|p)NcJ6_*1|3Tf2YyXaCi|I6gPG!{rv&fSF@QnK^NsXcToy89T|M=95Xh z2;eD+6!@q_Rg^Bt163QbYMiZD6^KI0-&y+_gh-WbR0f2QngY_(s3Rgm={?ru9655r z-2LqbuAFaou3yuYVdJ890Kfi+zjx!oqX&NW@Z21`ckbckFS(Y8;m&*R;?R*}OifHs zmL6Xem{L=cf=HT*3cl}Is)<{p##)F#@Jh_8iXFW$iUG2B%7TVSTwL&F%Sfl&?Vhwk z^ALfjw{CyfW%etJK3u!7ypkO|e3Z>ww$ZQ_i$lH8DN0IBrf?C#7>mPHOY$Cir8sIe zy2ja!GZj^hmS8QZwzNQuN?E30jz$$j;fz1@!~+lfQ?9*K8tiP*O7k3#)lRAw_15I!H$ep_ez1-ZN*3VlYNA5(wR5``!yL zefKptyz))PoIIO;NQM57pZwK#ADcPxTL%vvW80?fT=U}V$Xv$lU%#D0M~{*>EzxI4 zBOtDeFC*UPsQ9WTmI28Snq;wq=@g)fZ#B?UcmA$Os{S;#t5M^b#tPs$X-02#@2Mgb zSW!ZCH--k7uE%&^$;)QX)4TBzMNn0Wq97VWQAVsWbh@R?wU@`w*|L4wdq1)kR&R(Q z3B1zo9x<6c>?zfoh_ONux-4}%glI68Yzzv8kBC^rDNqt)399{e5vAmGq)FGcPDb7} zl2+qzeqxOpe{EPHrOvKRryIIQMNw;9A|GqE0+Pd5FqvT26n0bv=Th-HT^$icuqq%z zr|5G2`4`03-f;bQ_T78mXR7XmYhV3&4H5YEo4)v$|LgaE@6|7Q!R3c$=jZv_*KQ@2 zp4YwVwd~lrg|-%y(IY_#sniEnLA#_zsTEICoh-qL$HZ`YYP71Ngh~e=yd>)~FlyBJ zE5Hg#jqVY6R9nx8pg|QaO0u4fr;4tUI3T%db_Ep9N^J{N{m=zAZ!JKwke$xD^!h!8@=Nyet}Nm{vOtkFydk14dvOT@Uf z(p3;utd>|!DnyKyU}Uv!$iPHo^|J^XT;|B8CR@gsLW~)=&P_I&jV%*XljY`ZTiv#u zJH~(DC;p)ah%wSBinU{&5=%=xl`nqrbF8n4HQEpS4}a{RUb`^A^xvO4 z{M6Xy@d+-w=n6W%!=2mr-K6@1U)ojY8#(` z47A15(3|htlPFU9+xme=&Ue(shzLH6D*7@!LM0C{)(?N#Kb8)?E7f(;5!bHQw5yje zAeDo2)V2fYJ+C!xtm=t~!3f3}fL;)aRlA@5vetCGQ`q$zZrg|@>IMPh>+UtdjU-7gxqSFLCw|>$ zK+glR%7*{}hgOwDSGOC{N4s?&8t+fg1v5sZ!feXEb~+N=4HCSj`Omx-xUAEf~c zVtU$@S-o)tEEXRuYO_R&O8ZbXM9r{P39(Er8Fdt8iOF*!fvBNB9U}%?-IPji>9@gZ zty-g63@(B%yNF5GL92UtFa_9{oIJ~tJQJbB5fH>!v`pHobBPyaSz?Sy4~AIK5Hq`U z^yuALvAi-cnUS8EAp-xxzx(H3J$!8Oo&Wh$zwybtzx}|TzxdLham^Jk<%Jht$l=3B ziJ@e1aiNNVPP@h!=@=zQise-8)#)%e4b_uHKnH?7q`EJRXsi+- zsuTHMnyXIx&;fKr7j_}wMi|oLdiexIT>m#Z6=Z}pUl1R$<@zz=MgawbA62TRDFTd` z^C<6u1jUX}kaXQ+NUOu8T2HhZ_|g-L62U|Da2Er)OAr3&4c0>8+ZbyAOS{_!yPQOP z)Kwd7wAj$ZVUTDr8VD;LA`u@wF)HE|HBGX{7~XqO#Y98w1k@{`xj@!z5Ta6+0TTt0 zUKQ6>iQk76)Ch5CT{C#L0~c8fyb4}=8kT~V6^U07Ld4n(5h#j)0FBo8&TFr`;rt_q z4jeo-b8M--vaBOm{<>BEQT-h0>mcVDW;;A6?=9Xq)Eip#n8o_knWZewf? zArjOhfHO@bgi31mMBAEUX<7rX+Rl^Ootc~vOS(Q_`-_lK(|mSfeMPa}sgJnvM{sGQ zZO?on-{ly6wP+Zle+oI{!v#s&Lktl*?W6@{O|TX%0^M!|XEAmeAKDn>@ZBP*tab`h zG*FbxSd0-$x>#w^=_=h~5ki;7rUoV#Y$U0<(xmVaHQ>tvXBw2`Dt zpPXvFZrkp?PaHV#)TcR#A9#qsU;Ogz-*^1P-2Ycli-L{RXiE)Z{m$ok%Yc**! zT72OPH}MC*_uIVgEpO*d-*+QBcWfubB@|)IPo@BceLz+2w>CdS4rPdt2#PyOa^a_eok zVa1XeLkNngh}Ub-XL=XJgHeOELc|j!u#rJ8mln=6uo^*3iV%_Y20dF@=tJ;;r6}5% zyv4%Oij-yEs{Fvp=;mfa1kSea-ucn}vxg{ylF?%O*6rk3i=~Awg{C!<(LjtHFqV*t zVfF_oOHT};3KJVJ2MqnXtM*Y5leRTVQJlFo`Fjav^aEBh9VwaPTD4OFr-aijT%wH9 za#t&MuVv5%Hms3wu+D}BBlnLe-4S27zOiyupsNZl7gpwvbI$n}^0WWupK<-G-pmt6 zJTohS(Dme-g@zhJS@5EZHgU}rFXxpne5KXC zAALWszTws6o6qOT*^+}Z^8_UY7vWi6T4v9dF+TF)ck-1leT_#Se4Ky%uRp;n-}Zh! z^O;*Xabk%Z-}q8~>(^ex$A0|deE##FLng-1GGHo;wb4N*nj#Xh)(xNM2pC+|@K13S z7b3RuPYqac2jG3cWtQA!NbFhJ-P%;bwQi�^6o*PRF9eWrCK0_KK(5E-AeymL8)4 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 Ef_F4S?EnA( diff --git a/genplus-gx/gx/images/Cart_ms.png b/genplus-gx/gx/images/Cart_ms.png deleted file mode 100644 index 4de57a935c5e44fea860faff80253b66157d3171..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23290 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 JPDHLkV1g)}w-^8b diff --git a/genplus-gx/gx/images/Cart_sg.png b/genplus-gx/gx/images/Cart_sg.png deleted file mode 100644 index d52bc23007a203de861e35940a004426ff801c16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34509 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 diff --git a/genplus-gx/gx/images/Crosshair_p2.png b/genplus-gx/gx/images/Crosshair_p2.png deleted file mode 100644 index c942c11716a8a7ea610070bc68d7d265a9db642a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1651 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 H`~Cj|J28!2 diff --git a/genplus-gx/gx/images/Ctrl_activator.png b/genplus-gx/gx/images/Ctrl_activator.png deleted file mode 100644 index b72cebca88bfb6255cf8aa1ecf302f52cce17ac5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2602 zcmcIm`9BkkAD?q$u3?hMOfg54qjIx`QI5zlk2Ay+W9E9WHs>5UGH3LRbtw0uLRjc| zcnXsyx!NP*Ax5s1qp#;3CH%h}OZTvS06004;Fp;0bJj6Q-h zNcd=XgzC2(kzh2^?i%Q5l0ZR}BP|k%#zX@EqU-;G4_R+ec65XhtUU>?xEqAH0DLgO zAs`Ts3l9#$2Ec5v_~1Ak{$@1H!Lzea^VE@7?mzD(d~g5(i;I9=!-fX~&Kl_I8R?!i zqGp7c9VHO$P*&ICD_1MAx4b=|f8EA?n+Q}_QNt>XKJ7OM249vTJY?~=fkkVB?O;eG ziSk=E4GC`qZ17nr_QO@4zN|s73#s|l$f>ZeLc+jL!pA{A(m+k=mN(e)sMaZQG0mrvJ-cxGj7dn@%D((?(F8Qn73aoe^_IilpRWcnrPT8>M7>UP@Qh# z7baP8_&KBzKmw35~u)VZ|-&^PXQXXbNNXx!vESHUhJo;*uzIzu*#q{4y2gXJ~a zS?0Qo6;LhEaVkoCGy-Obd~i+RFS3Qe2w!LY47QITP0(7m@>g2F!8ui+8e3juIoOzL zcugS2om(@b#TWgJm^EPxud@i+O@#{Ad}k7AV4hNQW?4Opn|2PG@|`J1gBnu?hM6a~Ywe3sLriB`O zEM6p=lt^--K@!EYC4r-88>XYb$vQvF!k6#SaU%nbB*8a5r(=8M90Vbv%RRP?!y;M6 zd(iKlG0)}hyc3}vD?fnGpVtK_G09o~>V2sds31wI3&lIiJg&^VBS%1L72T%InhjXP+`aJR|s0Pw1H)#q2=U0XJg4 zEjeMp16X*%%%bS7uPT-FxyBj`xhVKbGQAi=l_8i^JaME?xMrq!KJ}ZWP2`P-=M-8) z$+`uUAu>%tmS#-)(O<_l8*mEI%2PQIc829UUrZ=uG~>ZukNo%@tL0lIdFSbZuu$*Y-z9RhJ zoPpwO3YCar4W*W{g~Gt&Pc4X zsIL;Uv$2AwpToAiuz~+7Rq?eC9#zVI!klsr!^=A)G|{Z*qxO9)x{o ztH{!QpT|njZU3B7e>~D!Ex|jrj%j_QRsBihfqt*+lrmji5%>}rkzDg6*AP+O^UhcU z&e(zXG}?B4X&Cs4-20~-zwQnRDMlhUImze6J*rz{b&FzdW4X%ZU z`mba)1WQzOb%)^}UDs>Be;VQOy+Gq*h^;Q8CIQ_}yl$avxrWK1yb^o`@ysfbW?RzP zCiw&Ra^{d}+A)ulhd=FZ_UoSaZYAQZt2wcp7<9O&@^G?!!*swesLY{L=zM7nun2rrahhD;Lg8ONj#}0WvaY+5VL1yo zc}m$dsY0M~--g{S3ws_ZqEMI#f#_CabY2buT2613^M_>pVdrBx-Yhy)0sQ6--UplY zo`gN8dNefXQ}%y^)w7^U?x_TEXxU9Y)^=*V)@mdqs0pHwhc3b!LZpH|2gvr zox@%s3>(reteUJ&r}_4+whC;?B^UW{1-d z{P@^Gsyh&Vvvjb68say%2PTEQld@@}Z7((O)Jb=S+ikeXI3!uvKYf?jBl14grgpxI zE8I~P?O@|ux=S2GBm-pYhky4kDs15ob^0J8uqDO%T6t4qK0UT78Zb0StZ#6q^(873 zc`t^HK8l+LCg<&+gihR*rxJ?-`KXuz!|9a6!=?h*Y1(MolyXEoH!hL;BA%Q@~C*g5i-HqjAPK$whB1-?;wqQYiRQ*myVB|`Zn#Rlev3%PRsA+2KeQ4 z%D6v$p{vJ2aS5mC)j&^4K1?s4*KvJNKym$&(H_iqki-~C>=9xby*LSR*SY)`!ahIU z9Tm|uIGHNkA@%dP^?iqN+q$7zs8z>MVox|VuYxRe<4{XRGcdyY1< zynAYG8`G7?=m>YmX|&wS9ao#(J0s`nCH>+;+Jwu_%xr&`+=ERQ(l3GQ0SBOF=X#r? Pt_HBPc0@HI{Zsx2&xWfm diff --git a/genplus-gx/gx/images/Ctrl_config.png b/genplus-gx/gx/images/Ctrl_config.png deleted file mode 100644 index 1d6e1c4326667c8138d62a10648295d14b1432db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 635 zcmV->0)+jEP)>~5x{kP!fVxfa5Q`d1pdZ| z-7dAj5iCXEyQYCpBCr=X@GB*JD}f7mfkpgifJ?mZ3U3p*6#<52S+&4)j+ns70JMbP z5rNAo;G+ay8RqmHPOJ9x8oq-0oC42qzR~V#An--Y+MYrn76rZ=ZZcEle49Yq8_lc! z$(E?8(B72<%hk`YJx+wlTNZR04I(rG~}?itRq0{{v&= V=lW-qU%&tW002ovPDHLkV1fu~4Z{Ec diff --git a/genplus-gx/gx/images/Ctrl_gamepad_md.png b/genplus-gx/gx/images/Ctrl_gamepad_md.png deleted file mode 100644 index 298b3520dca03819390eb886571a84f623b50386..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4938 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 WZ;LHrmM(8u0AqcNTTQx%$NvX{eMt@g diff --git a/genplus-gx/gx/images/Ctrl_gamepad_ms.png b/genplus-gx/gx/images/Ctrl_gamepad_ms.png deleted file mode 100644 index 4428f41bec6149c6cf9dcd8bbd020e23eb7ab611..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 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 UnwYYS{{w)YmXT&H*dgx!0Oe41$p8QV diff --git a/genplus-gx/gx/images/Ctrl_justifiers.png b/genplus-gx/gx/images/Ctrl_justifiers.png deleted file mode 100644 index a2bee99f939617fb91bf605c1f3e57cc97f4b0db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4600 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 diff --git a/genplus-gx/gx/images/Ctrl_lightphaser.png b/genplus-gx/gx/images/Ctrl_lightphaser.png deleted file mode 100644 index ebb223dce1a3b8d4ab0bc813dd402b6140538d56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3890 zcmb7Hi96Jf^MCJQcf+zIxsTPcK8~cVoVD0>L`p=?D7Rg#YlYZ#geXfYR}=}!l_hd* z$<^U(k#lpD9E*^3l%MaP@SEqEnP+BR^UOT+%=64MiI>fdkh~JS001COjPY0Y^|gI= zK*09pJTw5kub_eYCRT`jia@v~?Ar(Yjco$~fOqA84AOsv&DeL!1re?VS^BvLQCtGt zfQv3S1N=yCu3j#3hF$?~6u$tUK)H+88dCo|vX2%0AJ!ni%_Ydo&sWaMi{u8VVNa-Q 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 diff --git a/genplus-gx/gx/images/Ctrl_none.png b/genplus-gx/gx/images/Ctrl_none.png deleted file mode 100644 index 71ef75ee047f18f6ebde36d5ec90b2c11d62b90f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2227 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 diff --git a/genplus-gx/gx/images/Ctrl_pad3b.png b/genplus-gx/gx/images/Ctrl_pad3b.png deleted file mode 100644 index 8f36c1aaeff872e3ba3340e06c258cd10a2e6719..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1842 zcmV-22hI42P)=P9p$ID2phQHJ2dJ8$CI&GkYP`G{AB=y4 zkH+{cF)@?+4IW3@+c#_FEbM|F@ z>s#Mid++1C_blad&H*?e4b%YDKn`dH^1uv`Qg^Q(Km-f|Q@~aA^GmjWvjd!SDIg29 z0BeAIf%}1VK!ZT%m19r}>0$u@L1Mb%A zNi3XWSg0K^A|MTzTv7rQv|A9!BF6l1Vtgggq_!qZT4~@4@DZ>FIJ;OXZV}KlupM|y zcd&5xW8n@A78C4b#b${(!HW7HuE6%ZoIEQh8-P*Gl?7H|`H==r0dE8Qy!SKL02bJn zfZbTQMu0vU9|F3ugxjbI(cKGBO3wkTPqcfrJAuB8MJuoQDltja0Jj4xfM(fv6L>dB zBucRGB=EilT>;Jk6Z%bQ@-E;uV7=Z=2vmVM{7JThbW-Y z1>OP1oO64;_r;*$W=!y#iFKCJMCavo9ndSljbb0M6T%(pbC5>37X+qEfGe>|QKLCC zK$~pMVO8k}mb~p)gm-%Hk4CDmy99PZOy+=bvDhdODLrQddIk&a6sGT4pi0aX1vIUG z<8r2eAK|9CfVI2$7 zG7^9uEc~MiRV!8}$BDIC6uXB7eq7+*P+L*&8U!{i#)=}SUnHFo+iNg6HS0NxNhFlb z3ZOYu2}fKjYvk1^mVgCKR8PFZ&8uyt*c-v*)C{b}5(na?J1^kVy0>WFIn5K~SdQgK zzZ`57F!=; z-~jL_R!>L7@^&%Umk4X8+FP&{XhJMqAufBNtc86<23y@)HEs-(+??!Wh&3Ko(v@5`>;_Omt$ZO$;j|Ig|!VUg>9N^ z4wF_Hrte0PRwv*o;8T&ZV0*b7_!xKsTX}|MG_Ap90<=Pt9>U~uSrHf#@F6i3 zq;+6>g91>v=7eCIt8#3|w*@OxQ@{h*@oR>70~MT332Y8{9oQR=*C`fWhp}CL8J5L4 z;zMKwmbLwI<_z#XcK(|3-p^g{)sX%ynZLO-7>uxJS>Q0AD7* z1*9}-V7Ul<27Do)t1%sxh<8sBCWHMz|583I=%{l@#8hAi;ET4tKOaK4?07*qoM6N<$f?wo6QUCw| diff --git a/genplus-gx/gx/images/Ctrl_pad6b.png b/genplus-gx/gx/images/Ctrl_pad6b.png deleted file mode 100644 index f08bcff0615e09cc7b168d384523768737025f2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1777 zcmV&dq z=l~W7d;!P{bQYKb&H`tEUf>|G4>$n~nc39;0yu=w0Ne@O4csNL1>geC>=-ZsT*TRq zfa`%qje4L?U=IMl0N(?9&1^hn3xMhP<^(u|kP*lyfO}$2^HCIm(T6v%w_!#)a%tmKo`5ys?5Y_>20{2VVexM&10S538=)q$$y1NID z*;)Z#DnLcx2EE55Qv~K~bOJYOW7~lj&8+tdOtS$FA#4QR0~P_l3TO#;Wd=A292WQ^ zl4;WN93Bo4cn5F`@S9{eXcO1#eM&kTf%CvUz%F2`nVk@x*#U__VFe9BUzzZRS9cH%E%q|a!5W)uFT|9Bx@ml+bK-7uNs=y+dSbsAD*^P(C z6y8v7#;eClU@!2RJoC0Tv=2|#7ChAI^&XbZ<-l%Wvzc9tj1fY}0uST$v?}(_;K`Q9 zlc*LL!W)H2X_w~L;$f1(6K6njHNbk!<$-2-t5^Cq0k>)M(K90gUIvZ>8-WMFvpGIX z}CHwaQ9g*P-9%EG*3sO3t#PtJGP!c1xGSo~`K??fTC%v&nPY6JbjQ2^l zMY>J`holo>C~4&7#ZF*FIwYd&3tBLamzD@Hw%OP?24%b|b}K1w#A9Suo3Bb=A4z!R zQa8O>H541d8b9|R;RqtC|f(V!Rtgs@lur_DJ?}U%Hc)4l#&_7n?pBA2||G4`CvjL{d+Ps zKM!~DQ2~t`ihAJ!_!iHrEFN-MU@!tUyd<^au8PUgFXI`>6!2J%>>);qQW!%b zHw|p;XyYPc5uP)>`c{z5kn+lEk#hjA5a)od2)F`#2fV5s4x|_w*L*sW3V8h0rPhyV zlvCf3e1;@943EnUUKJ*B??vxa@Sb3JhZ`06UBJ;C_yIYDum|`C?{>W@hGOpy0@#Mf z`bCm^+5pLoBi7bfHL@fJ{AP^;9%`-H#0VbOaqX1WHsEc%7WmA}#-^VoZUw%SyN+vN zS!~36nc+8%E`gnp%os^S7?JTZNlA8G)??J_X(|v+5P+;Sj=; zz&ipN%T>=4801AZ$>#mLJGyMbrS>n#U{n~(RyTgj7{^245MJ1O&8)&4pAbU5K;NM^c-*eSy-*{b&bJJY zy(-S=Af907|IL4lX0WvwXE@%jNAa^qubEY&+!Y7-8I;91HJJ7fg8%rLtF6BQJ_Sy~ TvTm|Q00000NkvXXu0mjf;9eAJ diff --git a/genplus-gx/gx/images/Ctrl_paddle.png b/genplus-gx/gx/images/Ctrl_paddle.png deleted file mode 100644 index 45f5146a0bca69fa9d9fc5307bd67e0109f0cb31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4795 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 I`mPWD4+Y*bC;$Ke diff --git a/genplus-gx/gx/images/Ctrl_teamplayer.png b/genplus-gx/gx/images/Ctrl_teamplayer.png deleted file mode 100644 index ab8706c41facb8abbb8d1a9248e82e7300b299cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5929 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 diff --git a/genplus-gx/gx/images/Frame_s1_title.png b/genplus-gx/gx/images/Frame_s1_title.png deleted file mode 100644 index 1022718075b271f831053a7dcc44eb3994a75e18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3510 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 V49(V&<^G!hOH*4k#n|h?{{e6Hkpch! diff --git a/genplus-gx/gx/images/Frame_s2.png b/genplus-gx/gx/images/Frame_s2.png deleted file mode 100644 index 191c6742a6be89568e7b175ea6b336a5f5e9f9c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3890 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 KbE4VZzy1sT4tCT4 diff --git a/genplus-gx/gx/images/Frame_s2_title.png b/genplus-gx/gx/images/Frame_s2_title.png deleted file mode 100644 index 05c8b237ae8cd31672d42878f53786457a0a2c74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2285 zcmbVOi$Bxv7yoRASs1YrVST$`(&o#EG3Js>2vKf@W+I_Bm*sA`q>I~EjcTsBOD;oM zWF(4E6s>Cp9 zO(p@h-b8Y6Aj!wy8+pQ?ObQPs2T+iw|yhecb}Rzvsr&s%2-sJ z#vf*`^)q_9H!fUIn5fAp)mzGrvORp4NLJwA-Tb-W&sNwa&i~LClre>x)g897@=?;k zYve{A-K{*@kf{?ZdG=}DzO3EgSvK|gUB~rzPjauVdzgM#wyfIP|GAm(+B3Ly2+4s^Q-hT$w0D}1l~t)S_6}eTm6Xq{i)5l4px*a{mkOk7;)3CQd9fmEMw2`XyqG=E7#l)am#nI0$9_Xjh zH{?(Hsf>i2eLOEQ|NXiruS#Bqvy7c4_O91l{s?AM6eB0w7~h?z-`D21-o}xq*u1-s z8Xp=F0zLFt!xV=UNLpmUbTsAxeEV1C{V5Ke9-VTeE$3EEm`!6|Cg;I;T!Y^oKP%9U!-l`VYd*D} zJVb>XZU;OL`r2}$%Od3~R`)LYR%rD8Yde0TvkNUy;z2dJlO!ZD$2cK$NzSc$r(U9G zjTX%k7MeJ^z?6Dk)lyb#hOgu9yTa#e9S@-YH~u=H%SdD2`FF--un#K?Pn(h7lUKmV z9~Vphm{G4T30K~nI*jc(yJ!$Wxv-&D&PX1&y7(`eEmTvbKBM6!ZtRSJ$`han1bhBg za3b$XOuB}f3uUPVE~)HsZR}U*ni11?WirYVjbA zIoP*w-cnrRy1$z-6lARmc+<@IMEtc43}?=MF#(^zWyIJo8g$+`)k*YI)MHH;v+JLQ z4fX9g{n4W_*;V<77P~jQO-|_Cpm&(ho}rJ&5=D8Q{^pga{_V)Ic#V|FZsn%HYe8~H z;!DS|a~!RM``;_fnD?BS4+v7nM@)#%a!QnsoQ_2z3EJ~SLMRS zwEfYK4NXsC$3r=YkV2(vv*jVW;A^k~u>%wab`?Ht{9u#%dr75+K~~ zJwwOM*kLe|%I&}Hj8v)PhfhSIluWtZpAe$3+_w!yVU5{!({+Zu>t3nZP>^NuV4EXR z3Z)i*SN&cG2RqiYva-6}!eVXIu3yyYJOD5IF}eCmwdbj8O)Uq9aoM>}JdCC|iA%P-WZ~X#g2|6Bga$*TA%tqNibAlxL| zL0*;HRc?DCcDgRIm3-x&;cr=U&mOY^_V#Lw4Q+bc;K0S_Q>5<4SJo-F~hnF97KKtQ8z zYi;B4N8Al~1ECwbz9ojEA-h8pLBJrmrpSBm7nhjp+x2%|cs%IQhXMBZi_<)})KFCK zg+Hx|G~^)IT1;F;q+oVF`pxFG51+|y%X8BV1cFrWs~tN+(6(j#l>1BKZipoY5*tB* zyJB`qCa`IS=f5@4`cf0PNts1HUYL~da45|NEq8r+25o#nl~7UiPTz>4Pf1$x2zhEx*6~#0%f4$1g{5T?v?2GkHMneCU$j@qLiH;?^UkW<5)F82s zF!jA(1iGzr3)vl#pefRIikWFSdvvN)LFd?FU9sSQ=zjDz0HGkbtFwxp0XTX~DBZev zVWqBUslZ`kV@gx-6nVt5!nU??WQv(JZ}?zr;J9cJ!pC7HbWw z9{Ss4L@E^mv@PQT{a?LY;|a>$zI`VZ1W;k}ou@8JL-?`dzm)B$G06BGAs8W@1`>w< q-!^_??-~;7s5-8wL_-R9>;UY_9IlA+TNS~$0a%&anN^#3(f$X4r#oZ- diff --git a/genplus-gx/gx/images/Frame_s3.png b/genplus-gx/gx/images/Frame_s3.png deleted file mode 100644 index c12f11c9ddfd5214fc7b39cc9c7e5926fa59a0c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4447 zcmeHLi8mWc7muP!saBP~YEWXYr7D)Hy_QfRA@XQ#UoFKW_E?%ys;f1q+KZr}L9yrf8iO5Sg1&-2HosSI5KHh4+kt>j9P);B8~=DSEt7Z(X^XQ1q5={Z%E+9B>2T`Tz$S+H5M9O z8X(1NWXDHX{K#gCObr+ew8T9B-GcdTIJFoOc6$urA9k@@kn=VVq;yYtMIzBXgj%PD zM_?zQ7eyAG6Qa$`%zl zxjFp-=E9G{!{fvEUxHt8d_OQcAW_69RdqEaEDTSv6~({C-2|6i0PE`F@hu0D#fFJa z;*uwnFJ1Cb!N92|S1niqK7pa5raP;pWyTn|GYmHJH;VHhtqr}-p1nhknKOc@(;wjt z?nxQJtFJ?qu5;D4H+c>I$j|>nRM=#1jl4OfDIf40vs2r@Ieg2QGUy#x&uowg%tyI2I3S0rzANEOPS5es?+S zd_u{#o`n(;nNl=T`eyir`p?K_;*Jmd2++YZGdruZo0L_cWo+Hs3)zso)p0o{ev-q~ zM;#2&uopmJRc+{F1!75`GB6^uyi}gz*|Ph|PNVf#{|pws=x|apXf@A}+NW?n^z#y} zHcz7^=1o00q*YrxX#?x4Cc$Rd|H!|zo^}aul@%5Uk9nDn z&S9^}9^7F}&yeC3q0MV!g-sz59tRfn7o-ZI-LpL3czt~MqJ}37TD=%2_K0IsaqLP- z&XFj#Mj>TR#3@-WFKpxOqva>ba~Xq&BAz6Dx%hqe*n^<=-d%oRCrd!O*U-l=;Q19n zxA%8{4?UKN`z480RY3GgDUx5L#|n;lXO?RWdr(?p)`~Sr%tyK*<3kWpUQ>rFTvr}; zCp5#J=Uw*vP0h|Qx`e+ysfAF3+gSrEqm#wmt>mqX&|_^UB?7wB-HVx80ET$7fGE}7 zWZzKz9w#|BgS}Sf2~o|~yNSRCMy0}pK2E-k31HLCeqNl|nRrfsSplFu8%FU6C#PB& z_Hb~v(8-gc3mrRg^>Q-6ZLl&uEGK$g2>4DnVsWu(|iF!n>NrVgG;Eh_pjHzf& zMDL&W#oB|c4?y(wt-ODLTxD5EyIi`*)1Vxx*eyuR?`uH7ipRZ-)_e~>$1+r3B~52?4QNjnf_GxIc`EA$FF_Q`p^_EdDn5Y zQ^OboFtTTN2koHtm=QB|O*G@9oiPtqHfaw;RHnnua;}C3C(pgP)da;lN53W+pgt9J z9zA~%&C2Ip%Bpf`w;k(yIdN@!JZK{uX(OO;u2-!xFm^zR=-$c?BBWbo^q*RrI3V^* z>*5NbKvRc?iqO1{?e+ZjkdA{F0WB@4%h|IA-<9FwXbph2 z0aMy^Fyjani$}u1_vpg?9-bz4@c|8Qu14Q55T= zWC_RpEzTGVSEy8``}Imd>K;7cJ#vS;xIlqCOFHLr5f=>P;$PuFu@+RNdxgrI^t!>Y zi%OZNWfJ-i(>(9)m9*1hS^;tI>O4cno@@_5a>X@KIoK}iB%D5^U4h8=?%i=lU0u+t zOh9A-r6%){Fzbbhu^^qI3|SZG6$F7k8uIfOI=doh82^*6tZQrPM}wR0InX_R>{+Xr zd0gQaXOnK3rdOn8a|(i;ovG0FfPyo<1~PQ}#5+C5Vt2lOkeTy}FP23)-ii!uRUAe*YDY5SIvw zNtwF=1UlLPTCKXxSF~=5izU{FT_mev&5wNp$D9&O{6ky}a8(%u@Z<9IagBLtc8NzT z+5DK-@f5yJVWIys{NE4%Yw?getB&Ipcs@dM}^0%#2 zV!yUekEeN~o;b9VAWY znIL^0p0WnAG2tNo$@~87$(fmOmaysZvuz2SY->$5D+`7!*VTfaf;oxP;7sj`)3<+hpwLM+q zXQ0AJZ!OL*c0i$pTL{B1D#@w@u#-46BobM=>$i~<5_bX+m$cukPYdk=+uGi|+q(RD zb0Ayq8W^iOXXO9h(*u}mQ-gKhYz?uKWo|av2HroIpK@UTCQr2)8y?+WtoWqX%7y`! z&iD-!RC!zU4^6a0a2z~XI(C7XNGmX1gBEyB1?K{x3-snj?z2+1(H;d6%UyZ{#oLbe zZWncYXCja$rvOu4={Q(L|5(wFtBg59i5t?z#Z7(_{#B+TFxJvpeRHS|HvI*xa^0qW zwKaYAJ@*(}AC5|*fc}iWpsGGvOHfARU$n`c453cFp_i~9hZ{})%awTvp3PqDHcyIF zg_Y&!*V^}}JyJM7NL~FZ=3L_0j@()ObkYOcoSfbLvkt7WbF-SPe=#00U|51E-Hj9g z=trbo;KH^-1H@*BA$hBbj9EAvJ3lOodO}e+_a#26&L#^vdI3a?JP(3|U#!l<#Xum~ zBvB?KtC~=XSr_vc5@Xh*v;k;eO44&2h}zOBsjGA}>B{>Rm7 zRkfhRlKY2xs|y1ON{8BYR+HP7zVwyX`piWxj0v^Jo@#^1Q$sRw(Rm?)*h3qk^cJs) z*GHReoD9~Hf7NBzM)()H3%;YHY*^+ppb(1{1IG@<*q6rTQYe&yjrP5gJv%!)^FU4! ztde9$#BNRJ!R+@p-#1_3rFv)L8twEr2RLzv86;oSn6czgZQmZ}=H!&!a2-X|z28A> zkk$kwAA68!3$cVEgtE3x?)1@0Wa<@cy0#7cF^uksu|xR098%z~9(Wlw z^6@Fs1MJtgRF*6tBK$Bg5aH%lPuSZSX0t4>h5l_bKaU9fE6~~9J=x984SK-245(H# zHuiu(o^mtN(a*27|H5?}S65cl=&#En=f61w;PK;4oX%+xDcu(f^XgNLemj(6`teH3 ztSf<;db;fM2#ORa;fc8rxuEJ!YF1>b8Ft*NH(^H|n&n1+j7RO;hr1d1Pcy)m&GM9gKtY$kp4IT~x3atP|~^pA?PtjLSW)Llt=l;85NHE^F>ZvL_@HY;xEP1(+hANIzUcp&5^R2yzLjf%9n&_SE2FuB7spdAk`4 z%>s~>P{BnqSQeHQX8W|&9`2JPHaCJ`C?Cx8cS>*!>npl@IB;-6YB|~bBe_nLvzhix zd<3RB_@Cl$vP72M`ePNS2hYK5&a0l&3RW~pLXYw%7wkuU9-2z@3Fb9=cMthy(35K` z6&u@R)*$)1Vc8{mF;x~4Tmd3#Dkc;$e=f;Kr=ACOrjvDT-d2cXbgXHO=d$LETqCuW z!iKnZ@{WsUn?Tv7pQHx|E?qHAbZ0BvV)))#8=P)>RJ3;b02-S)&iXrjcFyFCwBe1n zQGA`!9CXzu_DcEE5j6H;dGV;(%2wA;QD;W>cj_50PX_A6j`h;}Q;u&q0*XJwRlqY> SCb%CQ0Ei{@M!mUL(tiO4q6%98 diff --git a/genplus-gx/gx/images/Frame_throbber.png b/genplus-gx/gx/images/Frame_throbber.png deleted file mode 100644 index 98d5316fb84ee9c7fc5714a5b0e5775cb5381a86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2334 zcmV+(3E}pMP)KaYcY?dV{!8ym!P(IWD z#ntC$H{88Dl}eRVS1xH3fMhbcoHM>F2t?v?-xp{**9AiDMD66tUGMEX*jQ>^rPP6h zkT)3TQZA>#Fid0yv-qrk0QJdQY1-7gb^_R4O5KtbVvNNIvEg|hY{!K~2u#DoC&yYa zX+ktsYTfG;N~hDq-xG;MBj-Hf`#v;H+g^NLTpK|Uz-K;O*9D~%mT7`g3#Mhjw5;pu zIlgFQzSkTI$uZk;-E3BEwQc(2Z{I(w_r|q0N}+~^hUryRRhsL%@3^kp?E8Lmd3kvt zgm`{r9_O4%0wC0eq3h5z6_#ltQ4_<^P?i<*EZg5$H#z=}W!Z_t$4^JjwqJSBTN16r)2hsGi=XPA*)&QR8BQuyqUM;{d3=m?$b6u!;70geT-x5d&(cyU> zJkJBA6oz3SpU)$o&qLRBj2ky@ICtb?Or=uSfsBZj@~{FC1jyy{C=@h!t_{u@5|b-& zbtqf7almzJC>##&^*m45wml4!%jJ;GW?@+t^7;IpubKF!Q8_VkyyJY==_OBo7vm#g zxDEmH9L%{liHYMYaOzZg^(__3WHMJ6V}CMDbET@P!|G59_kowhz-##ovuz>jtuWb6w*R>c@shjKnDwLv|*4Eap_B`+DAP5iy z!6nl)hZQMx=e{wDbE!Jn7>`Z(c{p6AKnV0+$rLX2^#1hGh4XhS08mv`)x|lVA%wt} zhWL0W6nb`GU|@D#U0v^((0m!X_IS0mk%%3|e)-YrGuDAZWTT&`3 zD?gHDc}CHh8Drp_!}GjIG#dRBz?88BO4L@rc;v(xoIKruY)(Z%H_&?aJbw7h_oeAm zr)-ls=Z`YR;QKy`pN`{z5CY4x5{C{QdSt9%)BbWa z1q}1=pNWq17cw&E{Ah9CB7`89%b~x&ADK)Bwrv;ItXXq>tbhRE(^IXR9$PpM56)|V zA`3*qG8QhFgGfc0NT*M)R$SM8f-!c{G|icsra@IzXqpCDmhFA}_RU?qc=1^B;IW4n ztpD4tzvJNt=lx>QLvs~E2)Zx#7EYWvx$2GAckGc`TCR1Zv$M0wb={|Px!fdGRnv`) zjl;!#LgZvw{)uUtM}cpySh1EA3NKQ%!dtQ| zRr{WgEB%>wADG*)@@BPedh3YC<5ZHQ6|yYHBuR>K&Sw~g@rkbMqmB!=3)>4;M=HXH zUDum&=4@xIz4KBmnW$OO^Y1=-v;0v&@p$~bP$(2BI(N}1P1BS-&)a&ZK(UGAwzjrk zkoO+^2p=D7!QKNO;@4Yt!lriQ-F^Rj@5cO5E#sVj4**6UWhtegl)|=cVfP*!9Q;bns;W(~SS*NCgqtUfk2VW|pyPbk#;Ydt66B84q{Qbjtj;Z zvbj7&z$HG4RDz zNC>3q$=a9p?f*bZrBW{eXelo*1Lq7{K?k7(zVCwjF7B#}Vq(B9GU%54=QgzWG<7v3SHMFP1B(3Isjz$@8AE>k|j$306`Ea zgi=u3hGh~Mx&g~F(cRsHyXzCfb+g&*cL1Dx;kjoMU0vN!)jS9xqOIfeH#fe#VboFf zrf)yO;qa=r-+ue$L?ZDFrS!hu-rhrN*RI{OY}vBm9L_m7pC~W!q~zmxW|`abNG{_Rl-d?LDyn{VO+{yJV+sZ*SKKwPP19cB8kiAAMH_FgSP> zwKbCvn>4ZT`>n55mQuIm*D<#3ta2S&l$V7d0)~(*F!in~L@Ua~XD3hH@pb9H1`37b zJ$-#wmIndP+*6;#{d4X`G!n_QwVz+UecR~!);Ep+0KefyUOGUa;s5{u07*qoM6N<$ Ef=@zlhX4Qo diff --git a/genplus-gx/gx/images/Key_A_gcn.png b/genplus-gx/gx/images/Key_A_gcn.png deleted file mode 100644 index d95ade81048460fecd7ed287d0e9cb579ec1591a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1705 zcmV;a23GlrP)!~Y^XI<%tbO>*$tkbqA=Y8E#VLnZ z^N4q1R$sos>YuI?w_}2FA7eB{T99Ws)#)mSA6=ZBSQ_sE=ao`R{}u?t@P(CQE9I## zJaWK zzzYDLQff(SefF#0cq+7!CDSRH&d^RH2!73DxE0e~?-9*Z@kf1bzp+XC#vVc4L+cW) zHM-O|;~1Hbn0s)p0z9ddTJnI$7Zw(h`J;2AhLS8#$#hCuWY~(uSxaZFOV-UOjL{apW2Tz|cIxwCy7Hu@nIgB>c z#v_J1IeTkel&_dPGJzUEsY`DBrODXI2G#K@gVqq`DV%Yj6hSTUqRG&v?d(a<7;}8( z^wA>GF~ed=QYIv2LgrEma&BL}O}Eu$`q%_hM<$tE8E5+B1bfX6>wn%r!~$Rni`5R3 zTbva}=0-~3SYV84)TYB>S|;GYT7xMK;Z($4r^DLo*Xi{JOplGzYHri+wehDtN?o#f zvBli+8LIUP!}k(UfPgJ6)kffeMgUNhC4u!31Z^~BsR?Qxn{T$b^^e=6gN)uEyTlg; z3lfE) zZ?!3+oZap&n>SnZT0;<_K3l^UmhCHTvUY|SD0FHt+F}b!-pvCb_JbgJOc&SpM?;EPQ5`@#Qh5J~qzG15<>P5yRUt=}ty%Dxx+Mk#}+w z3Y}5a@G}p1DNVCz?bVz8WRT&H1?)AuG+%3CJk8ig z>SUdi-FG_ln?vHwgyF3rI?*&1>iD70U}MPOR*YZu(6Oeo+8v5W2)q=CNYnGY-(G(C z%41VU#^u12r-t2_$s=RTj7>1Q*dXs0IOFg=SEL!6-Y z^KJ@@$qiXMqkFx-Q^vXhoD-4e|0@iz}H3OH}|T{r-AdzQ~B)5l$v{JZZaILR&fqf?pu@_bfU?6 zMcKbO=q1~U5+U5b`Q0n?10svS4}h~usU(^R-N=EOtu`uRjU(?CUf#)lof=O>Mt}>z z5AWFWq4_`GmPOzk@G8&)?Ed!l&&~mh_hS4D#(gIq8_w)*00000NkvXXu0mjf$x1jH diff --git a/genplus-gx/gx/images/Key_A_wii.png b/genplus-gx/gx/images/Key_A_wii.png deleted file mode 100644 index 5cc2a470de86e6e95e2138a6d55e21fa06f1f4a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1542 zcmV+h2Ko7kP)YZO@)fWNBhHk}X&9ZiPrn2=pelmVk=0s-TLAc&F8ix?5ym0ny8 zGK$0MgD?IEB9Zk$%nU3GE~4Z`mt@7(JSa^-m-a_8U%JaN;<#PG2z~6yI z*#M-i_g&Mp-vVcvnwlDkO2n1;(Y;+)z{ank&%&K z1&fGyo+nBv5fPc6pO>MbApsN+TUP+|x3;!A4<0<&5NevHSe7LsB1$Q-ZCeV3f|#Z$ zwr$IW3l{`%fd0<}KznU%ZT|M{+Z)1@$)v<$F^R=uGCw~rA|l0NQF6JQq|<3hrBaf~ zWaPw&69VLcb`e4UbQI?fA3of8=FFLOI||_O|+Pagk&)$?@aI*|%>WV`F3Fayd3_+JsUH z$8k_fv9hv4OG^v={rwn*@q?ymQQa_%lbxNN!M?t}4F!org4x+w4jnqg;NT$7o;~C4 z-MfTBA(T>ho>$$o*(?JC14N_I8sLQ9(9m$Yx3_mgxM`Xs5(#$g+C^(?D|`3uB^(ZO z=guAG=jYKh4aaeCT^Gl3ux*=gI7}oG@qj<*zVCPT^z;Na5+svJ9zA-*(W6H(41) zc%H|B0|x*Y9UWz1VFA~5v2B~RwKZ(prdTWz4u>_vFg6851lM)f70k`eF*-U*b8|B{ zZrs4OZA{Z-d3l-I+FIiAID>;N|t*tRTJImFpR~a84r?0P%&6_t@1))%gR4S!_ zpLNG^eo7{jxUP%u`#6q6xm+e5kF&6_!2bRFi9{kSEiF+hm2h1b%d&_>BJAG18^>`- zBodgWiD{bHwoN*nCZEq6z~2mDu23j^-`3U^?C$QywrwoSA{L9G>pGV&U#70EjzXbO zy{(n-eV^B_U-RzWJG#2M@H`J)*LnW@IWsdeB@r3YMP#vDF8^g@WQ1%sODGf~lgY4s z`*u#9I>pYNJIUp8)mE&Op;#=^($Ye2Z!c|aZ7eP>;`=_COopkcDSY1_7Ll|jB50b{ z4*cu<`SXp#!^32=SxnQcmaGC_TU*1jELK-nSzTSNmc_Cxlu`tPLE`Z^)6>%h;5!kS z(*ZU>+SFTWBUr$XlpHfIo@IKR)AqDflG$ z4gY=5e`s%S4>mV9`;kZ_uw}~@&9-e)sg$JCX_e3CjisffGB6B`$p16+|7V0&ep@a9 sZvn?J3^5F&G8SJ0e+HtJMAwV|09(2&Pp;PP8vp|nJl@-$0->8$&r zs-AlT*8dV1V?LGV`4hJuJgAS{{n7m9nNgnA4RKvVRikx-)D^C2*{Ca?xp=`IKl3lU z)-)u%4sz!RwW8oR<5lLOjH6St z#34{C?1>@{Pff>9RmDBVn8j!?7~HckKi}RmH9bs<5?4$xRfX0K&USAQ{xXLqtEN!bX2LY1J3L1|T)jUol6 z6989LAO?aUep~;}v9Y<%N-^dWQO3J`&r(^l9t`KRDNeYauNLbZ37!w+(*zYNRbmW{ z3bH-HNgT)J%jYlf&gof95X4)8C}J(;=9sn3HFjmw?2(A1?wAgNnKi?rjtOk?PE@rN`zXKT7U`)9m?%xW$95e}*YSs9 z!b@Glb#X$9a@t$|6Fe_F$FG`_v%P0`obZk`#~A2Q8d09}U3)R~8SvReRhP0X`^A$> zr$2OP&%WX9CdE5X>pikP6F;gaoM;NXDvH6W;!*ae8MkIRnSnxt7{e=}=cIQ6oKV%J zOJ=uVjCtvf9Xpf9M^_Es7A0)94S%r>f3qD9WujZQ;eZ&!&N$+&(UuvPA{b+sgq}aT z&aQ>t0S7M=T(WCp%(ve&yCeI;)a-C?6yX#sLK~D8p^+^qma?V$BJ^7ikFpwi{_b3N zG57#n4xZNqjxpvw;0JFXP8APNjjrAsXQW1HbgQ?O>Xu4GC{-v#7>n>~@I2@2=0w5} z__V72ERn?_8fc>9u%L4Ea@F!plgzXw{ f?>z)8TnXd9{){w|%nPm)00000NkvXXu0mjf)oufu diff --git a/genplus-gx/gx/images/Key_B_wii.png b/genplus-gx/gx/images/Key_B_wii.png deleted file mode 100644 index 99e7cfd634bc39152bcfc6b1bc594671e1c9e8cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1610 zcmV-Q2DSN#P)XjI!3{?^|6Op=-WR4ch&61c7QLQO-&_Ti?YSc`%n{vimVZ7k@6 z3Q~OV&4-B4HxVCv83N+m`XK0&K1+oTDk2(UTJ&~I?rl;>V+RdOHVA@Mc{j$OR4U1-si|tIR5}+$(bx3k$&=sTyLa#F9XodX zbYNgW0-#l%9?Xm=igN`TEWaj zv;rw|&UFCz@A&xmXP)O}eBYnFd-v}2ty{N#wSWJ9o|u@Z4Gj%-Hf0XyoB+T=N*RAo z4TMr^>DaMjG&(xke(KbzU);QTbLZID*mnTj_3PJ7E2AVMEr`f6^QQ{UScY{X>fphH zUjV52zOP!?5Hkw^R(PIQch1o#0uTTLAOa94-&dC|U3vEAEhUj*=orN=g|K zQEM6jP)a##ZO_r8NB`k@o@b146B83_o<4p0%X8<>$wP+@b+)ogd`8OiyqKBY$1;#o zYG(dCm&>g|<8~5&OeT|AJaXiSz)JYQ%;Xv=#6l?*SF2SM$8pOnwALvp<+u5Ke(B-E zhq!h@!1qw{8T` z4FJQ#!+oQpqu->{>DiMfPyX!i;lnY2)H@q%t#!`X_ZcKi`e+@Jz#q_22=V2C0|$D8 zAczZvLfizAOW=$}TU%S`oHNFlj|JdlrJD3J`F#F60I5tS^FjR@2{;2FRGCbs_Nf3w zM9hpJ2>wMx-ONnIVlh5*=FIfm+}v-5hlkCE4I6rvmX_YzXsw;K)&QufbUGa{vyGyt z6^q#SeQmAn%VaXM07_`Es0YArw`|$MH*Va>5YY!r(pnQUTL6LT?CcDP$i{KJqQC&? z#EBEGSS+?1V+H^~2!ZwM*URnOx7*#jcc+PH#Z69pH3D>Xbp-%8ilP+(h=|UgKfkV3 z;1#Jh+6@4pUaw0ux^GRaUAxxTTH7E9RP#pX+`E^qc{QIHaU8=K17i%rFjPqZU!_v1 zs9Y{b^?F^zaf5AAN(dp)qJ6iNFbq+v)ljKaP%f8IsZFKyyt%k*7(GrpL zJP*bg%+1Y3v$M0Q`T6;vR;yK$v-2mty}fPebXvEywWYMy2!a5` zV$lK!0cf>z=T5zC+qQZ-oz~7ddF9HL*#{3EENZPot@Z1{!NIRmsZ?D`X@n34jR#6P z=e%;cJUulvH7SJHP^nbx;NajFd-v}BOiF10)B$M4%s77hc)h*79l2a?Mk!UeeEIT# zwYE110%MG6`vf{{t^IizhT_eeH~-0Ivom+@+z}le9X$Z*%nStpL}XsSel1_UdiCw; z)2DyEu&}Vk_k9>+R&>fHApq^xT1Y83j*N_ap3P?e-QVBegQT@60H{gKn6PJ6({=I= z2mmht{F#}*c|UFtQ5S$e0$79pk0?Jx2#v102;gtbTm^vt0XXYJzZ>sX!Ti_@% diff --git a/genplus-gx/gx/images/Key_DPAD.png b/genplus-gx/gx/images/Key_DPAD.png deleted file mode 100644 index 1316cfd661e074ecd6735065d54a111113bb82c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1189 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 DTkIjJ diff --git a/genplus-gx/gx/images/Key_Plus_wii.png b/genplus-gx/gx/images/Key_Plus_wii.png deleted file mode 100644 index 47568bace1a816189e6db175ce9fa536ed9f7dd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1346 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 Dwr1rX diff --git a/genplus-gx/gx/images/Load_gg.png b/genplus-gx/gx/images/Load_gg.png deleted file mode 100644 index a5d9a1750f9440dd548b3bbfe962594c3f634334..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6452 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 diff --git a/genplus-gx/gx/images/Load_md.png b/genplus-gx/gx/images/Load_md.png deleted file mode 100644 index 86dcf89113ae2c76d14dc65188b2fe35afa70b4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6767 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 LPqkXbD)RpTZ%F|& diff --git a/genplus-gx/gx/images/Load_ms.png b/genplus-gx/gx/images/Load_ms.png deleted file mode 100644 index ecf17d0cc2806747d79c8f116d664187ae27de99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6537 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 al8cy?0L6+mDg%FofV9>1kkzWTvHt_N7i;$b diff --git a/genplus-gx/gx/images/Load_recent.png b/genplus-gx/gx/images/Load_recent.png deleted file mode 100644 index f97e5775b015d42378902aaa9d6f8cb3a337feb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5676 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 by!C_qzQV}z{hOpeNWf6n1X_RBA^QISl8{so diff --git a/genplus-gx/gx/images/Main_cheats.png b/genplus-gx/gx/images/Main_cheats.png deleted file mode 100644 index a9fdaf62df10150b25a11b438b82ea191ac402aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2122 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 diff --git a/genplus-gx/gx/images/Main_file.png b/genplus-gx/gx/images/Main_file.png deleted file mode 100644 index 0332f5ce929610e87e2caa07f255b20f22819398..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8028 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 diff --git a/genplus-gx/gx/images/Main_load.png b/genplus-gx/gx/images/Main_load.png deleted file mode 100644 index 11aa6d980016fb61596fe24f284654b08980086d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11581 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 diff --git a/genplus-gx/gx/images/Main_logo.png b/genplus-gx/gx/images/Main_logo.png deleted file mode 100644 index 8efaa5222bf9d1fcc09e38fc6df05448b125f120..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22305 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 V!hRt>!ezAxys?E*wV`{`{{SH`b6Wra diff --git a/genplus-gx/gx/images/Main_options.png b/genplus-gx/gx/images/Main_options.png deleted file mode 100644 index 9536d9f712db3e7fc2b7f797d7b9e42e32993505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7506 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 W80(LEpa}fSfsndJI+a?sFaHnXISLy9 diff --git a/genplus-gx/gx/images/Main_quit.png b/genplus-gx/gx/images/Main_quit.png deleted file mode 100644 index 00dcc7deedd9ecdb8bd01b2b83a638a76e8e2a78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2242 zcmV;z2tD_SP)`H z00g3cE&%}x%5t%-rjR&3KKJ5 za&mL;J$s-1?X}NZYp=C-Pk(>E;Xp);#WvURi0g4b7UB-9Dy8%d z$2fY1N+=>G$Uz^5>5|Cy7>{l73bY>5i`7_;RalC9a2tMy$4V({hBBVUgd$>VDS^|m z3tl57)C9}%FZ>yo;hs{;vrRf`L?|M5!WZy@ z`@k;ooRrqrODQ+iX;_O;L>!GX@b+56YmR^5+ohDtyKT@lp@=vMXJM~F{(cTCs?R>D z1bVDj3}d?;&>(mW=i%aR-m9(%MZ_Vv0#n+4UWI>4EwvC2;2BA#PinLY*bg(XD_&iL zNIO>G94W0AsrQK39tU9YCTA`pcEq`DWY*wLT!VQPkw;4@&upaqMC>bx9WIyaq?&{# z;7d|kKW^)L8yr>jc`zR6D51(&o`+9YKh4LF@N3L3rPLZ#MeaQ~RnBNntqypyYJWSX z;X^ncudM!`vr$43(OcboDYmFcd=s~nQif!WBVr#pacocWFzPyM~M2yG#u0O0u0%G(THM?2b`2(>)1is5ky3fG>kjTIK-Q}xcmj*1*F6un;1Mh@rL61JK}2kct>kKWqugdp z!|SDYKS^il{R|&ycak?;a_`jro@EQXs=9W^Ea_}6mtMx{nA53)Qp##+<)6gE)pDMI zt?@b>SoOQNlwP|gT!bq&^!Q&OR5_yu>R#L%Vw?|C!V-K#I?n^pE}?@kx$Yn~z&fcyFU8G6>`N)-dAXbyV}3;ZRlW|ZN-6gb)~21% zO!-3AMZY9+Kd#0Nm^0Kp(_pAx{w1C68OsZrXQq5X>te0kL7suRrIfXsxPP;vC82#~ z2zN|_KKk)QDW#(Vc&X5GP7k%-kk-W*OpAzV!!n{FqD5$?=Gv`S8pW?gMAJUHLPYEq z5mP%3rt;mUY3_Nq?84FbVr49c9T9P;j5wXy>AqeW&zj=Jd!r^V_gOfx3V#g?B0{8# zevw>B9leiUe9S;~-6ta`zryo1pFd8{;D?8URHc0nld-{lWQ6wOPHlQ-%$U)#7yZ(0 z`2nuP#4n^z_s>mjHLB3=bi7%ihQ(pzP{G8rQs-0fs;c7|MD6WjW@5g+eH+TCU!X36OP5nYlP4C~~s zcbRlRTSk10bUr7_4c~^w{SP>^l=Am(9#SViG*w1AXUna_OMz=}b}40kw+-rM@FvQ4 zHr^#{~-^#7_R9EXkeKOj)Oh#>5v4|V6ut5}Q z0ER7CUwH<*V5&?JhV?;?UP+`+CYBe<9c__za7Ep0;Knc_vJb8tE7%G}19jXryD5&`8H9p^=VJLL(icgho34 z?+Ded_NWRXjL!^JIu1)qDc4pB>DjV!WwkuZ zH@>=7;p%P+;+vGO?12kqLBvf4o-V#mR-sIl$7uG)$q}(jMRZqrI%|qdJOD32pdl7$wx57Pf){00Bf;0W9Q0Ij~8vk)9O QtpET307*qoM6N<$f^=dW1ONa4 diff --git a/genplus-gx/gx/images/Main_reset.png b/genplus-gx/gx/images/Main_reset.png deleted file mode 100644 index fc28747d6f99cbae223109b38c187520461ae8a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6399 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 M07*qoM6N<$f+rLde*gdg diff --git a/genplus-gx/gx/images/Main_takeshot.png b/genplus-gx/gx/images/Main_takeshot.png deleted file mode 100644 index 963abab6f3707ab69be04f0fc9dcb4bad7d39eb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3544 zcmWlc2{cq+9LJ|nlk7%+gltJ=ZLBGi$u?v+m_ZRUOtK5v_g%7P---%@EZNDD7-fkp zW$bF~WZ(a{d(M6Dym#Ka=icA@-0%1MB6YRZ=xI4=ArJ^XN?lnWoDD(eg`NY)n9)a< zz=_%wi86$O<^#2k0M{3s)G@9Q2<`g6eg;`0mHO`uHx&~%14q1@houV+qGf62;%JYv zCRp;S5?pW|jxKhtyjms=@izp)vzPuod*20T=|*sL;58)J;~)}J;*xN23Hip1<47p%{l6bH&8uh z>}SZ;+zIxFq;GlxuCd+6Uk=nuTP*@SpG4Q??!^CnLU_9s7|M{OcE$VQq3#8iq|Leq3%}&YM!3mEyQItKbb(& zFNC;wA2V%e`PfryYwIcZhVHH|i@o(}y2~=ly}gS(NSKP)!$x&)Z-v;{SS|(knAKGW z0XV$U{_k9OPl~AN&LjM!owJ7)l19m5wllWZ^-u5d`g%L#X}1JjMP+506oG|6Af!Aw zMcf;dx_$fh-qB{Cywem!M{(c!*~5nu-_gZJSz*PfCZW9f`T5@LY@W5D_Xe{wv$JXP zu0mFwF?9;?Jp?TpO|Z3{B702YEG&4XaHJ&MuaEYJoR3kld_#tK9i2Fj?{84fV`F15 zHa1D?E~etR$+fqIg<-+x8E3Y=7FJeNQgC2Q=i6Biaul=P=J=%#4GlHOky}LR+V7#! zFcl>14IM%o^y%+>Puzbn*j&At7``vtp5Ak& zJh4%azH`3zL{sS2&F|dzgw72E)-F zMz0wW9ev1H*+S31*yy=2b2#mkD)0LH<;#~4<)pFx{!a!vcR$xU&z785MhK@r*levY zrINsrU?dXBq!Lfx;J#8HEp=pXQQs`z2MRdx{0}#%9sX+?{H+NS_0u3;T`ab~f5lzF zOzc0#JL?dp$h2?PB#0-a7ssQZMnIbzg^o^Knz4bhiNP{_P)RM2KRD227}q!+378(32qH?l6(4|HMgiJYGd{bmF_N@TVEGR ztKOx=aTVq~`(^+&cWR)hBkCV@{bJ!uAOBkwFh1%1R_n}AZMXZ^V03xHvidiWW3CXE%B8P7EPE@9@xGyeMi~Hlhg_g%lJNfIGi?v+S4` zHatt0Xa+)5Svkxzv{NO{=)nwDe0_c4+Bu3^1j2jifRQC!YY+{ym6jRme5eSYMaog1!!6<4HS-V0(#1U*%$8g;IMy z9$>Y#Rj*K%<5C@9gNf#AV^UBk6dx0Ge2Dr1S`1qi@qF{Qp0ROw`*iv0+USR1@cA?} zG}gVEhPMw64%i)oBYN%&%8rYjy9uu!HAW{h3#dXY!qt7R_Eg|RP%JVT^z9P5f>&pL z7hOVW++TS!p3`>E6QVUJax1u%Hxd>3&YcaDsP~KwZ7k{5?hw@oUN9fa4)1Q8aQMtK;^p&nnqVdMTH_<%lXOp4__U;ZcLT<3`cFt)Os*AN5Bg z5y^6*>E}aKyeW1rSm|saB=BB@=IwB zOrpRW(ygfc{_*h#Mn=Q*r#>z&w}?dI@_1e1KkY9r-q`n%MW2XZtDrf3HlcLz1=yua z6Yl%cqo2#R4}rnenw2Vg`}p`|ksbbY#S4f$Y-Dej0J3@1xylIO?$)D-ENM09h zR0(f5?m%pJT3&4L(xUW@q46X-WS@!FeDlcmSO@VnEu+7 zliXT&DaQ^)@ZI?QrX2NSJ#}tcgc9!Gv`P+SMc(FGJkz@Sud8keH zb0PefpGkFNZPVpHf?9d=g=cmT;{`8(1mfUOSX%nxivLmk(b3T_qp#$Ex{cRGHxdLv zetO&m_g70i8nemagCgx*T`PYvl=~j;INJ1Ouap%RyK>39gp7}y0ZD#78!Njv70d{1 za~4=?93T94Y3c{udXuiOvW?BP>gwvoou78rHa3%P++JlC!z1a181z>Qq}DWbu#$GB z9H_+kw6rwMGs|I?APdUN%U=%g_dZ;y*`J9PXTR$uwfUz{EkO{Z8BDW}eBa&OOqF~T z7Pu3i47N!vj%U6jlC=a|9hH33_@s<>sUehdcEa%8QDI?W zy95O~_xZm^cbq{;LEvz>559-)cIzOud~_gd7#Ur<_@9{d(cXrnwJIwoZK&L{MHukr z{Iaq*Tu;izVsY7oL4pI#2)`5)bZYnT0`=Jxw_EsC#YMrK$UHHoREnvPJVa`AJ z$fF>teXOpk>S$VTyD0LgIdgB%6WDT7Q>Yk;Bq_0s5k>?W+26Yh5%cGL*3vOah9UM-EtD1%- z|JE)pE*gM1>zsH^r?9axGbDui=Etg<8Uu6lZ`1AJ3lvKEW6=1mzPu;^0}}=dr(Nn+ z=>_*R~*g=0TNzOc*cxID-yd&j$zvCgxdqFY`~lPA-4ca9j}CnqPr_44wXX`7bF zkg=Z`P`gsCE^XXD9xvO6Ini?xMXKm^ENxf#pZd|YLt_CLC{xpnf(NWSt-C$#xAl6JYKA)SPx2zm1p=U&+tzIOZPFUjiY>{zS5ZY)o8`yO~P8NG! ziJ#UHi7PQ<2u}aK52{Al`qPcbRs(%>hX1?(RO7 z2mzVMb!Qm^8t$eW;q#C#wnj%;(qg zhysfABIZ=jf`RzD%#4W INQ} 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 PBpRY1tMZ^&#?b$NlWw)H diff --git a/genplus-gx/gx/images/Option_menu.png b/genplus-gx/gx/images/Option_menu.png deleted file mode 100644 index 6df9dc9bc640c2fcd1b4a3030f3a3ad2dd586ede..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2482 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 diff --git a/genplus-gx/gx/images/Option_sound.png b/genplus-gx/gx/images/Option_sound.png deleted file mode 100644 index bc0a856a8521a30fb96e38ad27fe3ad067e9aa08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4305 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 bq6&R-NwDhl9XbpCT!8eov07D{jt~9^RJ9{i diff --git a/genplus-gx/gx/images/Option_system.png b/genplus-gx/gx/images/Option_system.png deleted file mode 100644 index aef047a9ae7b07179019f39603577f75a47aa773..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9709 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

&p}DmESI>nB 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 A<^TWy diff --git a/genplus-gx/gx/images/Star_empty.png b/genplus-gx/gx/images/Star_empty.png deleted file mode 100644 index 746ea7111356f71bde8030924d41be6eb1e8ea40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 812 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 diff --git a/genplus-gx/gx/images/ctrl_gamecube.png b/genplus-gx/gx/images/ctrl_gamecube.png deleted file mode 100644 index de72f951c8a77eeccb35a49e3ac9a44d542a01a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1310 zcmV+(1>yRMP)4 zrD#}=)9@+Q;3Evr`TjTtqwx%;V+l53E4E-=&P~VDxH9+jPmJOCII%y?Sn4@cjYO)d z>V=E(06H-XzvEZ*#<4gQd!QX{8Kg>sk_KJagyo4f9h)%(`y^H$T#J`VDO=E#&|ut| zr}-BBa4?R?PIk=r3t!_WtjEz_2&AGNZ8aKL9)Mr6A(A{Cct#_ypf! zEmozq`mMyMQi`^!s`kPd3~VX!9K3^h*i&@Ndb}YzX?vpsQ!?NnJce^|4qj>T9f&bi zRqY8^VQDSf^%#dkFjx?8f++U}JcKAj$MSLyqA9O z5^V3xiD{zCZqa7)2X@gx8pFu*=e{j4}XQwtod!C z^*85TE=j=1tx-JndIzW(f9S#tR{t1rAYOl%!+iMsfmr`ymrOYg)yoZ-@W>r;{ zAp9ouZOa7y%1y%rc^}hF+@*L`2xLQ>h6tX_6?eZo_R2)&#C}%3+z_G z(;IMpCbW^@z-;`PrF{!~<0QeOvvDLo(@fgiv419aK-v)Ohw^Q0wDJHKUrPxfKPUY5DoR0F>m_tyfp+N2CTt~U3S zAa6S+<=l&T<;USZp;N6`Gc(q>j9oI9ruS(f?iKV7yL7Tq^e@U8JquEuj2@PIyR6$o;mZ?kkXcwKZrIhl5P|;KIL{(L1LseDB;SupJEfPdsnpi`G z*e=ehe2?9PcD-9lc{wYwuV$Utc0HHqet>7?NgCuGRP!4ocvJA2;N8l^zr5zx zmNDuvH)JlRXx4?b7}6oTxiS0MrB(3Mr!W9Kk+79n0MY- zcpiOP0ct?IpnY5GHNSrHKh`$Z`{0FI++T1(<3tUqUw~oT3$~+7yqya&_IUL98}c^& Uli|8R0{{R307*qoM6N<$g0uv19RL6T diff --git a/genplus-gx/gx/images/ctrl_nunchuk.png b/genplus-gx/gx/images/ctrl_nunchuk.png deleted file mode 100644 index fc9ea5ff0be3555c977c775973a66f4c5d9957f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1329 zcmV-11kgm{_?N3He5+*o!O_K}T3GLWm*} ztt?0lv`~=(|6nxH5-NgVSYqkaH?ct7Ol{dDINOt z*nzY0%OfnlY25yXqi!yVf$@n1FV_(y; zvN;O7v1iyqwFZ;e)pGThCU_1m$K!ajues%ZNr!Y2<~QNd&JS8DzJ-ssh%IjP7~nU! z4m+_Fn^cZIjT5o188!ngDo=Mv_hshpw*Ejf;(DBwnXh33K7mKD9K&JrV08-@`~j!5 z_4>^G{W#?v3_9z1o%Mu@>Unr4B7Te&xKc%GSL3_eRAKDGXYuFe*|IT3cNT8I_f?C1 z2*1KFbh-v#!n;lGZk&s&I=VJt^{@%d7OrPoBu>NCnfXT7)rh#N34XA7doM1){W!9B zcSL8s0R2b~5JP;pvw4%sdt!4>`Puj~)@J5YjrJ9lU@AMQ*HYIaR5BUiDnvR^s^PPv2^%&e=-hCb zxjQ1BQgyJQL;qi!o+owb4U3!HC-Et4RneVPbK__%8sH!8ncut|g|c6uKg4knaa%+z zjfi;>v0An4otgP^Z~rni0e`BB`+*jvjq1)=fJH;Rp(fMm&49@!U}slaX1)~>m*Q5{ z)7x-7{)3;HiC0x^-K(N{a>uDl)Z~4An3)+7f5O^kRrgMqhRocGFGR#SsvfrBo2p>{ z-QTW?bAEfD*W*uOa@bxTRqeD8i||)GJjSb$ArC`D3{}z28MAF%SM>QY3dt5+i&d(6 zugT0A<97@eHbE1!*gF;j$imI)lDI!J*U$3&$jixt?m7sDz4vF-eLY)@Ms8nDA3N|9 zRV$b3)I|l5@GrtoN3)S>J;Xnrb7V9G7VpW)PjW4DNRpno6>n(>c z;M9otwsLMomod$N%zQQ?zKdIMqxzsQ#)y6DrrWGO$M+t>fMf83af}(c%go0j;(VN{ zI%3*r?qOs50zMSB<0j?(*VS+vZ$LBRb(Mm{h0U4yqllP`&#PPUzy=&9bblmPN5r+N z!&Y_p`FkSrduJw@I3|R zV=tb<67E!8)-C3Kwa}N;!k^3jnLajW(;$-*98()=ZwF)%x8ttNwPT3)R5#73wOS5= zBLmgXqp%-^$qGJ*T!%VfyZwEf!MpfX?U~ELn~6-NA7(A9v0BK1+NED4qkZcnq4vmI zkz-HRZ_0g$pK!YErTNg|ITQBj@q zoq9%{P%Zg(>NOw6=dGDwlHYS!=|_%@$z&yy-$af_1Nx$B#T}9Hv)m8jL%gOIc|P)N zQIC$3rD+zQb|Ezu__ z?w|wS9m`p_5ILFzIopEM`5ttF+^U{MLu*YZ0Br{Cb64}N0YBO_&B`^*^&kByLB>$JX0000iSnz|Eta!*(rD9 zAhs}f^Rj{stk=ef71#a(IRVuxiM z!~OUgXHt2$Qdua+j;5{0aJs`P_TehdVgF46%yW!#zKA{8i`5P@OmQv2CXH9Sktw#( zW1P-TGn%2xgIRjLx=ZiNfy+3KSJTG3_#6ikbSSpW1anpz19Sf$$-2n*>j?r6;SKyC zGI5=bea_2ibUVXcYQPGx7hHb;uQkRA7OkZ58RlJHto-dw#oIIdKNIwh+#f`KpTH}4 zyfJGW(6kN6UvvPdm_f-i7Hbb`JG=rg>1iT(_p zPtXm#h3_-k<9ImlRiR$MDbWoM;(P%VW9FIfF;3uxG!FORWl=as@LW1E%JDZo&eR>w zNbB9Mhu4<+FE}e0QgR3{W;Bo3DW~wADA2aIjWMbS3Sb#ma8gutE62pUwA4K#a$k1J z@VNAfhNE21MX_DMJAx6dlnz0L_eH)ZGUpbl-Vs5I+KW7{<8AS{vj(Ih_$nP(O~chL zT4zS(QK8P$*bHm9BpCFmps3XO5+CJW^|K-8zOkpvMa@Gh)YyYR@IhXF8sFeO!SywZ zs;^2Pa-LwR%f(pGtcs~Tn&2i z@lOy`L=c~aU}IF`s}RIsiUeOVCPK_+%~;GVxrV(s z(p+cyjwNg>%zOiG!yR0L9t`=D$%enfr-Hd6zk#cNiJ6ZNp{Imtj5f*e1@_^rS-JBz zfswRXe(WLc<7*4{7Gk5AE{n9+aubv3;HM#k4_TJI#T%?cmnd()n8+ZG;tW<{IeODR z9g6FI47c$Ehp`@YJjPw@$1brf8&*rP+MWVvP=5`ZQ3)Xs>!%aP@g1MBCxoEkxR9_v zaUSRJMO3DlynU!9Y;OwWHM-N-7QC8+>Bo+86Bb%^bwmDzG*R9vsAO4I$1<}`z9P+6 zTgB0XN4Sm$7#ADuO3HROUW&}tMb`RpNMxcH-%>Jlv93o%35ysW$35J{#~k)KF5_AH z&tsm5)!+zjVIvNt%>o9n0VhPs<{mnM;W{^i%r&zi(=!nC+4>$ z#ybk+S(!X8emB*Pk!m1Cle!(v8DEuM#?Bt9H{S$dkQ*eWtJnGR^P gc%Eh$3?WSY2D;}56kuNd3IG5A07*qoM6N<$f=iAk9RL6T diff --git a/genplus-gx/gx/images/generic_point.png b/genplus-gx/gx/images/generic_point.png deleted file mode 100644 index eb79fbd4202cb14c5a95ed1f96851338d006361c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2200 zcmb`J`6CmI1IEY8vN0xij+UG&;&p3|F*j?jGUc{R%~8h6v0P(`EGb9h>kcu=ZSE=O z>&lgpQoSJxQ^Lx(@Bi@q;dwrvADr< z#K{;X{HY?f6TL8$K#}do2VHnl5aaV=TSLJc^qdQ6L^A@tv-!4-x$GiI_kS}>Cg z?YX&!3X;&`aRdm8_3%Cazsq7?neqpx;QSvx%xT4S(FQ28Ujik#qTzm@skCvDf3<%o zMLO&Lt)$Qx03DfKo>kZw$gQJFOHNSd9Vs_Hyy|^{8-W=ZNZnU30o&Y{tKTz9y(PXa zb=f>t!}mlIjx_Wb zh+^@#NoUxysbSQHw451PEF0OO*kerLVyM(xu6zfex(EE42N!eY}8O%g)@MyG$ZeSy{P+$zHoe@u(nQVq=g%9RQq&B>rGEj&p+XC zCHYMA#jg5_=$Mvh9M%4{gm6n#CZK+I3~~24<#n0f?nt&FfHj(@b11J9JcYs&2+3S7_jjl3h1esIh3eDdbshGn+>0uN9q*&OhQJ9+iDK>KmQn&sTW)lt{vzyZ_9W~{6{^5YVXvviK%;E@e0!@^NTunWo}QK z$D(@DoU(|Q!u$@GAduH^&}ie`l=Ln}NVSN`FcEOz*q^Q^XCu-#yb_BL!N|{o4TffR zqbNmqPf+$4JVCalZwyDRk2K~pC{gDXa^{MgOD4+u}CN@DX!^x`yrqMT;4DcPgmto1t9 z1URTk{>{ZYgsiezr}W%s0<2aoYYY}+_@^SVrlhZ=xnD{aS$gssb6Xon>w@zwM_TD4 zPM6-RS({0dU-7m*OIQzRnrul}HumKA%4Ed&e*4Tg+!o^rdu?;+(lNy4Zm_WYzQWGH z)xpJ#1k=0bf%D5~kB7RV!I?dLw|=J~>HMtNHU6wdRg8N^S{ zurjj>v@HZNq4n5dUz~F&K6xbPFBL+&>AiH282O=HSXV|^7Ori;H?duLhmK7`)LHH` zrz2UQZv^$73PkO=QM%grkPLr}CmQ+nCof%ex%uxL%MEMdYVL!)@L%gV53DPAbF&d9 zjD{&BResteHvul&$}n-oOj+Xv_KlLV5m3I}IIu+Y;#M^&R2DXF`MHz>e*$(TXY=FSqCe*tID#sG=)seI~`kdJntw{XN&Y3T6ILyRA?%9YLQ%aP<74 zV>acAj*+IBU$l5agLCBP1$y&*&=&jjV4A|9g4>ISi!Biz^-D%6zi9@*qNYz}h&qlj zOaE>8#PW=z1((_yMhsPOo2!WzJ$>^dVfNsZeOo?f;7z1r7P9;tB(r!U$Xw7oDCoQ# zVP7cJyW9GoBiO$%&F`uYju - -#ifdef HW_RVL -#include -#include - -extern bool sdio_Deinitialize(); -extern void USBStorage_Deinitialize(); -#endif - -/* output samplerate, adjusted to take resampler precision in account */ -#define SAMPLERATE_48KHZ 47992 - -u32 Shutdown = 0; -u32 ConfigRequested = 1; -char osd_version[32]; - -#ifdef HW_RVL -/**************************************************************************** - * Power Button callbacks - ***************************************************************************/ -static void PowerOff_cb(void) -{ - Shutdown = 1; - ConfigRequested = 1; - reload = 0; -} - -static void Reload_cb(void) -{ - Shutdown = 1; - ConfigRequested = 1; -} - -#endif - -/**************************************************************************** - * Reset Button callback - ***************************************************************************/ -static void Reset_cb(void) -{ - if (system_hw & SYSTEM_MD) - { - /* Soft Reset */ - gen_reset(0); - } - else if (system_hw == SYSTEM_SMS) - { - /* assert RESET input (Master System model 1 only) */ - io_reg[0x0D] &= ~IO_RESET_HI; - } -} - -/*************************************************************************** - * Genesis Plus Virtual Machine - * - ***************************************************************************/ -static void init_machine(void) -{ - /* system is not initialized */ - config.hot_swap &= 0x01; - - /* mark all BIOS as unloaded */ - system_bios = 0; - - /* Genesis BOOT ROM support (2KB max) */ - memset(boot_rom, 0xFF, 0x800); - FILE *fp = fopen(MD_BIOS, "rb"); - if (fp != NULL) - { - /* read BOOT ROM */ - fread(boot_rom, 1, 0x800, fp); - fclose(fp); - - /* check BOOT ROM */ - if (!memcmp((char *)(boot_rom + 0x120),"GENESIS OS", 10)) - { - /* mark Genesis BIOS as loaded */ - system_bios = SYSTEM_MD; - } - } - - /* allocate global work bitmap */ - memset(&bitmap, 0, sizeof (bitmap)); - bitmap.width = 720; - bitmap.height = 576; - bitmap.pitch = bitmap.width * 2; - bitmap.viewport.w = 256; - bitmap.viewport.h = 224; - bitmap.viewport.x = 0; - bitmap.viewport.y = 0; - bitmap.data = texturemem; -} - -static void run_emulation(void) -{ - u32 sync; - - /* main emulation loop */ - while (1) - { - /* emulated system */ - if (system_hw == SYSTEM_MCD) - { - /* 16-bit hardware + CD */ - while (!ConfigRequested) - { - /* render frame */ - system_frame_scd(0); - - /* audio/video sync */ - sync = SYNC_WAIT; - while (sync != (SYNC_VIDEO | SYNC_AUDIO)) - { - /* update video */ - sync |= gx_video_Update(sync & SYNC_VIDEO); - - /* update audio */ - sync |= gx_audio_Update(); - } - - /* check interlaced mode change */ - if (bitmap.viewport.changed & 4) - { - /* VSYNC "original" mode */ - if (!config.render && config.vsync && (gc_pal == vdp_pal)) - { - /* framerate has changed, reinitialize audio timings */ - audio_init(SAMPLERATE_48KHZ, get_framerate()); - } - - /* clear flag */ - bitmap.viewport.changed &= ~4; - } - } - } - else if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) - { - /* 16-bit hardware */ - while (!ConfigRequested) - { - /* render frame */ - system_frame_gen(0); - - /* audio/video sync */ - sync = SYNC_WAIT; - while (sync != (SYNC_VIDEO | SYNC_AUDIO)) - { - /* update video */ - sync |= gx_video_Update(sync & SYNC_VIDEO); - - /* update audio */ - sync |= gx_audio_Update(); - } - - /* check interlaced mode change */ - if (bitmap.viewport.changed & 4) - { - /* VSYNC "original" mode */ - if (!config.render && config.vsync && (gc_pal == vdp_pal)) - { - /* framerate has changed, reinitialize audio timings */ - audio_init(SAMPLERATE_48KHZ, get_framerate()); - } - - /* clear flag */ - bitmap.viewport.changed &= ~4; - } - } - } - else - { - /* 8-bit hardware */ - while (!ConfigRequested) - { - /* render frame */ - system_frame_sms(0); - - /* audio/video sync */ - sync = SYNC_WAIT; - while (sync != (SYNC_VIDEO | SYNC_AUDIO)) - { - /* update video */ - sync |= gx_video_Update(sync & SYNC_VIDEO); - - /* update audio */ - sync |= gx_audio_Update(); - } - - /* check interlaced mode change (PBC mode only) */ - if (bitmap.viewport.changed & 4) - { - /* "original" mode */ - if (!config.render && config.vsync && (gc_pal == vdp_pal)) - { - /* framerate has changed, reinitialize audio timings */ - audio_init(SAMPLERATE_48KHZ, get_framerate()); - } - - /* clear flag */ - bitmap.viewport.changed &= ~4; - } - } - } - - /* stop video & audio */ - gx_audio_Stop(); - gx_video_Stop(); - - /* show menu */ - ConfigRequested = 0; - mainmenu(); - - /* restart video & audio */ - gx_audio_Start(); - gx_video_Start(); - } -} - -/********************************************************************************************************************************************************* - Get emulator input framerate (actually used by audio emulation to approximate number of samples rendered on each frame, see audio_init in system.c) -*********************************************************************************************************************************************************/ -double get_framerate(void) -{ - /* Run emulator at original VDP framerate if console TV mode does not match emulated TV mode or VSYNC is disabled */ - if (!config.vsync || (config.tv_mode == !vdp_pal)) - { - return 0.0; - } - - /* Otherwise, run emulator at Wii/Gamecube framerate to ensure perfect video synchronization */ - if (vdp_pal) - { - /* 288p -> 13500000 pixels/sec, 864 pixels/line, 312 lines/field -> fps = 13500000/864/312 = 50.08 hz */ - /* 288i,576i -> 13500000 pixels/sec, 864 pixels/line, 312.5 lines/field (two fields = one frame = 625 lines) -> fps = 13500000/864/312.5 = 50.00 hz */ - return (config.render || interlaced) ? (27000000.0/864.0/625.0) : (13500000.0/864.0/312.0); - } - else - { - /* 240p -> 13500000 pixels/sec, 858 pixels/line, 263 lines/field -> fps = 13500000/858/263 = 59.83 hz */ - /* 240i,480i -> 13500000 pixels/sec, 858 pixels/line, 262.5 lines/field (two fields = one frame = 525 lines) -> fps = 13500000/858/262.5 = 59.94 hz */ - /* 480p -> 27000000 pixels/sec, 858 pixels/line, 525 lines/field -> fps = 27000000/858/525 = 59.94 hz */ - return (config.render || interlaced) ? (27000000.0/858.0/525.0) : (13500000.0/858.0/263.0); - } -} - -/******************************************* - Restart emulation when loading a new game -********************************************/ -void reloadrom(void) -{ - /* Cartridge "Hot Swap" support (make sure system has already been inited once and use cartridges) */ - if ((config.hot_swap == 3) && ((system_hw != SYSTEM_MCD) || scd.cartridge.boot)) - { - /* Only initialize cartridge hardware */ - if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) - { - /* 16-bit cartridge */ - md_cart_init(); - md_cart_reset(1); - } - else - { - /* 8-bit cartridge */ - sms_cart_init(); - sms_cart_reset(); - } - } - - /* Disc Swap support (automatically enabled if CD tray is open) */ - else if ((system_hw != SYSTEM_MCD) || (cdd.status != CD_OPEN)) - { - /* Initialize audio emulation */ - interlaced = 0; - audio_init(SAMPLERATE_48KHZ, get_framerate()); - - /* System Power-On */ - system_init(); - system_reset(); - - /* Allow hot swap */ - config.hot_swap |= 2; - } - - /* Auto-Load Backup RAM */ - slot_autoload(0,config.s_device); - - /* Auto-Load State */ - slot_autoload(config.s_default,config.s_device); - - /* Load Cheat file */ - CheatLoad(); -} - -/************************************************** - Shutdown everything properly -***************************************************/ -void shutdown(void) -{ - /* save current config */ - config_save(); - - /* auto-save State file */ - slot_autosave(config.s_default,config.s_device); - - /* shutdown emulation core */ - audio_shutdown(); - - /* shutdown audio & video engines */ - gx_audio_Shutdown(); - gx_video_Shutdown(); - -#ifdef HW_RVL - /* unmount all devices */ - ISO9660_Unmount("dvd:"); - fatUnmount("sd"); - fatUnmount("usb"); - - /* shutdown all devices */ - DI_Close(); - sdio_Deinitialize(); - USBStorage_Deinitialize(); - MOUSE_Deinit(); -#endif -} - -/*************************************************************************** - * M A I N - * - ***************************************************************************/ -int main (int argc, char *argv[]) -{ - #ifdef HW_RVL - /* enable 64-byte fetch mode for L2 cache */ - L2Enhance(); - - /* disable DVD cache */ - DI_UseCache(0); - - /* autodetect loader arguments */ - if ((argc >= 3) && (argv[1] != NULL)) - { - /* check if autoloading from USB is requested */ - if (!strncasecmp(argv[1], "usb:/", 5)) - { - /* reload to IOS58 for USB2 support */ - if (IOS_GetVersion() != 58) - { - /* warning: DVD support will be disabled after IOS reloading ! */ - IOS_ReloadIOS(58); - } - } - } - - sprintf(osd_version, "%s (IOS %d)", VERSION, IOS_GetVersion()); -#else - sprintf(osd_version, "%s (GCN)", VERSION); -#endif - - /* initialize video engine */ - gx_video_Init(); - - /* initialize input engine */ - gx_input_Init(); - - /* initialize FAT devices */ - int retry = 0; - int fatMounted = 0; - - /* try to mount FAT devices during 3 seconds */ - while (!fatMounted && (retry < 12)) - { - fatMounted = fatInitDefault(); - usleep(250000); - retry++; - } - - if (fatMounted) - { - /* base directory */ - char pathname[MAXPATHLEN]; - sprintf (pathname, DEFAULT_PATH); - DIR *dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - - /* default SRAM & Savestate files directories */ - sprintf (pathname, "%s/saves",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/saves/md",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/saves/ms",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/saves/gg",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/saves/sg",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/saves/cd",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - - /* default Snapshot files directories */ - sprintf (pathname, "%s/snaps",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/snaps/md",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/snaps/ms",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/snaps/gg",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/snaps/sg",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/snaps/cd",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - - /* default Cheat files directories */ - sprintf (pathname, "%s/cheats",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/cheats/md",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/cheats/ms",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/cheats/gg",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/cheats/sg",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - sprintf (pathname, "%s/cheats/cd",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - - /* default BIOS ROM files directories */ - sprintf (pathname, "%s/bios",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - - /* default LOCK-ON ROM files directories */ - sprintf (pathname, "%s/lock-on",DEFAULT_PATH); - dir = opendir(pathname); - if (dir) closedir(dir); - else mkdir(pathname,S_IRWXU); - } - - /* initialize audio engine */ - gx_audio_Init(); - - /* initialize emulation */ - history_default(); - config_default(); - init_machine(); - - /* file autoloading */ - int autoload = config.autoload; - - /* autodetect loader arguments */ - if ((argc >= 3) && (argv[1] != NULL) && (argv[2] != NULL)) - { - /* automatically load any file passed as argument */ - autoload = 1; - - /* add the file to the top of the history. */ - history_add_file(argv[1], argv[2], 0); - } - - /* automatically load first file from history list if requested */ - if (autoload) - { - SILENT = 1; - if (OpenDirectory(TYPE_RECENT, -1)) - { - if (LoadFile(0)) - { - reloadrom(); - gx_video_Start(); - gx_audio_Start(); - ConfigRequested = 0; - } - } - SILENT = 0; - } - - /* show disclaimer before entering menu */ - if (ConfigRequested) - { - legal(); - } - - /* initialize stub loader detection */ - reload = 0; - -#ifdef HW_RVL - /* autodetect loader arguments */ - if ((argc >= 4) && (argv[3] != NULL)) - { - /* assume proper loader stub exists */ - reload = (void(*)())0x80001800; - - /* return to loader when POWER buttons are pressed */ - SYS_SetPowerCallback(Reload_cb); - } - else - { - /* autodetect HomeBrew Channel stub */ - u32 *sig = (u32*)0x80001800; - if ((sig[1] == 0x53545542) && (sig[2] == 0x48415858)) - { - reload = (void(*)())0x80001800; - } - - /* by default, shutdown system when POWER buttons are pressed */ - SYS_SetPowerCallback(PowerOff_cb); - - } -#else - /* autodetect SDLoad stub */ - u32 *sig = (u32*)0x80001800; - if (sig[0] == 0x7c6000a6) - { - reload = (void(*)())0x80001800; - } -#endif - - /* RESET button callback */ - SYS_SetResetCallback(Reset_cb); - - /* main emulation loop */ - run_emulation(); - - /* we should never return anyway */ - return 0; -} diff --git a/genplus-gx/gx/osd.h b/genplus-gx/gx/osd.h deleted file mode 100644 index 4caec0e8c8..0000000000 --- a/genplus-gx/gx/osd.h +++ /dev/null @@ -1,86 +0,0 @@ -/*************************************************/ -/* port specific stuff should be put there */ -/*************************************************/ - -#ifndef _OSD_H_ -#define _OSD_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef HW_RVL -#include -#include -#include "vi_encoder.h" -#endif - -#include "gx_input.h" -#include "gx_audio.h" -#include "gx_video.h" -#include "file_load.h" -#include "cheats.h" - -#include "config.h" -#include "fileio.h" - -#define DEFAULT_PATH "/genplus" - -/*************************************************/ -/* required by Genesis Plus GX core */ -/*************************************************/ -#define GG_ROM "/genplus/lock-on/ggenie.bin" -#define AR_ROM "/genplus/lock-on/areplay.bin" -#define SK_ROM "/genplus/lock-on/sk.bin" -#define SK_UPMEM "/genplus/lock-on/sk2chip.bin" -#define MS_BIOS_US "/genplus/bios/bios_U.sms" -#define MS_BIOS_EU "/genplus/bios/bios_E.sms" -#define MS_BIOS_JP "/genplus/bios/bios_J.sms" -#define GG_BIOS "/genplus/bios/bios.gg" -#define MD_BIOS "/genplus/bios/bios_MD.bin" -#define CD_BIOS_US "/genplus/bios/bios_CD_U.bin" -#define CD_BIOS_EU "/genplus/bios/bios_CD_E.bin" -#define CD_BIOS_JP "/genplus/bios/bios_CD_J.bin" -#define CD_BRAM_US "/genplus/saves/cd/scd_U.brm" -#define CD_BRAM_EU "/genplus/saves/cd/scd_E.brm" -#define CD_BRAM_JP "/genplus/saves/cd/scd_J.brm" -#define CART_BRAM "/genplus/saves/cd/cart.brm" - -/*********************************************************/ -/* implemented by Genesis Plus GX core (GC/Wii specific) */ -/*********************************************************/ - -/* 32 bytes aligned sound buffers (8 samples alignment) */ -#define ALIGN_SND 0xfffffff8 - -/* use Wii DVD LED to indicate when virtual CD tray is open */ -#ifdef HW_RVL -#define CD_TRAY_CALLBACK *(u32*)0xcd0000c0 = (*(u32*)0xcd0000c0 & ~0x20) | ((cdd.status == CD_OPEN) << 5); -#endif - -/*************************************************/ - -#define VERSION "Genesis Plus GX 1.7.5" - -#define SYNC_WAIT 0 -#define SYNC_VIDEO 1 -#define SYNC_AUDIO 2 - -/* globals */ -extern void legal(void); -extern double get_framerate(void); -extern void reloadrom(void); -extern void shutdown(void); -extern u32 Shutdown; -extern u32 ConfigRequested; -extern char osd_version[32]; - -#endif /* _OSD_H_ */ diff --git a/genplus-gx/gx/sounds/button_over.pcm b/genplus-gx/gx/sounds/button_over.pcm deleted file mode 100644 index 8c4d88adbbd7b9f5537aed1f7b0938b66103131e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmW-a+Y*8>3`7q>DPA7^|Ic#$azE6bCwrX~}L`@ diff --git a/genplus-gx/gx/sounds/button_select.pcm b/genplus-gx/gx/sounds/button_select.pcm deleted file mode 100644 index d58260f856d21ea85ed9e8796075c3c3e8b8c433..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11904 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 O+n=-FI`4x(hyMjg``rit diff --git a/genplus-gx/gx/sounds/intro.pcm b/genplus-gx/gx/sounds/intro.pcm deleted file mode 100644 index 1cee395cdc72be6069f57808ec3036d2b4352420..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56186 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�PU)T~@5p(BPDU1`rVd9!}1w1}iG6gG3 z_FA>P)8GOZNt0* z9br3iA2&j3&Nhork=ev8YHslUZcOLofSF3e;$loCCO7eSoXr!RNzQ82hPf2g*8lt} zh4nBlObbe=+#nhz)v*7l^?Z7f;AOgu@7aaOT1ss-ktZ;BlO0|@y{uggwT`EGHLP<+ zWpkf*6?GO@%bns!RzvGM*G=xxP5GWuC+beZ(R-!$>H)Cx6sl@eLECPm#9p%b=)t%U zGHz36w7V03N2l^OXwYA2Tin*DGYkEsloe@7Yy2KlPUtV}<4TaV+-V-i4pqmfbHp1| z_UNM1R$K4BMnP21t!Zx4AKNK|&iHHj0RP^BN> z15w?d2B_FZ@$5jVJrr|gUCJ5bS0n!;n%WcoXOHjvPk2Wj?7`hk$|hGyfxRYHPI!mA?zrz zqOcWPg{R?N8d1D@x@7 z6%FE&Xe~98A0tlXQ!)*cruI9msoV)HyM!%?>iY+cYX%lssGEPmCiIiW8?RP8mtCmH z*gw|K=2@`EO*#$tqoi^l&=j(qI71x@8g5QgNqneiJf+vMD*3ljPobcwN5##e)^7hlyb4o=PbrOHE}|Or5a}t{=WVj%NWlp@YTe8;{PZwo`&zT|Fyga3?M zuf9>9@~?3-^qnQz5N8&a6(UX+W3Jxaejk>`$4e=>!Cp1vqU}ZX$bqaR(9$Ss7J9-i zmVq@;F0h~QA^u}6hckp;&($D1MrYkgF5`UkTI1tz-md)B9_E4Y2$711{unADGk!}x z;{TLN@PnA+_%p9XJVrbV_SnIWK|6w@)>W;MKLlGAp0PLS^NkGds%R4VSh`Eec0=IK z_9fTp?Cg3`5$_V?@Nf9($|ra>2Yn2^bfLxyKC>p<5APXFbB?-IoYVeQVs4VlBteSe zjvQO$Ht`9df)7uj67)f_mgsZCnT+TkuROj4a?v>{4Rt*}?@us%Jx5dz>lT!?N^2j@ zj(++0JkwAridvhkEXKcvw`Q7gWu+{_6wD*;iB(m=rbv@nF}gKpDJlq_mBykyuLJH!4V^%hI9o9L!+Zgct%wTmhUEKxLS z?d8|o8%}Z?E%Ig>kFA+)JU=1begy3*#Nw3hE7MKpccFv728neG&4o z7*#Jc!*zU3(CH_3CAtxoc4lhj?Zw#odWYAWjQe$i`3nfc1>B6P)TU|(|^IxD>j zSkL&S2^ELl+AE5>P?^OgP*)5JIwh|dLpmyD;v}XN{&TQ|_*to}_7s{BO`}eJHt5pl zM7i*#!E$q=KEYwa@>sy;#NPTfgDV(M^=H3fZ%`a?Ka;42)Ef+gYIr-@6QlhnE<|l$ z7ymLzk3zQ?Lb8E7rJ({HgaNBWRww&f5I?zMY7wpyHpn}t2j()l1U#`YDueD}4ADY; zEO*g8J-weBwPij_yBNsA)-|>t<6(27x8CHhH8ps79n#092Y))Nuo`fq^X53mOA@-1 zSO^$n;3K`C&~x;JI7UtO!83_k>fih*ysN*;tfe>lTD{{l!jEVIRu20hWmb`M1A22O z*~kb|CjN~H%mRhj!+7O5Wguyt&D6?A^;_yQmW1P-Jy9vpcp5vCeJ7!*C;SD-?$ZSwOMF8)aWlB>Y;~ycis%t^wHj!XF$O$wRs^8MMqxQP;2dMfV@{X&Z#tjYMtlei zHim!0l_zq>1p?0qHH;qwzd8~h7BzQ}-$t6JBJVqEPxOdt&RtTQimx?8`<$dickww? zjLm>dMaXldS>%i`hh0e96##21)QFBGW3U70E)ASIH3}qb9o?qt3Hzjb2&(ZYJ6Db@ z1pMGcdl=~FcfjT>9L1U3QSM^)2Ve#toA1IE#8n%!0gE1|7qeP<5zs?iH{{N3{|&H*%a7 zMlJ(!|ALjD#VxR_ST=l#^iFMSLp}`h6FvB$aw^u*pXxQ~KJ?h6Vz|t6w1zfB45b}; zEm`j!a)g8fypq=6UN0goyG|?&`jJ70yHFLZ8hL=u9$tnj=&CxJ>z{n%Trke-D~Vs> zZx+R=u=&8RE#$YWC`=C+tAW?z?o024Np54%p}?QWHx^ z@H(e4YKRx2(Es{n3>{W^dQpIzmcGNxPeE5iWlXB$)3MR`Kw-B!-fs(tnM8dS56WA( zl{R#tL?>!+G%zUa?KMQJp0og-$P?pEY>$r~C^@CkZeG6(wE}wM8!E>@mt+i2x?{(v zK6LLGBCJ1ODa~aK$6FQjd&W1YGk8?rq!9iChOi@CE|^$AcjrDOhl}6KFN7@t^fyU5 zdU!n8cl-wCA>Ckr+h=+vs=LX~7}OOqsVI2sHYaiZqBv8TCX_OFg9T4xUCHD0GxWh| zYxNYT3wz=|)?fNZeO>^SlH?`x}tL41k3c=(=pg1y^{hn_@Uwi`K>hVfBGqkWg>a{GycUMqL*Q8=>_`3 z?)25W+?nDYc;W%DCwH;7R9<nOlTcH8O}?{rrI;pqYh$|ebevg^w;Z$=|RFB z*iQdvn{eI`rNKW=+hMYRyD2V}yUNE94i>zQRubLmGvp+1xt0zut$a(gb-L+y^>lVo zWstMjxH-*0LZM+e_8Z z0QUv;y|`F62JW>xEf{9V8Obx5i)E9DP$DNo~Mu8(@dq^Ef*oJQvoT+(qBVPq=OMyF@EF{tMS~x*5K+ftLVdHT^8sGW%7sO3WvVVbQ1*cUjH@Jnu$2 zhcON;xQ{qSPo%PkrumJ>i7DwV&KRwiMw|E1TCiXtU^PeK6N$e$M>CBU5Rb$j^(jGa~Hh3+DX9f^k|s0Qr(Lm!d~Nhi8|~mX#i8w*k%99q*B_c9faY@ zUHuok6fp)m70-ERx|WKvK-6v(`u0!O%%Cm3SLs2u^>M15v|A~x%;JxQd%%Kw@IBOR zx(?dnEHx(+vxHCKLA@8`t0DeVZW~x|G*%ryNTg(jil=ziC5p0{&5ZJ75= zVMqLWo<$@pq#f#92z-O^qol`I7VA@|;a5NKsnn%vYOZgbQFrXJc*XFs+r=Jk7P4<+ z!$2dO{hn4M=!=drC*@95pTJ{=%Nx{EN;`I509nEtPqwA!kx|^(X=Yi(WbTp&xCg|H zj`Hw1LEd%fB|ehu%{3QGvmIT@n!&VC^Qx7R~XVt0rKJ*8X zn*JaR6jG7<%rICh0uGh$=_tHuG__2uW;oM%ZvJOHbQj}r9y8X_&F4;tnzB8mUDSu@ z7W-N0021z}XZSuuiJkP1^dq8R$T{6?54V^u4pjM|=?qDJemq!kBEs2~Nfw+#_5`Co0$jjh~ zyKL*YDIk9)RgtMerirS!ihVRb$nNo>dH}=>jj}U+!Ge{NL)c+zAU{sn!u}E-u{zNw z)fMV!{w(^_v9$H!m*kzd#(H3swQEE&|56ddBjypiPWYbMBvcaXC;NyV(n$4&dWcVh zVMbPcBhj8YPTr5lxWC#?P>4+tPt+hg>Un~^&XIe$dqT{0MUTvj_#Wk% z`bunwPxn)3&%IpetsmO`j7nC%U^rmxARsq|wJYdLR_9*A#OpKq01R9&h;~nvIu!eq93ifAidc-hPiC;I#+~I+5Y3m9 z!-7vnM{6Lu7H)IO8WYX5egQ&JJCVqGYAL>q|HB@an$QQ6LEL`jAv`gJyy3%^PB@h1 z>1pV-=R4<}wYWeD7StP%&vT+H`~%1`PvZyp6}GV0gl|hX^J@A1#AaasRdn-cs5MXD zm6VT1y48&Tj1ul=R8Y>s^>wD0ligQX4d$ZQnJ=0A%w+x_0};?8qA3uyNu~+&GoIGJ z@4Rt3#>MFgF5n0d(=do3oD0c8`ja5T962l5M!EwnY&o_-VjH;)gPO~BCCWjK$~tR& zjm{g6*Pv%Gc0@I)73vl7LHrgqpmPb=guQG#^wz#i)m1O4dAKjAgZHO))Ljdk4{5F5 zdNsR5xQc$Iq>JtupX}ptewycANejuGSSXfIeZU@6nf5X*E54E|NDhh=H-q!my+e{H zlfEAi(=r%L?3atGCC~=o+dc?|#PO_7d~u#(m~v4)Axy`@;76m7>7timWcSw_n0JDH zz;>v36Non#!gZ9)T2d$GG@8YyQ0oI?ZW2Ac1bluTw}d(ow{@Gif^z|##vStxXtb3# z9?v8E2r*-Ow3nF9*OM4-IQ7M!9pc^iP(zw&QWT(9*hUL&|G)%sneC0?EB=Xzfiwm9>r!vwXC7qWb41MH!)f2keoJ}+I}(~=7?pb3+yp0 zC1kf_fS8YX9dEN%7k%VclGB2{P9e9tGbd?;busG$Vjc#ch;jn(Hh7xw0J%o2D^+E$ zP#?oINh8@(*YPv448daaxK1S(lSQ_vZ8N(EtuRh_Le@76T8pE5bW!$addyQ|WLEHo-lv=QB7zfAS+&nXP7jW7ZDSQI*(f!er?KL6Ey;*kq8V zl277U#vSJ|w}dSnKXCdwJDe-t0DR8Z%_E2fmC-wfR84+Ua2O5X&dbC3rOZscNKl;x zHco0omXA`pFq?KS;QRegMkdX0kHt8hpWp7aH){A@NrD{$JjxL&#@mR$fX!LhN6Tj~ zGRHF#_YR$P(>fX4oX!DsDB7({kUgd+Td2PBMY&H@EH1{9@&Mr)W05O@M--#JlDE)! z^whhj7cf8JzeIh_R$6nXR3s3MgsRav{h>PxAH{ay*2sgoiI~Vk52co6BCMM?NPh}; zs)axGa@zgfdbSb0M9qyD5c52)OcoYPtN)+^VQw0epm=6G(^aD9ST$vla+0|Q4D&fN zh0dW{2(yru$yyQ?z*N2jW*X(~z33#HjVmt=6Mx03GY!?OfSAMhn2<4)c&~7rO6xDO zSvR%)#eahRWgmfU`{`Llcq5CglXF=4Lq%Lu8MUST`yiL=~k z?RLOgeT_VNOPCY3VlJrrS=f8QvI}eFSG>xsB^pLGc>py3)h`mPi-hGoO8ec~M4XGN8g;b; z?u2LneuYaN?9os7GpLr_6uyzth&zi`@--lj{XrK%8zG;3q#6sI(I;ECGdlm->B61K zT?6tU%-LH57rkET8`lU7W~Gu_oWeGy^<)FSL3t|wO5P36c+ZSF`b<1GDr(wVK064% z+O0zJQorriA~tjLxL0y3(LoQG>gr78DYFe*6x=cQAye!?Oms_IEu5Qn4(||_&IT^g zTA5@btMEP5VR&_4pj3IRw4c4l9Ks7COgf@Gq#s7V`hBdt&=1o1T_>GJS$%_NNfWvq z@tc{|&V;Sz`fv}Ve9AZYF*2W0NIl9m!v{wjt$)K+B1V_FtL%X~ifY8*@ zQsOsuj+%--?KQ>oN{!^p+;%oK`CI&g|4sb^>a=bCZW|aO-zFD&`?Vp4=D&)Ykm+dF zK4Vr*TC?|fPD}@^^S{^(sVvx>Bzh){bKT3uf6u-R^P4yA6OL#di%&$^wHx}Oz{7PW zmAr{R>t{_e2rHCP{9d*Sy*TMjo9b0TMVb7!E~izuUy&ce%X$ZWySF=937gT+{PqSG zUS{s|orN;0%uPiUzZjy@Msf&JJjcmMCql;fi1mZ@)@fv=3$)~rv0eM!Pm33(Iq`zD zGF%uI=UOZKg(vJ7<_=bZn5w*&Xzbr0ulrEnW2`17Bf)sBopC#bF)B#ch&$=0{JeB~ z{xE+@X)4}A-!MO^SLG7a5p+K=?7jGNaWuBtE@q{6npioY`mybS5UYw|6{wp0Q~5vC z*n2>)Rz^$d*(dB2Vhu)1u6&sYf(2e{m~?DF(+Se1wW{{Vuw!hJ>#;k=DQ6zpmA}Mq zg58{wm_v%nR%IZQ7n>7JaVEyc#YN-+=cw7qk*r_rL1?lEvDmJKGLXl)eDWu9lluoT zPF^mT<%Y6ns4s};eHEwch8?`6*4L=Lgv#aa*GgN%gWuvD_*Sxzoz^Ocv-~pto>V~X zNu|PaOUKks>^{77yvJjME<#4;ym!kK?U8m0^JTm!%Bh_;2gNJN>daHgWPkNCqqNd@ zN>RQ6dzU!@b;3_-fA(-R+S?4-sFgd5x*k&6MW{sgM03&KB=RO0E0U_*JE4@=MqR}o zOL_>b`i}2KaLFS7g4dd@!uJZtnwhOL_7F2qurIk{OxOPn9}?&2cj9;9o#qF7xtYP;f@QbMX(#=sL;<=gZ%R_U#ZS#PP#%cg zxlG(>azD0Orlq!6PS18L!uH}PoW`G-|LK_9Gu$3m$1Swn*y=T=9pR<0QK=vwMlSiS zVnN@O8J&p!@EW4Y;tu??_1-LD4>gC`na~k$E9hw-UWK~NEtNXryWEMCp!Ao-Kys1vQ-=A>N>exl^(3a%*`kuX5|y zD^RmlX1jo_lr3Ry9nK*Cyh~$GP7eOtX5O8 z3U)53346=kIh^a}H!y}-6RmDWzaUON8J*4P$q=dpvtRg!YwcHw&WY2NM*J0SHm4B^ z*;rY|BAB&Iw72V%Y((vd&*;6(uKvM@imTv8IL{aXJ4cJfj-stD5U}`nwuCy7yNmZr z&PKWYv(yA(Nz~ssYreGpGRn9gu&y?vo6%(Q98-wjD8S~BzXP@fPYQo>3;3zj0PKUz z!-n5Dcczoo=w&V=n&BNy(J1L%3a>|9v6;zV#*?5qmqy$o?o>=^AHv9SYFc3f(GX>h zvj>H+=i&%tnZKI(VY_>fT>{JH4b=RgE}5CW%dHX?U>V#~^d4o0xQ*M-Z)A2NTc{vi zgh}`_r@7g}XqvpH3fr^w`tG`L0`#KKu(S4ws3g}PW-Q@Jbct4QZan6%B(uc2$m2VUi$m|^WA-(6+W*cCp{l89zD{N^=agP7Z2818`j^~J2ryG> zC$Gl$yBjngO@%u&M-8!zR8bXKTg>7~53Z=3*6*rsSN$w^w)|vPNv>xk&E% zVoMR(qckq`?ea451wJ6aoF3eHX|#DEW|(DCZut?^KJQ_^t5LlSC1|PsL^klU8L8dn zFq5#7-{GAA(0`I0ZX>W`Zgzj& zwkDp(*R^;>u*P_(g#f|GlMJ?&M=BGAx3{w$`nFiF+@yILhw72idl48H{p z^=1qCIgP|9BGnUC$1CxE7$&q8EvPMqGAU(({|zM0MGpuc1f}(V17Mk`<)LZMiJqFkv_M(%)yw`cn3_k~iLt&qfYcN!bXf|AX!$Ga_m1 z_XH+mlr^Ygws2s=%;b$G+rJ03K>xoxHoSk)M+wMGp#T0Dq7S3r;SH^~!t!8(N$9o6 zNno4Y_(&`b1MeRgv+WJk8p)CvXOtN*jiY%%Hfxi49IEmRaaQ}Nw@VJ`;`TdgiZE4a z$ovCnx`iF0=it!G5#6LZ;Q+(cbD>c%VJnK)!s=5mK>t0>x#TYCg>)fkq-|o-#^3vo z?DGbrwi3F4RZP<9a3b9k48vh|5jFuU%buo0{Hg7Qp z+exlf&j%m%al{Jgu-rZV0BA~`r1R%H8}y>$@6!8Zx>LZJ!=94U*+Yp6!dtnw2*2sL zSYzrrx!1hs=T{~q=?qQBe3-41?XgLC8e+fl7lIBSuOZEoU*kXmllf2{zpC3%r(ln1 zIO^rhu+PAIVauJ#*dIbDXP5pnGgvs5h8j#Qa`M?jl-cNpnMQl!!qkH4jePuPJdo>A zFx^M{rAkVB@-KJ;X8`t-&$_4dHpDu(&2%TQixALbdA}x>5J-W%!_A{-M1PVIUCbM5 zT$RV*r=UyTX7`lW@;A^-{3Je3yudyIOWqMLD#vMHDk2Bp=s6y%>q%GWqAhodwF5zy z5w49>30EYfWDlEz3^X~H-Wbf%+lr;h$ULC+wKBmrKz^9fMtBjSny?Zqxl=5nre^mT z>HUnb&zjQ9Y|IZJ-jPSVj8^OToVpJ656cQ2<%~*m^gYO6kOk@2QFHAJYcLJ1PFh7X z``34%&_sg6Gjjh)t@HS+=6ag(Fc(xx74nuF-8>h^K@5T6(f#aKb%cHM8zWJH^_t1tk0V_};=x_aoa^Uajn7`+(<7 zBAU?;v2Eu0aJ3}5U-{=}@z0>EH+WgR7ky4n6OYs{v%I=XIu#EET%8XexpS>!7Q@|B zQia8=EUwO0lE3$Q(9h))%2i%9>RB`Kh~9@EwJUpNrFs52_|5uZH9*sG>=?e7iljw& zU#%wHQk^Sr`8umXgX7%pK!|DcsaFs^x>~gzhyFq7?tdm7`K;m#t?aYB*66OI#WjFW+E zq|A#(;m_sGu)*8aZwffRK=*)MKf-DxR7=Kd=|CU<2#%Z;WNzYszLH!hoaEjb4FMSI)YWt|>!|$;cHhl#yg}# zYEL-_f<7gFLYJai1!K(1WJG?^AwFA(t`0KX#hZ||ghISwmkeIZz{oN$UD3DzOw~er ziE+z6sy?9G+k>nz$y~7_<3yRn_v&=n#bI(2PNhpw`@*GGW$Z_$i;)HT%UuM_oroIP zzhnk}tuVm5?>?3D0v=oYd9+(N<`1-Y8hgCXlEuxoJ*!xphd;$zVL9P|xF=l{+G4$pR&x!^{=jm~#|}Ym=mYuq9iL0s7%j5%OAO@nz8YlKS} zuzkWT=q}0VoYpKp5Z-ebW4beeA(X!EF>_b2pQWWJ8UfqAtGkJ>{|2kxS# zJC!f#eg|lp6jzsT2@O#Nq7GL;cuRaTN^tO-QjVmR{!{QJuH>{bX4%Jy6R>$!+nnyN zq94lnlg)G$H514Zc)(JVF?|QMb8b3i*w6l|uLunfh%Mz_iHkpDcZxKf#~8=Rz+>>} zw8^-qlDWaqybxvB0PaT5qfaXo)+-*kk34zX0kDGpBorJT0!G&SS2U?khtS zj|9}eXZBzp-TU@m#4^<6>u-AJ8K?r$OKc~zUF^cna{8i|z|gHCmN^HELKx%KH{P2q zqM9m(r#3N{BMu4^*hi>=Tn4m$8jXQ0--XSK|LRq?KcL1quxa2))v2)%n+CzYUJh|K zm&u^?5b1htwJGR`-_a~%Ob$h9G&RXooEG>-ez4FgsU?YU8v;)S+N;g3BdU34 zoQhE~>RS!oG_>y#w;(p1N}kix#GTxf=)6Bit*vgMTl!}}hS9+;bG?2)$jtX+HM6$8 z8(Ypzmei!80KTOZBYGKxd!3C4J0+UIUX`Aps$d1AmLbUAgrex>+I1|N+oB8TQC;OuWGgdYZBfW{gHr`>q)=qd$$U$;5TeW&5!`X7uC%i24 zC;TR&PP=pUU)asmwqTQU(z!%!cIJU6aflW#$oZpXWNxu9f0L?hpApIfPD({@jK|Jo zl+xa<4R#ygxH8_kW$udGFsFf)eL+o8CqtgH1E}YjKj=+iS7({ij@ap!0Z-!M$NU8K zQnZ{P#1z5^da-kx9r=|DjQ_TlnRBrm&K|9uQwHTxIs@vdr~%Vn?8W>;jDRT!Vyi~* zMiljm*&0=J`a6BGwBc9F7mil5P=Up*u(QGxe{~fz0pN3eoBB25GP1%3qVoqsid0Zjc`V~!KM;d%0@lhB4vFI?5 z!U)cRsxIWTXXpXxo z*MmCvDcq(9Hr=QlPT{Ykz7FQ5^STnOUKKoP7g-oAI5!%|(Q*@*ggk_;O&=oeN&gU3 z1;0dJ3|ik7rlkL7cIpdUjq1cTmjA_5auCs^efUW0n5zl>u&quSS9IPIWlhkA+lnZw zZ09nCX_+MTkTL#ldQ!TG-^1<$@QEl-yqX62jMnf zi1zM})*0a!LUEcqj~yBB3A_pB5cm*jkvJ~+mi}2u&#k96`bVX|)X`Mx;I012>4ifCU~+kc})F7#K{A?#0KxYE(T zOg>jK@SW)$!7QN=V6S=D(41;^#IM?IKtlu3G~t1L&Z>@Y;UuXAw~T0|&QLX~VK`9# zky}JpaVOc1{U|OJ0P4-(&|40e!=N^iMSdXEVPJ3j>pnj7Yq-M}wbw+qukV_=wUX*W zdT*7P0-L}U5W9##G> zD~q6K(`P05Y4F}8TarndEj3{|>wHl`bDqvwqGa!vUw z$}MDxIpE}TsI0jN?GZ``u2l%;F0EnP_^!4k{*KxO2(186uN(OX-kxB;2 zb?Q=(OUSMiVb@bf;`!m7K~8?vLEj;rqd&dpWca2XgWt|=dpb0^pRtlB0w#E%2& zdj^-W&P;zj^j5LM`25N{Mj)SoCoRDn`oo+N5`%Suee3V6yzwX(_7eQH#AmUE*vP%W z>{L5*2bp(qB6d~!pvQhq*rYs94l;XaQa6JI|PjfbWOzb`fbdPMp~+cT@p?%pO8!~ zrhc{{}P$Frpg`fIgweNA#`PT z;A3cD42YF}7wdPe4AsY_2qh0dG+M!QIbLh&_dTN%}RotT#<~nnwPENNJxn&JAPf>I^(ngx7a%9?!t#cj z{1j5AB-W2umyCSDvY<6o<+Z6pP#a?%@kOFzoeylT7Ma{wDdXV zjebQRM%OB-qj$4@P}l!Xyd%GjGz?~Q{9bc>%ZiPx)o%HBM^6d-U~{4m`>UZ(thaSY zD=bY)92vTucsFuD*~Kvv#<=mG+KVA)<|h(D7hDIlcJ}7-&6Q zfx5ZLLi^RYK#Hgz(dSs}z^lM2+=B(}IJvr7D%3etAe1$96m?68x0Xs})NTGhZae-t z=Ab{n-bWn=z8haLGTwta;S6o)e1Tbi$i2y5u=9yE<;{WksDUwwynwGq)JtsfCQg4+ zOP>|qpExVjJFyI!9Tdh5`avz>pTg_AJSLg{i{4yUP=T1%G{*QAK9jHlo#TKXnhAgi zj1o73tLeMrn_BP;jsr=_J0}8^ERpQd(<* z|Ay9pp8d0#HdLOhQf~QDQemzNjENeg_w>C1F4;@==OvGhUN})C*TI5 z6nsG7JTTjY+yHlhdAf|>V|BbraLXwWEEk%Vu*F^FWC-5JJC%!i2PM`x?CTqyU!U%; zM#}2Ne7aQ^lyw)adh(FqhKS#7<8X8chyP8OZ7|iJ^ir1qm*4~7|`qv;oph1jT%bz(3p_n=68;Y)8+~5 zqyI=$^_YlnAS)MBQZ30HUd4T--NJ?7Ib##v8)rqmgn0g4IjMEls)Fy$yO^pz>~E%| zqbs83Ip@Q76ZeKM$)6*?5??uQo#ni*Gr{QR+Z8n{W?i722MCyUS>)uyygo{4sZwxX z;>BRm@C9@%;Xccx?AKzou}&_$HfEx)tv`?I;z`jxy-DGdiC*Z1w8(l9{OT-rwt5C5 z;h}ofsIxIGqi(QtpssH#;`w-1fi6{8;!IFU3<_nySrRojmoiHYYpuNlynD=0-vwVt zUxuni_vXvPheEkR9mxzYHkjT?>)dp=^H8Xs+9T?FOtR?1e7d&T|4zK&gLwew(F=wi zB_<2*3w}k@06#%WNtJ1uDCbU#cKl6zM?vu(i5iRq@I*&ls1%0 zP9Mdif5+5B3*@O$RnRbAi(eFteM3N-cO>`%5VDNMA>*TbP}9`Ic#+*WD&+s-8}Hwb zru!Gte!G4V5LLulHvgl_qD~V0|MAyI#cuLWV7xbMqe+IiI z;)LaZO0Eq5k%C$QwL6WoltAaeG+)g?F?>T$s}zl#3>6QRaqCF6gLTYX?hv~RR0-?F zlBg@u55UQ%tvDO~kaS@mfvtJmCpmk9WfOBJw0EPt$)S$)gVtCrA#F7;`|?H=^JNc= zqob5w+8SeCC}*gWJwP6qxX3u=F153QXyCWEA*x;U%b17ic=kGaIX%d(iWlsj)*gCB zITMQ{)V6-|_le!e1T9|8DR;0IslB2e_|gQX%GKy)-xl+HC@NIeN+C}VF9nB;{dPWf z%lXHC5||bJB<8kW+cTrq%jMWnag{e$N}#X7T8X(5ni&jDNGyV0YeUuY@;WE0)Hb@E zFJ+*&s^Wd%l~Oh24;3_XOB>9R;eqaMyNx&2yJ1cP1^c_0tG@k=`d=!q*;z3|MA5JG zL-1^3>V*E0b~tb18~#V@u8x#vdqr{P=smt-f!x}B)DHSA`9kSJNsW~>iBl%j)g5JT zcdPJ?k-vH{`b*3;|1l=?KERDIMGLm=OZoD#OM#eBpxf~DbsuncprWhaM+yc z?{FaaBH=+OlQ4~=&J6XG7AxmNZQYCDO7p}&#&-u50u2zjkR={9kO-gxiGF9EGv6M7 zaz+lxi=uDFT!`}F-gKjXmx$%f&@Yh&5X-;8Jwab$4?f)PYPD5UX(Qwq{L(2MaQyZB znf;S+YHcc+6HbyiDRP^YB>fU|+m9V?eHK3qn>>r26>~7EA8mx?z)In;ceo_qsg<_s z1xE#|1V4M{T-W$VDX3kMlaQbG7JpU$8{c`qO?oSt}U@X@53``yk1luLJztXm4Z>RzT$yWazp%F`)U?SEE^&AQ@X}jU@UPX))5xX zbmw|tQ_Oj(h{vY^+kBPUExDjHm;?68fvI9V4+%xUP*5b3@^H_mBhkSf z!9J0mLb0E?Wwpv`b6OU+@JrK#hRTI}k1w)Ih$E({1^1oG{wltY`dz$S zjwO{sZ$j0rw%%KOE1bbjaNgTf#5`v`X$}Zma^GqSI#1tiai3SkcX(KOWp4_O51t55 z@uo0geo^XZrD$`q-m9Y5@jvt}@nt0IX+EiE_);RX(s?OJ)kt0IuUo}#%b$AtNepN(E(AXUBfKX{ zX%?mVwNvyZIm#PK9RrViC4Kd!ZD@k>$lRQG+8pE-!I|ya#va)37O`rgvim&{9aGdl zOUVfA<)GA>&A{bRVRR5#i4B79LyzobD7Qs$Dea8Zn9LI^u@Oam6@2C8p~$Dau;;;; zs;eWPyB_?-*4y{Ig(%96h3-gE|8r$IDkuMi8M+1CL)*nVGA7h8_$YMQR>cu}n#iav zkS>u9=sF?FHcip-ylU7_VP0Hfk{8}Kb?~EQ%7NBv`1)e38!zki>fRn6e z_>*(T8Rf17cPs^g++Ug|v7|Bkm z^4h+q{!02INs2q9;muYlU^u54ZwHi&04r*bsK}-V1 z!*SBw4g`CJW?L#N&llK1K98)8_?$&vJ=DaCu>x*ow*vnzHi-sNYoZFPE2Nqts6HYU_)83oIpk-z zgG)lyVD^0mt#usTqr4z(NH0`Dni9CH{|BtuT;i%U*UTC|>2&i-ibYORBjT2F>+-H> zF8dM~9W_QhFD*n}m1gu6zk-X4140qo60-oty~CX-f=)^NM8#wtDT-^50fCSnhB4QO zY0_}Z4v%qic_sNCFRKybrgwX=5YEJE`94Ser-r4SIJGoY?#*9d4JGHb(X&wc#J%P$ zx4IbPE*8(!zJU$7lcbnzPf)jEr?|yHnXVT#*gc{zP%D z0F0SH4k_nEN^}#of;HM8yezR1aDwtdRbGaDQNGf&7*Kxk!EgDlsTHM^C>t5fdWGZd zW!_k(h#HZuz-$6dDo(;nDSM&|YJ;Rzq^YK7u;GL!UG~jte4&uuaWp= zrnW}AM_5Oc3vDA(G}TK=o#TQ`kTK}S5ZHjfKsyp?4&CL+Odf%tQslooF>okPjrF4 z$7_}Cfp^kAJP)VxEYi>IE^}(3NWN@_DLnouSKqGl2-bsIoqDo&W4lRZ; zPkXai+2AcZ%zLm{QrXRmXOQ%0DeXxvOUyM1Ct%4QUnXWr;#ka&; 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 - All rights reserved. - - Proper (standard) vorbis usage by Tantric, 2009 - Threading modifications/corrections by Tantric, 2009 - - Redistribution and use in source and binary forms, with or without modification, are - permitted provided that the following conditions are met: - - - Redistributions of source code must retain the above copyright notice, this list of - conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, this list - of conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - - The names of the contributors may not be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "oggplayer.h" -#include -#include -#include - -/* functions to read the Ogg file from memory */ - -static struct -{ - char *mem; - int size; - int pos; -} file[4]; - -static int f_read(void * punt, int bytes, int blocks, int *f) -{ - int b; - int c; - int d; - - if (bytes * blocks <= 0) - return 0; - - blocks = bytes * blocks; - c = 0; - - while (blocks > 0) - { - b = blocks; - if (b > 4096) - b = 4096; - - if (*f >= 0x666 && *f <= 0x669) - { - d = (*f) - 0x666; - if (file[d].size == 0) - return -1; - if ((file[d].pos + b) > file[d].size) - b = file[d].size - file[d].pos; - if (b > 0) - { - memcpy(punt, file[d].mem + file[d].pos, b); - file[d].pos += b; - } - } - else - b = read(*f, ((char *) punt) + c, b); - - if (b <= 0) - { - return c / bytes; - } - c += b; - blocks -= b; - } - return c / bytes; -} - -static int f_seek(int *f, ogg_int64_t offset, int mode) -{ - if(f==NULL) return(-1); - - int k, d; - mode &= 3; - if (*f >= 0x666 && *f <= 0x669) - { - d = (*f) - 0x666; - k = 0; - - if (file[d].size == 0) - return -1; - - if (mode == 0) - { - if ((offset) >= file[d].size) - { - file[d].pos = file[d].size; - k = -1; - } - else if ((offset) < 0) - { - file[d].pos = 0; - k = -1; - } - else - file[d].pos = offset; - } - if (mode == 1) - { - if ((file[d].pos + offset) >= file[d].size) - { - file[d].pos = file[d].size; - k = -1; - } - else if ((file[d].pos + offset) < 0) - { - file[d].pos = 0; - k = -1; - } - else - file[d].pos += offset; - } - if (mode == 2) - { - - if ((file[d].size + offset) >= file[d].size) - { - file[d].pos = file[d].size; - k = -1; - } - else if ((file[d].size + offset) < 0) - { - file[d].pos = 0; - k = -1; - } - else - file[d].pos = file[d].size + offset; - } - - } - else - k = lseek(*f, (int) offset, mode); - - if (k < 0) - k = -1; - else - k = 0; - return k; -} - -static int f_close(int *f) -{ - int d; - if (*f >= 0x666 && *f <= 0x669) - { - d = (*f) - 0x666; - file[d].size = 0; - file[d].pos = 0; - if (file[d].mem) - { - file[d].mem = (void *) 0; - } - return 0; - } - else - return close(*f); - return 0; -} - -static long f_tell(int *f) -{ - int k, d; - - if (*f >= 0x666 && *f <= 0x669) - { - d = (*f) - 0x666; - k = file[d].pos; - } - else - k = lseek(*f, 0, 1); - - return (long) k; -} - -static int mem_open(char * ogg, int size) -{ - static int one = 1; - int n; - if (one) - { - one = 0; - for (n = 0; n < 4; n++) - file[n].size = 0; - } - - for (n = 0; n < 4; n++) - { - if (file[n].size == 0) - { - file[n].mem = ogg; - file[n].size = size; - file[n].pos = 0; - return (0x666 + n); - } - } - return -1; -} - -static int mem_close(int fd) -{ - if (fd >= 0x666 && fd <= 0x669) // it is a memory file descriptor? - { - fd -= 0x666; - file[fd].size = 0; - return 0; - } - else - return f_close(&fd); -} - -static ov_callbacks callbacks = { - (size_t (*)(void *, size_t, size_t, void *)) f_read, - (int (*)(void *, ogg_int64_t, int)) f_seek, - (int (*)(void *)) f_close, - (long (*)(void *)) f_tell -}; - -/* OGG control */ - -#define READ_SAMPLES 4096 /* samples that it must read before to send */ -#define MAX_PCMOUT 4096 /* minimum size to read ogg samples */ -typedef struct -{ - OggVorbis_File vf; - vorbis_info *vi; - int current_section; - - /* OGG file operation */ - int fd; - int mode; - int eof; - int flag; - int volume; - int seek_time; - - /* OGG buffer control */ - short pcmout[2][READ_SAMPLES + MAX_PCMOUT * 2]; /* take 4k out of the data segment, not the stack */ - int pcmout_pos; - int pcm_indx; - -} private_data_ogg; - -static private_data_ogg private_ogg; - -/* OGG thread control */ - -#define STACKSIZE 8192 - -static u8 oggplayer_stack[STACKSIZE]; -static lwpq_t oggplayer_queue = LWP_TQUEUE_NULL; -static lwp_t h_oggplayer = LWP_THREAD_NULL; -static int ogg_thread_running = 0; - -static void ogg_add_callback(int voice) -{ - if (!ogg_thread_running) - { - ASND_StopVoice(0); - return; - } - - if (private_ogg.flag & 128) - return; /* Ogg is paused */ - - if (private_ogg.pcm_indx >= READ_SAMPLES) - { - if (ASND_AddVoice(0, - (void *) private_ogg.pcmout[private_ogg.pcmout_pos], - private_ogg.pcm_indx << 1) == 0) - { - private_ogg.pcmout_pos ^= 1; - private_ogg.pcm_indx = 0; - private_ogg.flag = 0; - LWP_ThreadSignal(oggplayer_queue); - } - } - else - { - if (private_ogg.flag & 64) - { - private_ogg.flag &= ~64; - LWP_ThreadSignal(oggplayer_queue); - } - } -} - -static void * ogg_player_thread(private_data_ogg * priv) -{ - int first_time = 1; - long ret; - - /* init */ - LWP_InitQueue(&oggplayer_queue); - - priv[0].vi = ov_info(&priv[0].vf, -1); - - ASND_Pause(0); - - priv[0].pcm_indx = 0; - priv[0].pcmout_pos = 0; - priv[0].eof = 0; - priv[0].flag = 0; - priv[0].current_section = 0; - - ogg_thread_running = 1; - - while (!priv[0].eof && ogg_thread_running) - { - if (priv[0].flag) - LWP_ThreadSleep(oggplayer_queue); /* wait only when i have samples to send */ - - if (priv[0].flag == 0) /* wait to all samples are sended */ - { - if (ASND_TestPointer(0, priv[0].pcmout[priv[0].pcmout_pos]) - && ASND_StatusVoice(0) != SND_UNUSED) - { - priv[0].flag |= 64; - continue; - } - if (priv[0].pcm_indx < READ_SAMPLES) - { - priv[0].flag = 3; - - if (priv[0].seek_time >= 0) - { - ov_time_seek(&priv[0].vf, priv[0].seek_time); - priv[0].seek_time = -1; - } - - ret - = ov_read( - &priv[0].vf, - (void *) &priv[0].pcmout[priv[0].pcmout_pos][priv[0].pcm_indx], - MAX_PCMOUT,/*0,2,1,*/&priv[0].current_section); - priv[0].flag &= 192; - if (ret == 0) - { - /* EOF */ - if (priv[0].mode & 1) - ov_time_seek(&priv[0].vf, 0); /* repeat */ - else - priv[0].eof = 1; /* stops */ - } - else if (ret < 0) - { - /* error in the stream. Not a problem, just reporting it in - case we (the app) cares. In this case, we don't. */ - if (ret != OV_HOLE) - { - if (priv[0].mode & 1) - ov_time_seek(&priv[0].vf, 0); /* repeat */ - else - priv[0].eof = 1; /* stops */ - } - } - else - { - /* we don't bother dealing with sample rate changes, etc, but - you'll have to */ - priv[0].pcm_indx += ret >> 1; /* get 16 bits samples */ - } - } - else - priv[0].flag = 1; - } - - if (priv[0].flag == 1) - { - if (ASND_StatusVoice(0) == SND_UNUSED || first_time) - { - first_time = 0; - if (priv[0].vi->channels == 2) - { - ASND_SetVoice(0, VOICE_STEREO_16BIT, priv[0].vi->rate, 0, - (void *) priv[0].pcmout[priv[0].pcmout_pos], - priv[0].pcm_indx << 1, priv[0].volume, - priv[0].volume, ogg_add_callback); - priv[0].pcmout_pos ^= 1; - priv[0].pcm_indx = 0; - priv[0].flag = 0; - } - else - { - ASND_SetVoice(0, VOICE_MONO_16BIT, priv[0].vi->rate, 0, - (void *) priv[0].pcmout[priv[0].pcmout_pos], - priv[0].pcm_indx << 1, priv[0].volume, - priv[0].volume, ogg_add_callback); - priv[0].pcmout_pos ^= 1; - priv[0].pcm_indx = 0; - priv[0].flag = 0; - } - } - } - usleep(10); - } - ov_clear(&priv[0].vf); - priv[0].fd = -1; - priv[0].pcm_indx = 0; - - return 0; -} - -void StopOgg() -{ - ASND_StopVoice(0); - ogg_thread_running = 0; - - if(h_oggplayer != LWP_THREAD_NULL) - { - if(oggplayer_queue != LWP_TQUEUE_NULL) - LWP_ThreadSignal(oggplayer_queue); - LWP_JoinThread(h_oggplayer, NULL); - h_oggplayer = LWP_THREAD_NULL; - } - if(oggplayer_queue != LWP_TQUEUE_NULL) - { - LWP_CloseQueue(oggplayer_queue); - oggplayer_queue = LWP_TQUEUE_NULL; - } -} - -int PlayOgg(char * buf, int buflen, int time_pos, int mode) -{ - StopOgg(); - - private_ogg.fd = mem_open(buf, buflen); - - if (private_ogg.fd < 0) - { - private_ogg.fd = -1; - return -1; - } - - private_ogg.mode = mode; - private_ogg.eof = 0; - private_ogg.volume = 127; - private_ogg.flag = 0; - private_ogg.seek_time = -1; - - if (time_pos > 0) - private_ogg.seek_time = time_pos; - - if (ov_open_callbacks((void *) &private_ogg.fd, &private_ogg.vf, NULL, 0, callbacks) < 0) - { - mem_close(private_ogg.fd); /* mem_close() can too close files from devices */ - private_ogg.fd = -1; - ogg_thread_running = 0; - return -1; - } - - if (LWP_CreateThread(&h_oggplayer, (void *) ogg_player_thread, - &private_ogg, oggplayer_stack, STACKSIZE, 80) == -1) - { - ogg_thread_running = 0; - ov_clear(&private_ogg.vf); - private_ogg.fd = -1; - return -1; - } - return 0; -} - -void PauseOgg(int pause) -{ - if (pause) - { - private_ogg.flag |= 128; - } - else - { - if (private_ogg.flag & 128) - { - private_ogg.flag |= 64; - private_ogg.flag &= ~128; - if (ogg_thread_running > 0) - { - LWP_ThreadSignal(oggplayer_queue); - } - } - } -} - -int StatusOgg() -{ - if (ogg_thread_running == 0) - return -1; /* Error */ - else if (private_ogg.eof) - return 255; /* EOF */ - else if (private_ogg.flag & 128) - return 2; /* paused */ - else - return 1; /* running */ -} - -void SetVolumeOgg(int volume) -{ - private_ogg.volume = volume; - ASND_ChangeVolumeVoice(0, volume, volume); -} - -s32 GetTimeOgg() -{ - int ret; - if (ogg_thread_running == 0 || private_ogg.fd < 0) - return 0; - ret = ((s32) ov_time_tell(&private_ogg.vf)); - if (ret < 0) - ret = 0; - - return ret; -} - -void SetTimeOgg(s32 time_pos) -{ - if (time_pos >= 0) - private_ogg.seek_time = time_pos; -} - diff --git a/genplus-gx/gx/utils/oggplayer.h b/genplus-gx/gx/utils/oggplayer.h deleted file mode 100644 index 85b95c6a88..0000000000 --- a/genplus-gx/gx/utils/oggplayer.h +++ /dev/null @@ -1,179 +0,0 @@ -/* - Copyright (c) 2008 Francisco Muñoz 'Hermes' - All rights reserved. - - Proper (standard) vorbis usage by Tantric, 2009 - Threading modifications/corrections by Tantric, 2009 - - Redistribution and use in source and binary forms, with or without modification, are - permitted provided that the following conditions are met: - - - Redistributions of source code must retain the above copyright notice, this list of - conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, this list - of conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - - The names of the contributors may not be used to endorse or promote products derived - from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef NO_SOUND - -#ifndef __OGGPLAYER_H__ -#define __OGGPLAYER_H__ - -#include -#include "tremor/ivorbiscodec.h" -#include "tremor/ivorbisfile.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define OGG_ONE_TIME 0 -#define OGG_INFINITE_TIME 1 - -#define OGG_STATUS_RUNNING 1 -#define OGG_STATUS_ERR -1 -#define OGG_STATUS_PAUSED 2 -#define OGG_STATUS_EOF 255 - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ -/* Player OGG functions */ -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -/* int PlayOgg(int fd, int time_pos, int mode); - - Play an Ogg file. This file can be loaded from memory (mem_open(void *ogg, int size_ogg)) or from device with open("device:file.ogg",O_RDONLY,0); - - NOTE: The file is closed by the player when you call PlayOgg(), StopOgg() or if it fail. - - -- Params --- - - buf: pointer to sound data - - buflen: buffer size in bytes - - time_pos: initial time position in the file (in milliseconds). For example, use 30000 to advance 30 seconds - - mode: Use OGG_ONE_TIME or OGG_INFINITE_TIME. When you use OGG_ONE_TIME the sound stops and StatusOgg() return OGG_STATUS_EOF - - return: 0- Ok, -1 Error - - */ - -int PlayOgg(char * buf, int buflen, int time_pos, int mode); - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -/* void StopOgg(); - - Stop an Ogg file. - - NOTE: The file is closed and the player thread is released - - -- Params --- - - - */ - -void StopOgg(); - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -/* void PauseOgg(int pause); - - Pause an Ogg file. - - -- Params --- - - pause: 0 -> continue, 1-> pause - - */ - -void PauseOgg(int pause); - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -/* int StatusOgg(); - - Return the Ogg status - - -- Params --- - - - return: OGG_STATUS_RUNNING - OGG_STATUS_ERR -> not initialized? - OGG_STATUS_PAUSED - OGG_STATUS_EOF -> player stopped by End Of File - - */ - -int StatusOgg(); - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -/* void SetVolumeOgg(int volume); - - Set the Ogg playing volume. - NOTE: it change the volume of voice 0 (used for the Ogg player) - - -- Params --- - - volume: 0 to 255 (max) - - */ - -void SetVolumeOgg(int volume); - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -/* s32 GetTimeOgg(); - - Return the Ogg time from the starts of the file - - -- Params --- - - return: 0 -> Ok or error condition (you must ignore this value) - >0 -> time in milliseconds from the starts - - */ - -s32 GetTimeOgg(); - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -/* void SetTimeOgg(s32 time_pos); - - Set the time position - - NOTE: The file is closed by the player when you call PlayOgg(), StopOgg() or if it fail. - - -- Params --- - - time_pos: time position in the file (in milliseconds). For example, use 30000 to advance 30 seconds - - */ - -void SetTimeOgg(s32 time_pos); - -/*------------------------------------------------------------------------------------------------------------------------------------------------------*/ - -#ifdef __cplusplus -} -#endif - -#endif - -#endif diff --git a/genplus-gx/gx/utils/vi_encoder.c b/genplus-gx/gx/utils/vi_encoder.c deleted file mode 100644 index 402fa79199..0000000000 --- a/genplus-gx/gx/utils/vi_encoder.c +++ /dev/null @@ -1,565 +0,0 @@ -/**************************************************************************** - * vi_encoder.c - * - * Wii Audio/Video Encoder support - * - * Copyright (C) 2009 Eke-Eke, with some code from libogc (C) Hector Martin - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifdef HW_RVL - -#include -#include -#include -#include - -#include "vi_encoder.h" - -/**************************************************************************** - * I2C driver by Hector Martin (marcan) - * - ****************************************************************************/ - -#define _SHIFTL(v, s, w) \ - ((u32) (((u32)(v) & ((0x01 << (w)) - 1)) << (s))) -#define _SHIFTR(v, s, w) \ - ((u32)(((u32)(v) >> (s)) & ((0x01 << (w)) - 1))) - -extern void udelay(int us); - -static u32 i2cIdentFirst = 0; -static u32 i2cIdentFlag = 1; -static vu16* const _viReg = (u16*)0xCC002000; -static vu32* const _i2cReg = (u32*)0xCD800000; - -static inline void __viOpenI2C(u32 channel) -{ - u32 val = ((_i2cReg[49]&~0x8000)|0x4000); - val |= _SHIFTL(channel,15,1); - _i2cReg[49] = val; -} - -static inline u32 __viSetSCL(u32 channel) -{ - u32 val = (_i2cReg[48]&~0x4000); - val |= _SHIFTL(channel,14,1); - _i2cReg[48] = val; - return 1; -} -static inline u32 __viSetSDA(u32 channel) -{ - u32 val = (_i2cReg[48]&~0x8000); - val |= _SHIFTL(channel,15,1); - _i2cReg[48] = val; - return 1; -} - -static inline u32 __viGetSDA() -{ - return _SHIFTR(_i2cReg[50],15,1); -} - -static inline void __viCheckI2C() -{ - __viOpenI2C(0); - udelay(4); - - i2cIdentFlag = 0; - if(__viGetSDA()!=0) i2cIdentFlag = 1; -} - -static u32 __sendSlaveAddress(u8 addr) -{ - u32 i; - - __viSetSDA(i2cIdentFlag^1); - udelay(2); - - __viSetSCL(0); - for(i=0;i<8;i++) { - if(addr&0x80) __viSetSDA(i2cIdentFlag); - else __viSetSDA(i2cIdentFlag^1); - udelay(2); - - __viSetSCL(1); - udelay(2); - - __viSetSCL(0); - addr <<= 1; - } - - __viOpenI2C(0); - udelay(2); - - __viSetSCL(1); - udelay(2); - - if(i2cIdentFlag==1 && __viGetSDA()!=0) return 0; - - __viSetSDA(i2cIdentFlag^1); - __viOpenI2C(1); - __viSetSCL(0); - - return 1; -} - -static u32 __VISendI2CData(u8 addr,void *val,u32 len) -{ - u8 c; - s32 i,j; - u32 level,ret; - - if(i2cIdentFirst==0) { - __viCheckI2C(); - i2cIdentFirst = 1; - } - - _CPU_ISR_Disable(level); - - __viOpenI2C(1); - __viSetSCL(1); - - __viSetSDA(i2cIdentFlag); - udelay(4); - - ret = __sendSlaveAddress(addr); - if(ret==0) { - _CPU_ISR_Restore(level); - return 0; - } - - __viOpenI2C(1); - for(i=0;i> 8; - buf[2] = data & 0xFF; - __VISendI2CData(0xe0,buf,3); - udelay(2); -} - -static void __VIWriteI2CRegister32(u8 reg, u32 data) -{ - u8 buf[5]; - buf[0] = reg; - buf[1] = data >> 24; - buf[2] = (data >> 16) & 0xFF; - buf[3] = (data >> 8) & 0xFF; - buf[4] = data & 0xFF; - __VISendI2CData(0xe0,buf,5); - udelay(2); -} - -static void __VIWriteI2CRegisterBuf(u8 reg, int size, u8 *data) -{ - u8 buf[0x100]; - buf[0] = reg; - memcpy(&buf[1], data, size); - __VISendI2CData(0xe0,buf,size+1); - udelay(2); -} - -/**************************************************************************** - * A/V functions support (Eke-Eke) - * - ****************************************************************************/ -static const u8 gamma_coeffs[][33] = -{ - /* GM_0_0 */ - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - - }, - - /* GM_0_1 */ - { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x03, 0x97, 0x3B, 0x49, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x80, 0x1B, 0x80, 0xEB, 0x00 - }, - - /* GM_0_2 */ - { - 0x00, 0x00, 0x00, 0x28, 0x00, 0x5A, 0x02, 0xDB, 0x0D, 0x8D, 0x30, 0x49, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x10, 0x00, 0x10, 0x40, 0x11, 0x00, 0x18, 0x80, 0x42, 0x00, 0xEB, 0x00 - }, - - /* GM_0_3 */ - { - 0x00, 0x00, 0x00, 0x7A, 0x02, 0x3C, 0x07, 0x6D, 0x12, 0x9C, 0x27, 0x24, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x10, 0x00, 0x10, 0xC0, 0x15, 0x80, 0x29, 0x00, 0x62, 0x00, 0xEB, 0x00 - }, - - /* GM_0_4 */ - { - 0x00, 0x4E, 0x01, 0x99, 0x05, 0x2D, 0x0B, 0x24, 0x14, 0x29, 0x20, 0xA4, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x00, 0x10, 0x10, 0x40, 0x12, 0xC0, 0x1D, 0xC0, 0x3B, 0x00, 0x78, 0xC0, 0xEB, 0x00 - }, - - /* GM_0_5 */ - { - 0x00, 0xEC, 0x03, 0xD7, 0x08, 0x00, 0x0D, 0x9E, 0x14, 0x3E, 0x1B, 0xDB, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x10, 0xC0, 0x16, 0xC0, 0x27, 0xC0, 0x4B, 0x80, 0x89, 0x80, 0xEB, 0x00 - }, - - /* GM_0_6 */ - { - 0x02, 0x76, 0x06, 0x66, 0x0A, 0x96, 0x0E, 0xF3, 0x13, 0xAC, 0x18, 0x49, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x12, 0x00, 0x1C, 0x00, 0x32, 0x80, 0x59, 0xC0, 0x96, 0x00, 0xEB, 0x00 - }, - - /* GM_0_7 */ - { - 0x04, 0xEC, 0x08, 0xF5, 0x0C, 0x96, 0x0F, 0xCF, 0x12, 0xC6, 0x15, 0x80, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x14, 0x00, 0x22, 0x00, 0x3C, 0xC0, 0x66, 0x40, 0x9F, 0xC0, 0xEB, 0x00 - }, - - /* GM_0_8 */ - { - 0x08, 0x00, 0x0B, 0xAE, 0x0E, 0x00, 0x10, 0x30, 0x11, 0xCB, 0x13, 0x49, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x16, 0x80, 0x28, 0xC0, 0x46, 0x80, 0x71, 0x00, 0xA7, 0x80, 0xEB, 0x00 - }, - - /* GM_0_9 */ - { - 0x0B, 0xB1, 0x0E, 0x14, 0x0F, 0x2D, 0x10, 0x18, 0x10, 0xE5, 0x11, 0x80, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x19, 0x80, 0x2F, 0x80, 0x4F, 0xC0, 0x7A, 0x00, 0xAD, 0xC0, 0xEB, 0x00 - }, - - /* GM_1_0 */ - { - 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xEB, - 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x60, 0x00, 0x80, 0x00, 0xA0, 0x00, 0xEB, 0x00 - }, - - /* GM_1_1 */ - { - 0x14, 0xEC, 0x11, 0xC2, 0x10, 0x78, 0x0F, 0xB6, 0x0F, 0x2F, 0x0E, 0xB6, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x21, 0x00, 0x3C, 0xC0, 0x5F, 0xC0, 0x89, 0x00, 0xB7, 0x80, 0xEB, 0x00 - }, - - /* GM_1_2 */ - { - 0x19, 0xD8, 0x13, 0x33, 0x10, 0xD2, 0x0F, 0x6D, 0x0E, 0x5E, 0x0D, 0xA4, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x25, 0x00, 0x43, 0x00, 0x66, 0xC0, 0x8F, 0x40, 0xBB, 0x40, 0xEB, 0x00 - }, - - /* GM_1_3 */ - { - 0x1E, 0xC4, 0x14, 0x7A, 0x11, 0x0F, 0xF, 0x0C, 0x0D, 0xA1, 0x0C, 0xB6, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x29, 0x00, 0x49, 0x00, 0x6D, 0x40, 0x94, 0xC0, 0xBE, 0x80, 0xEB, 0x00 - }, - - /* GM_1_4 */ - { - 0x24, 0x00, 0x15, 0x70, 0x11, 0x0F, 0x0E, 0xAA, 0x0D, 0x0F, 0x0B, 0xDB, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x2D, 0x40, 0x4E, 0xC0, 0x73, 0x00, 0x99, 0x80, 0xC1, 0x80, 0xEB, 0x00 - }, - - /* GM_1_5 */ - { - 0x29, 0x3B, 0x16, 0x3D, 0x11, 0x0F, 0x0E, 0x30, 0x0C, 0x7D, 0x0B, 0x24, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x31, 0x80, 0x54, 0x40, 0x78, 0x80, 0x9D, 0xC0, 0xC4, 0x00, 0xEB, 0x00 - }, - - /* GM_1_6 */ - { - 0x2E, 0x27, 0x17, 0x0A, 0x10, 0xD2, 0x0D, 0xE7, 0x0B, 0xEB, 0x0A, 0x80, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x35, 0x80, 0x59, 0x80, 0x7D, 0x40, 0xA1, 0xC0, 0xC6, 0x40, 0xEB, 0x00 - }, - - /* GM_1_7 */ - { - 0x33, 0x62, 0x17, 0x5C, 0x10, 0xD2, 0x0D, 0x6D, 0x0B, 0x6D, 0x09, 0xED, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x39, 0xC0, 0x5E, 0x40, 0x82, 0x00, 0xA5, 0x40, 0xC8, 0x40, 0xEB, 0x00 - }, - - /* GM_1_8 */ - { - 0x38, 0x4E, 0x17, 0xAE, 0x10, 0xB4, 0x0D, 0x0C, 0x0A, 0xF0, 0x09, 0x6D, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x3D, 0xC0, 0x62, 0xC0, 0x86, 0x40, 0xA8, 0x80, 0xCA, 0x00, 0xEB, 0x00 - }, - - /* GM_1_9 */ - { - 0x3D, 0x3B, 0x18, 0x00, 0x10, 0x5A, 0x0C, 0xC3, 0x0A, 0x72, 0x09, 0x00, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x41, 0xC0, 0x67, 0x40, 0x8A, 0x00, 0xAB, 0x80, 0xCB, 0x80, 0xEB, 0x00 - }, - - /* GM_2_0 */ - { - 0x41, 0xD8, 0x18, 0x28, 0x10, 0x3C, 0x0C, 0x49, 0x0A, 0x1F, 0x08, 0x92, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x45, 0x80, 0x6B, 0x40, 0x8D, 0xC0, 0xAE, 0x00, 0xCD, 0x00, 0xEB, 0x00 - }, - - /* GM_2_1 */ - { - 0x46, 0x76, 0x18, 0x51, 0x0F, 0xE1, 0x0C, 0x00, 0x09, 0xB6, 0x08, 0x36, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x49, 0x40, 0x6F, 0x40, 0x91, 0x00, 0xB0, 0x80, 0xCE, 0x40, 0xEB, 0x00 - }, - - /* GM_2_2 */ - { - 0x4A, 0xC4, 0x18, 0x7A, 0x0F, 0xA5, 0x0B, 0x9E, 0x09, 0x63, 0x07, 0xDB, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x4C, 0xC0, 0x73, 0x00, 0x94, 0x40, 0xB2, 0xC0, 0xCF, 0x80, 0xEB, 0x00 - }, - - /* GM_2_3 */ - { - 0x4F, 0x13, 0x18, 0x51, 0x0F, 0x69, 0x0B, 0x6D, 0x09, 0x0F, 0x07, 0x80, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x50, 0x40, 0x76, 0x40, 0x97, 0x00, 0xB5, 0x00, 0xD0, 0xC0, 0xEB, 0x00 - }, - - /* GM_2_4 */ - { - 0x53, 0x13, 0x18, 0x7A, 0x0F, 0x0F, 0x0B, 0x24, 0x08, 0xBC, 0x07, 0x36, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x53, 0x80, 0x79, 0xC0, 0x99, 0xC0, 0xB7, 0x00, 0xD1, 0xC0, 0xEB, 0x00 - }, - - /* GM_2_5 */ - { - 0x57, 0x13, 0x18, 0x51, 0x0E, 0xF0, 0x0A, 0xC3, 0x08, 0x7D, 0x06, 0xED, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x56, 0xC0, 0x7C, 0xC0, 0x9C, 0x80, 0xB8, 0xC0, 0xD2, 0xC0, 0xEB, 0x00 - }, - - /* GM_2_6 */ - { - 0x5B, 0x13, 0x18, 0x28, 0x0E, 0x96, 0x0A, 0x92, 0x08, 0x29, 0x06, 0xB6, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x5A, 0x00, 0x7F, 0xC0, 0x9E, 0xC0, 0xBA, 0x80, 0xD3, 0x80, 0xEB, 0x00 - }, - - /* GM_2_7 */ - { - 0x5E, 0xC4, 0x18, 0x00, 0x0E, 0x78, 0x0A, 0x30, 0x08, 0x00, 0x06, 0x6D, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x5D, 0x00, 0x82, 0x80, 0xA1, 0x40, 0xBC, 0x00, 0xD4, 0x80, 0xEB, 0x00 - }, - - /* GM_2_8 */ - { - 0x62, 0x76, 0x17, 0xD7, 0x0E, 0x1E, 0x0A, 0x00, 0x07, 0xC1, 0x06, 0x36, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x60, 0x00, 0x85, 0x40, 0xA3, 0x40, 0xBD, 0x80, 0xD5, 0x40, 0xEB, 0x00 - }, - - /* GM_2_9 */ - { - 0x65, 0xD8, 0x17, 0xAE, 0x0D, 0xE1, 0x09, 0xCF, 0x07, 0x82, 0x06, 0x00, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x62, 0xC0, 0x87, 0xC0, 0xA5, 0x40, 0xBF, 0x00, 0xD6, 0x00, 0xEB, 0x00 - }, - - /* GM_3_0 */ - { - 0x69, 0x3B, 0x17, 0x85, 0x0D, 0xA5, 0x09, 0x86, 0x07, 0x43, 0x05, 0xDB, - 0x10, 0x1D, 0x36, 0x58, 0x82, 0xB3, 0xEB, - 0x10, 0x00, 0x65, 0x80, 0x8A, 0x40, 0xA7, 0x40, 0xC0, 0x40, 0xD6, 0x80, 0xEB, 0x00 - } -}; - -void __VISetTiming(u8 timing) -{ - __VIWriteI2CRegister8(0x00,timing); -} - -void __VISetYUVSEL(u8 dtvstatus) -{ - u8 vdacFlagRegion = 0; - u32 currTvMode = _SHIFTR(_viReg[1],8,2); - if(currTvMode==VI_PAL || currTvMode==VI_EURGB60) - vdacFlagRegion = 2; - else if(currTvMode==VI_MPAL) - vdacFlagRegion = 1; - - __VIWriteI2CRegister8(0x01, _SHIFTL(dtvstatus,5,3)|(vdacFlagRegion&0x1f)); -} - -void __VISetVBICtrl(u16 data) -{ - __VIWriteI2CRegister16(0x02, data); -} - -void __VISetTrapFilter(u8 disable) -{ - if (disable) - __VIWriteI2CRegister8(0x03, 0); - else - __VIWriteI2CRegister8(0x03, 1); -} - -void __VISet3in1Output(u8 enable) -{ - __VIWriteI2CRegister8(0x04,enable); -} - -void __VISetCGMS(u16 value) -{ - __VIWriteI2CRegister16(0x05, value); -} - -void __VISetWSS(u16 value) -{ - __VIWriteI2CRegister16(0x08, value); -} - -void __VISetRGBOverDrive(u8 value) -{ - u32 currTvMode = _SHIFTR(_viReg[1],8,2); - if (currTvMode == VI_DEBUG) - __VIWriteI2CRegister8(0x0A,(value<<1)|1); - else - __VIWriteI2CRegister8(0x0A,0); -} - -void __VISetOverSampling(void) -{ - __VIWriteI2CRegister8(0x65,1); -} - -void __VISetCCSEL(void) -{ - __VIWriteI2CRegister8(0x6a,1); -} - -void __VISetFilterEURGB60(u8 enable) -{ - __VIWriteI2CRegister8(0x6e, enable); -} - -void __VISetVolume(u16 value) -{ - __VIWriteI2CRegister16(0x71,value); -} - -void __VISetClosedCaption(u32 value) -{ - __VIWriteI2CRegister32(0x7a, value); -} - -void __VISetGamma(VIGamma gamma) -{ - u8 *data = (u8 *)&gamma_coeffs[gamma][0]; - __VIWriteI2CRegisterBuf(0x10, 0x21, data); -} - -/* User Configurable */ - -void VIDEO_SetGamma(VIGamma gamma) -{ - __VISetGamma(gamma); -} - -void VIDEO_SetTrapFilter(bool enable) -{ - if (enable) - __VISetTrapFilter(0); - else - __VISetTrapFilter(1); -} - -#endif diff --git a/genplus-gx/gx/utils/vi_encoder.h b/genplus-gx/gx/utils/vi_encoder.h deleted file mode 100644 index f5290dc568..0000000000 --- a/genplus-gx/gx/utils/vi_encoder.h +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************** - * vi_encoder.c - * - * Wii Audio/Video Encoder support - * - * Copyright (C) 2009 Eke-Eke, with some code from libogc (C) Hector Martin - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ -#ifdef HW_RVL - -typedef enum -{ - VI_GM_0_1=1, - VI_GM_0_2, - VI_GM_0_3, - VI_GM_0_4, - VI_GM_0_5, - VI_GM_0_6, - VI_GM_0_7, - VI_GM_0_8, - VI_GM_0_9, - VI_GM_1_0, - VI_GM_1_1, - VI_GM_1_2, - VI_GM_1_3, - VI_GM_1_4, - VI_GM_1_5, - VI_GM_1_6, - VI_GM_1_7, - VI_GM_1_8, - VI_GM_1_9, - VI_GM_2_0, - VI_GM_2_1, - VI_GM_2_2, - VI_GM_2_3, - VI_GM_2_4, - VI_GM_2_5, - VI_GM_2_6, - VI_GM_2_7, - VI_GM_2_8, - VI_GM_2_9, - VI_GM_3_0 -} VIGamma; - -extern void VIDEO_SetGamma(VIGamma gamma); -extern void VIDEO_SetTrapFilter(bool enable); - - -#endif diff --git a/genplus-gx/sdl/CHANGELOG.txt b/genplus-gx/sdl/CHANGELOG.txt deleted file mode 100644 index 7d7d2cc780..0000000000 --- a/genplus-gx/sdl/CHANGELOG.txt +++ /dev/null @@ -1,694 +0,0 @@ --------------------- -Genesis Plus History --------------------- - -All recent changes were backported from the GX version (Gamecube/Wii port), maintained by Eke-Eke. -Please look at http://code.google.com/p/genplus-gx/ for more infos. - - ---------------------------------------------------------------------------------------------------------- -Genesis Plus GX 1.7.4 (21/06/2013) (Eke-Eke) ---------------------------------------------------------------------------------------------------------- - -[Core/SCD] ---------------- -* fixed access to read-only registers on Main-CPU side ("Batman Returns" platform level freeze) -* fixed & improved emulation of PRG-RAM write protection register ("Lunar Eternal Blue" japanese version freeze) -* improved SUB & MAIN-CPU synchronization ("Dracula Unleashed" freeze when using US Model 2 BIOS) -* improved CPU polling detection -* improved CDD emulation & added CD drive access time for SEEK command ("Panic!/Switch" intro missing scene) -* added missing reinitialization of MAIN-CPU PRG-RAM bank on reset -* added .OGG audio tracks support through LIBTREMOR - -[Core/Sound] ---------------- -* fixed YM2612 configurable DAC depth emulation -* improved Low-Pass filter -* added optional "MONO" output mode - -[Core/VDP] ---------------- -* fixed FIFO access timings when using invalid write code value ("Clue" menu) -* fixed DMA Copy with undocumented code value ("Fatal Labyrinth" end sequence) -* minor code fixes & optimizations - -[Core/CPU] ---------------- -* optimized 68k stack read/write functions -* fixed broken 68k address error emulation -* fixed 68k interrupt behavior (prevents interrupts from being executed multiple time when 68k is halted) -* fixed Z80 registers initial state, added proper initialization when using PBC (verified on real hardware by Charles McDonald) - -[Core/MD] ---------------- -* fixed SRAM incompatibilities between BIG ENDIAN & LITTLE ENDIAN platforms (note: this breaks old .srm files with LITTLE ENDIAN platform ports) -* added support for a few recently dumped unlicensed games -* added auto-detection of byte-swapped ROM files - - ---------------------------------------------------------------------------------------------------------- -Genesis Plus GX 1.7.3 (26/11/2012) (Eke-Eke) ---------------------------------------------------------------------------------------------------------- - -no win32/SDL port changes - - ---------------------------------------------------------------------------------------------------------- -Genesis Plus GX 1.7.2 (24/11/2012) (Eke-Eke) ---------------------------------------------------------------------------------------------------------- - -[Core/SCD] ---------------- -* added default TOC for Shadow of the Beast II (prevent hangs when audio tracks are missing) -* fixed CD-DA fader muting -* fixed PCM channels panning on reset -* fixed backup RAM file management when using disc swap with Mode 1 cartridge -* incremented CD drive read latency: fixes Space Adventure Cobra (freeze when opening coffin at 2nd morgue scene) -* improved CDD emulation accuracy: fixes Snatcher (freeze at the end of Act 2) & various CD player bugs -* improved MAIN-SUB memory map mirroring in SCD mode (verified on real hardware by Charles McDonald) -* implemented cycle-accurate "stopwatch" register emulation - -[Core/Sound] ---------------- -* fixed broken PSG noise frequency -* fixed incorrect Game Gear PSG stereo emulation -* implemented cycle-accurate Game Gear PSG stereo - -[Core/VDP] ---------------- -* fixed broken VDP DMA from SVP ROM latency (graphic errors in Virtua Racing) - -[Core/MD] ---------------- -* added Super Mario World 64 (unlicensed) cartridge hardware emulation - -[Core/Input] ---------------- -* added automatic detection for CD games with Justifier/Menacer support -* improved Justifier/Menacer emulation - - ---------------------------------------------------------------------------------------------------------- -Genesis Plus GX 1.7.1 (13/10/2012) (Eke-Eke) ---------------------------------------------------------------------------------------------------------- - -[Core/SCD] ---------------- -* added support for CUE files -* added CD-DA tracks emulation (needs CUE+BIN or ISO+WAV images) -* added CD fader emulation -* added CDD "Fast FW" & "Fast RW" commands emulation -* improved CDD TOC emulation (random freezes in Sonic CD, Switch/Panic, Final Fight CD and probably many others) -* improved PCM chip synchronization with SUB-CPU (missing speeches in Willy Beamish) -* fixed PCM chip emulation (random hangs in Snatcher, missing sound effects in Switch/Panic, Final Fight CD, Wonderdog...) -* fixed Word-RAM memory mode on soft-reset (missing logo gfx effects) -* fixed SUB-CPU access to unused areas when using PC-relative instructions (Final Fight CD first boss random crash) -* fixed CPU idle loop detection on memory mode register access (Pugsy CD first boss slowdown) -* fixed Mode 1 emulation (cartridge boot mode) - -[Core/Sound] ---------------- -* replaced FIR resampler by Blip Buffer for FM resampling -* modified SN76489 core for use of Blip Buffer -* improved PSG & FM chips synchronization using Blip Buffer -* added Game Gear PSG stereo support -* fixed SG-1000 specific PSG noise -* fixed YM2612 LFO AM waveform (California Games surfing event) -* fixed YM2612 phase precision -* minor optimizations to YM2612 core - -[Core/Game Gear] ---------------- -* added support for CJ Elephant Fugitive (recently released by SMS Power) -* added Game Gear extended screen option - -[Core/Genesis] ---------------- -* added support for a few recently dumped (but unreleased) games - -[Core/General] ---------------- -* improved ROM & CD image file loading -* various code cleanup - - ---------------------------------------------------------------------------------------------------------- -Genesis Plus GX 1.7.0 (01/07/2012) (Eke-Eke) ---------------------------------------------------------------------------------------------------------- - -[Core/SCD] ---------------- -* added Mega CD / Sega CD hardware emulation (incl. Sub 68K, CDD, CDC, PCM, GFX rotation/scaling, etc) -* added .ISO & .BIN CD image file support -* added 512K backup cartridge RAM support -* added savestate support for CD games - -NOTES: -~~~~~~ -* to play CD games, original BIOS ROM files are required in /genplus/bios/ directory: unzip & rename them to bios_CD_U.bin, bios_CD_E.bin, bios_CD_J.bin -* CD audio tracks (CD-DA) are not supported (yet) - -[Core/CPU] ---------------- -* modified 68k core for Mega CD / Sega CD support -* optimized 68k core using prebuild const tables - -[Core/VDP] ---------------- -* improved DMA accuracy -* improved accuracy of nametables register & VSRAM writes during HBLANK: fixes "The Adventures of Batman & Robin" (graphical issues during 2nd Boss fight). -* added support for 8-bit VRAM writes with undocumented code value (verified on real hardware by Nemesis) - -[Core/Sound] ---------------- -* improved synchronization between SN76489 & YM2162 cores. -* improved accuracy of SN76489 core timings. - -[Core/MD] ---------------- -* added support for some recently dumped unlicensed games. -* improved emulation of 32k bankswitch hardware used by a few unlicensed games. -* fixed behavior of Z80 banked reads from 68k RAM (verified on real hardware). -* fixed support for 128K Pro Action Replay ROM. - -[Core/MS] ---------------- -* added support for all recent korean ROM dumps by SMS Power. -* added emulation of korean multi-game mapper (4-Pak All Action) -* added pseudo-random RAM pattern initialization on Mark-III and Japanese Master System (fixes "Alibaba and 40 Thieves" & "Block Hole") -* added port $3E emulation & internal BOOTROM support (Master System & Game Gear only). - -[Core/General] ---------------- -* added an option to set VDP mode (PAL/NTSC) independently from console region. -* added an option to select original system master clock frequency (PAL/NTSC/AUTO), emulation will run at selected frequency when VSYNC is disabled. -* fixed 68k context loading/saving (Sol Deace). -* fixed C89 incompatibilities for better portability. -* removed use of "long int" type for portability on 64-bit platforms. -* moved savestate zlib compression out of emulation core (for ports that don't use it). -* various optimizations. - -[Gamecube/Wii] ---------------- -* removed ROM load device selection from Load Menu: default ROM device must now be configured in menu settings. -* added specific load buttons, browsers & saved paths for each systems, this also fixes slowdowns caused by screenshot loading when browsing from slow devices. -* added support for left/right buttons as page up/down keys in ROM browsers -* added right analog stick as default "return to menu" key for Gamecube controllers -* added alternate remappable menu key combo for Gamecube controllers -* added an option to disable VSYNC (emulator is synced with audio hardware instead of video). -* added an option to boot system from "BIOS", with or without cartridge. -* added Master System & Game Gear "BIOS" support (files should be named bios_U.sms, bios_J.sms, bios_E.sms & bios.gg and copied to /genplus/bios directory). -* replaced "Hard Reset" button by a Soft Reset for systems having a Reset button (Mega Drive / Genesis & Master System) -* State & SRAM files are now only compressed when saving to Gamecube Memory Cards -* various fixes & cleanup. -* compiled with devkitPPC r26 & libogc 1.8.11. - -[Gamecube] ----------- -* improved progressive mode support when component cable is detected (hold B during startup to switch menu video mode configuration) - - ---------------------------------------------------------------------------------------------------------- -[07/08/2011] version 1.6.0 (Eke-Eke) ---------------------------------------------------------------------------------------------------------- - -[Core/Sound] ---------------- -* added YM2413 emulation in Master System compatibility mode. -* fixed SN76489 noise boost initialization. -* minor YM2612 core optimizations. - -[Core/VDP] ---------------- -* added accurate emulation of SG-1000, Master System (315-5124, 315-5246) & Game Gear VDP. -* added support for all TMS9918 rendering modes. -* improved Mega Drive VDP timings accuracy in Master System Compatibility mode. -* fixed color palette initialization. -* fixed shifted sprites rendering in Mode 4. -* modified pixel rendering support (pixel depth is now forced at compilation time). - -[Core/CPU] ---------------- -* optimized 68k core (rewrote 68k interrupt handling, removed multiple CPU types support & unused code) for 5~8% speed improvment - -[Core/IO] ---------------- -* added accurate emulation of Master System (315-5216, 315-5237, 315-5297) & Game Gear I/O controllers. -* added Terebi Oekaki tablet emulation. -* improved Mouse emulation (fixes mouse support in Cannon Fodder). -* improved Justifier emulation (fixes gun support in Lethal Enforcers 2). -* improved 6-Buttons control pad emulation (fixes Duke Nukem 3D) -* modified lightgun emulation to use common key inputs for all devices. -* 2-buttons controller is now picked by default for Master System games. - -[Core/MD] ---------------- -* added copy-protection hardware emulation for some new dumped games (Tiny Toon Adventures 3, Mighty Morphin Power Rangers & The Battle of Red Cliffs). -* added Game Toshokan in EEPROM database (verified on real cartridge). -* fixed Micro Machines 2 - Turbo Tournament EEPROM size (verified on real cartridge). -* modified SRAM banswitch hardware emulation to be more compatible with some hacks. - -[Core/MS] ---------------- -* added Cyborg Z to Korean mapper database. - -[Core/GG] ---------------- -* added 93C46 EEPROM emulation (Majors Pro Baseball, World Series Baseball & World Series Baseball 95). - -[Core/General] ---------------- -* added support for .mdx ROM format. -* added Game Gear & SG-1000 ROM support. -* added accurate emulation of SG-1000, Master System (I, II) & Game Gear hardware models for 100% compatibility. -* updated to new Genesis Plus license (see http://cgfm2.emuviews.com/) -* removed DOS port -* various code cleanup. - - ---------------------------------------------------------------------------------------------------------- -[31/03/2011] version 1.5.0 (Eke-Eke) ---------------------------------------------------------------------------------------------------------- - -[Core/VDP] ---------------- -* added support for Master System compatibility mode (Z80 ports access mode), incl. Mode 5 rendering. -* added Mode 4 rendering for both Genesis & Master System modes. -* added alternate BG planes rendering functions (should be faster on PPC architectures). - -[Core/IO] ---------------- -* added support for Master System compatibility mode (Z80 ports access mode). -* added Master System peripherals emulation (Control Pad, Paddle, Sports Pad & Light Phaser). -* added XE-1AP (analog controller) emulation. -* added Activator emulation. - -[Core/Extra] ---------------- -* added support for all known Master System cartridge mappers. -* added copy-protection hardware emulation for a few MD unlicensed games: fixes 777 Casino (crash when talking to bunny girls). -(NB: most of those unlicensed games seem to have been already patched by ROM dumpers, main purpose is documenting them) -* added support for Top Shooter arcade board controller. (A=Shoot, B=Bet, C/RIGHT=Coins, START=Start, hold UP on startup to enter service mode) -* improved King of Fighters 98 mapper emulation (registers address decoding is now 100% accurate) -* fixed Game Genie when several codes affect same ROM address. -* fixed EEPROM types for Brian Lara Cricket & NBA Jam TE (verified on real cartridges) - -[Core/General] ---------------- -* added Master System compatibility mode emulation (automatically enabled when loading ROM file with .sms extension). -* improved savestate stability & compatibility (support for old 1.4.x savestates is preserved) -* various code cleanup & comments. - - ---------------------------------------------------------------------------------------------------------- -[04/12/2010] version 1.4.1 (Eke-Eke) ---------------------------------------------------------------------------------------------------------- - -[Core/Sound] ---------------- -* implemented Blargg's blip buffer in SN76489 core (all channels are now lineary interpolated) - -[Core/VDP] ---------------- -* improved 2-cell vscroll emulation accuracy, as verified on real hardware (Gynoug, Cutie Suzuki no Ringside Angel, Formula One, Kawasaki Superbike Challenge) -* improved VBLANK flag accuracy, as observed on real hardware. -* improved DMA operations accuracy, writes are now performed on a scanline basis: fixes Gaiares (flickering title screen). -* improved DMA Fill timing accuracy. -* fixed DMA with bad code values: fixes Williams Arcade Classics (corrupted gfx after soft reset). -* fixed horizontal resolution changes during HBLANK: fixes Bugs Bunny in Double Trouble (2nd stage). -* fixed Vertical Counter in interlace mode 1, as observed on real hardware. -* fixed horizontal border width, as observed on real hardware. -* various code improvments & optimizations. - -[Core/CPU] ---------------- -* fixed state of Z80 registers on reset (sound issues with Defender & Defender 2 in Williams Arcade Classics) -* implemented 68k undocumented flags behavior for DIVU/DIVS instructions (Bloodshot / Battle Frenzy) - -[Core/Extra] ---------------- -* improved emulation of copy-protection hardware found in some unlicensed cartridges (Mulan, Pocket Monsters II). -* enabled simultaneous use of multitap & J-CART (Super Skidmarks 6-player mode) -* improved savestate format: added DMA, SVP, cartridge mapping & internal registers state informations -* improved unlicensed ROM mappers emulation -* added Chinese Fighters III mapper support -* added Top Fighter mapper support -* fixed Barver Battle Saga mapper support -* fixed cartridge hardware soft-reset (Game Genie, SVP, ...) -* fixed Game Genie registers byte reads - - ----------------------------------------------------------------------------------------------------------------------------------------------------- -[06/30/10] version 1.4.0 (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -[Core/Sound] - -* completely rewrote sound processing/mixing: sound chips are now clocked with exact output framerate -to ensure 100% smooth video & audio playback, with no lag or skipping, while rendering an accurate number -of samples per frame and keeping PSG & FM chips in sync. -* improved PSG & FM chips synchronization with CPU execution (fixed point precision). -* improved YM2612 core general accuracy (SSG-EG, CSM mode,...) (based upon Nemesis recent tests on real hardware) -* improved YM2612 LFO emulation accuracy: fixes "Spider-Man & Venom : Separation Anxiety" (intro) -* fixed YM2612 bug with Timer B: fixes "Langrisser Hikari II"/"Der Langrisser II" (Sega logo) -* fixed YM2612 context saving/loading. -* fixed YM2612 state on reset. -* removed outdated & less accurate Gens YM2612 core -* added configurable YM2612 DAC resolution emulation. -* added configurable & faster FIR resampler (thanks to Blargg & AamirM), removed libsamplerate support. -* added configurable Low-Pass filtering -* added configurable 3-Band Equalizer (thanks to Neil C). -* added an option to boost SN76489 Noise Channel. -* adjusted SN76489 cut-off frequency. - - -[Core/VDP] - -* added support for CRAM writes during horizontal blanking (Striker, Zero the Kamikaze Squirrel,...) -* added support for 2-Cell vertical scrolling in Interlaced 2 mode -* added support for some undocumented mode register bits -* added proper emulation of HV Counter latch: fixes Sunset Riders intro -* added pixel-accurate emulation of mid-line display on/off (Nigel Mansell World Championship PAL, Ren & Stimpy's Invention PAL,...) -* improved FIFO timings accuracy: fixes Sol Deace intro -* improved sprite masking accuracy (thanks to Nemesis for his test program) -* improved sprites processing accuracy: fixes (un)masked sprites in Mickey Mania (3D level), Sonic 2 (VS mode). -* improved HBLANK flag timing accuracy: fixes Mega Turrican (Sky level) -* improved horizontal blanking & HINT/VINT occurence timing accuracy, as measured on real hardware. -* improved HCounter accuracy in 40-cell mode, as measured on real hardware. -* improved color accuracy in VDP highlight mode to match results observed on real hardware - - -[Core/CPU] - -* updated Z80 core to last version (fixes interrupt Mode 0 timing and some BIT instructions). -* fixed some Z80 instructions timing. -* improved Z80 interrupt accuracy -* improved 68k accuracy (initial Reset timing + auto-vectored interrupts handling). -* improved 68k timing accuracy for DIVU/DVIS (thanks to Jorge Cwik) & MULU/MULS instructions. -* improved Z80 & 68k cpu execution/synchronization accuracy by using Master Clock as common reference (now run exactly 3420 M-Cycles per line). -* modified Z80 & 68k cores to directly use external cycle count instead of intermediate counters. - - -[Core/Extra] - -* added Game Genie hardware emulation (Game Genie ROM is now fully supported). -* added Action Replay hardware emulation (Action replay ROM is now fully supported). -* added S&K "Lock-On" hardware emulation (you can "lock" any games to Sonic & Knuckles). -* added Cartridge "hot swap" feature. -* added missing EEPROM support in some games. -* added accurate TMSS emulation (VDP lock-out) -* fixed Realtec mapper emulation: fixes missing sound in Balloon Boy / Funny World. -* fixed lightgun auto-detection: fixes default cursor position in Lethal Enforcers II. -* lots of code cleanup, bugfixes & optimization. - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [12/14/08] version 1.3.0 (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* YM2612 bugfixes (MAME core): - .fixed EG Decay->Substain transition when SL & DR are minimals: fix tracks #3 and #9 in "Mega Turrican" - .fixed a bug in SSG-EG emulation code: fix Level 1 music in "Alisia Dragoon" - .modified SSG-EG Decay End Level: fix some sound effects (ChainSaw, Zap...) in "Beavis & Butthead" - .improved Detune overflow accuracy: fix very high frequency sounds in many games - .fixed registers 0x20-0x26 Reset state: fix intro music in "B.O.B" - .reverted incorrect fix with KEY ON: fix "Flamethrower" sound effect in "Alien 3" and many others -* adjusted HCounter values: fixes line flickering in "Sonic 3D" bonus stage -* adjusted VINT timing: fixes hang-up in "V.R Troopers" -* improved HBLANK flag accuracy: fixes line flickering in "Gouketsuji Ichizoku" -* fixed broken Z80 access to WRAM: fixes hang-up in "Mamono Hunter Youko" -* modified JCART emulation: fixes corrupted tracks logo in "Micro Machines 2" -* added Blargg's NTSC Filters support (NTSC video artifacts emulation) -* optimized VDP rendering core, rewrote 68k interface (memory handlers, cycle execution, interrupts): greatly improved emulation speed - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [08/26/08] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* YM2612(MAME): fixed LFO phase update for CH3 special mode: fix sound effects in Warlock & Aladdin (thanks to AamirM) -* YM2612(MAME): fixed EG attenuation level on "KEY ON": fix Ecco 2's splash sound -* YM2612(MAME): fixed SSG-EG emulation: fix Bubba'n Stix (Track 5) and many others -* YM2612(MAME): replaced sample interpolation with libsamplerate support, High Quality mode is now more accurate -* implemented cycle-accurate HINT timings: every timing sensitive games/demos are now *finally* working fine -* fixed a bug affecting CRAM/VSRAM DMA timings -* fixed Sprite Attribute Table address mask for VRAM writes -* improved accuracy of 68k access to Z80: fix music in Pacman 2 when entering PAUSE menu -* disabled "Address Error" emulation when UMK3 hack is loaded: fix game crashing after a round ends up -* added support for some more unlicensed games: Pocket Monster, King of Fighter 98, Soul Blade (credits to Haze) -* improved Menacer emulation: fix lightgun support in Body Count & T2: The Arcade Game -* added Konami Justifier emulation: fix lightgun support in Lethal Enforcers 1 & 2 -* added Sega Mouse emulation (Populous 2, Body Count, Shangai 2, Fun'n Games, ...) - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [07/16/08] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* adjusted (again) HINT timings: fix Double Dragon 2 (game freezed), hopefully does not break anything else -* fixed broken EEPROM support for Codemaster games -* modified input update timings: fix Dungeons & Dragons * Warriors of the Eternal Sun (thanks to Notaz) -* added support for "Ultimate Mortal Kombat Trilogy" hack (max. size supported is 10MBytes) -* added (VERY) preliminar support for PICO roms (credits to Notaz for his documentation) -* improved YM2612 emulation (credits to Nemesis for his tests on real hardware): - .implemented phase overflow emulation: improved fix for special music instrument used in Comix Zone, Flashback, Ariel, Shaq Fu... - .improved SSG-EG emulation in MAME core (also based on additional code from Alone Coder) - .improved Timers emulation accuracy - .improved Enveloppe Generator accuracy - .fixed Channel 3 CSM mode emulation - .implemented sample interpolation in MAME core to emulate the chip at original frequency (HQ YM2612 mode, from gens) - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [06/01/08] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* improved HCounter accuracy: fix graphic glitches in "Striker (Europe)" -* improved HINT timing accuracy: fix flickering in "Zero The Kamikaze Squirrel (USA)" -* improved rendering accuracy when backdrop color is modified during HBLANK (Road Rash I/II/III) -* fixed broken Game Genie support - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [04/19/08] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* modified VINT timings a little bit: fix lockup during Desert Strike's intro -* corrected 68k interrupts handling: fix graphic glitches in Darius II/Sagaia - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [04/06/08] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* updated SVP core: fix some perspective issues in Virtua Racing (thanks to Notaz) -* added internal SAT update during VRAM Fill: fix unmasked sprites during Battletech's intro -* fixed m68k core issues with gcc 4.2.3: fix Xperts, Lemmings 2, M1 Abrams Battle Tank -* forced YM2612 Enveloppe update: fix intro music in Batman&Robin (thanks to Aamir) - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [03/01/08] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* added SVP emulation: Virtua Racing is now emulated (big thanks to Notaz and TascoDeluxe) -* fixed VDP registers behaviour when VDP Mode 4 is enabled: fix Bass Masters Classic Pro, Captain Planet & The Planeeters -* corrected a bug in DMA Fill operation: fix James Pond 3, Rockman World/Megaman Willy Wars (corrupted VRAM) -* corrected typo errors in CPU cycle counters update: fix optiom screen music in "College Slam" and probably others games. -* added preliminary support of undocumented YM2612 bug: fixes soundtracks of Shaq Fu, Spiderman, Comix Zone, Ariel and some others -* added support for mappers & copy protection devices used in many unlicensed/pirate cartridges (see cart_hw.c for details) -* rewrote memory handlers for better modularity and some (little) speedup -* reduced Savestate size - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [01/07/08] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* fixed interleaved rom detection: roms with .smd extension should now work fine -* fixed a recently introduced bug in VDP registers writes: fixes bad colors in Toy Story (intro) -* updated list of games using EEPROM: added Sports Talk Baseball (internal memory check fixed) and Brian Lara Cricket -* fixed VINT flag update when VINT is disabled: fixes NCAA College Football -* adjusted DMA timings in H32 mode: fixes flickering in Out of this World, Kawasaki Superbike Challenge & Formula One -* adjusted line rendering and HBLANK timings: fixes flickering in Nigel Mansell's World Championship Racing, Deadly Moves/Power Athlete -* fixed unmapped ROM reads through Z80 Bank: fixes Zombie High (Proto) -* added support for custom ROM/RAM mapping used by Game no Kanzume Otokuyou - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [12/28/07] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* many sourcecode cleanup and optimization -* completely rewrote EEPROM emulation: now support all known EEPROM types (24C01-24C65) and mappers (Sega, Acclaim, EA, Codemasters) -used in a few games (now use internal game database) as external RAM. This should at least fix save support in the following games: - . NBA Jam (alternate Acclaim mapper) - . College Slam, Frank Thomas Big Hurt Baseball (24C65 type) - . NHLPA Hockey 93, Rings of Power (EA mapper) - . Micro Machines serie, Brian Lara Cricket 96/Shane Warne Cricket (Codemasters mapper) -* external RAM is now initialized to 0xFF by default: fix Micromachines 2, Dino Dini Soccer -* fixed SRAM 16-bits memory handlers: fix some Sega Sports and EA Sports games (NFL95, NBA Action 95, NHL97, NHL98,...) -* modified WRITE_xxx & READ_xxx macros for better portability and faster memory access on BIG ENDIAN platform -* completely rewrote BIG ENDIAN support in render.c and vdp.c: rendering should be a little faster -* rewrote ROM bankswitch emulation (Super Street Fighter II): ROM access are faster, using memory pointers instead of reading ROM copy from ARAM -* fixed leftmost Window/PlaneA column render and implemented Window bug (as described by Charles Mc Donald) -* improved "Sprite Limit" and "Sprite Collision" detection accuracy -* modified RGB565 Color Palette to use the full available color range (0-31;0-63) -* implemented "cycle accurate" HV Interrupt timings: fix Sesame's Street Counting Cafe, Legend of Galahad (intro) -* improved VDP access timings accuracy (added FIFO emulation): fix Double Clutch -* improved DMA timings accuracy: fix Winter Olympics (E), Arch Rivals and probably more -* fixed HCounter again: Road Rash serie (I,II,III) don't need timing hacks anymore -* fixed VCounter in Interlaced 2 mode: fix Combat Cars "VS-Mode" -* improved Interlaced 2 mode (double resolution) rendering: Sonic 2, Combat Cars ("VS-Modes") look far better -* added TMSS BIOS support (optional) -* rewrote part of the YM2162 MAME's core: fixed internal FM timers handling, removed non-YM2612 emulation code and unused multiple cpu support -* implemented "cycle accurate" FM timers & sound samples rendering -* improved Z80 Interrupt timing accuracy: fix Sonic 3 music slowdowns -* updated Z80 & 68000 cores to last MAME versions -* improved Soft Reset emulation: X-Men 2 and Eternal Champions (random character selection) now work more like on real hardware. -* added full overscan emulation (vertical & horizontal borders) for "pixel perfect" aspect ratio (tested against a real genesis) - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [07/20/07] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* corrected TeamPlayer support: fix multiplayer in Gauntlet 4 (Sept. version), Pengo and a lot of others -* added J-Cart support: enable multiplayer in Codemasters games (Pete Sampras, Micromachines games, Super Skidmarks) -* added serial EEPROM autodetection: fix games with bad SRAM informations in header (NBA Jam TE) -* added SVP faking: display 2D graphics in Virtua Racing (the game is however still unplayable) -* added support for more internal IO registers: fixe some unlicensed games (Wisdom Tree games...) -* added preliminary support for unmapped protection device: fix some unlicensed games with special built-in hardware (Squirell King, Lion King 2...) -* added "Soft Reset" combo (in game, use L+Z triggers): this should be like pressing the RESET button on a real Genesis and this is required - in some games to enable special features or even complete the game (ex: X-Men). - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [06/21/07] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* added Multitap support (EA 4-Way Play and Sega Teamplayer): allowed up to four players in games supporting those peripherals -* added partial Sega Menacer lightgun support (use Analog Stick): automatically set when detecting the 6-in-1 Menacer game - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [05/18/07] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* you can now switch between FM cores without reseting the game. FM registers value are automatically restored when switching. -* removed the previous VINT timings modification because it brokes some games (Rocket Knight, Thunderforce III,...) -* added automatic Timing configuration (VDP latency, VINT timing & alternate Line Timing) at game loading, based upon specific romname detection. -This means you can still modify some of these options afterwards but they are now automatically set/unset when loading a game which need -special timing fixes. These fixes are also automatically desactivated when the current game doesn't need them. -For information, games that are actually detected and need special timings to run properly are: - .Legend of Galahad & Road Rash series (single line not rendered properly) - .Sesame Street Counting Cafe (don't boot) - .Chaos Engine/Soldiers of Fortune (graphic glitches on scrolling) - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [05/08/07] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* VINT timings are now a little more accurate: fixes Sesame's Street Counting Cafe -* SN76496 MAX_OUTPUT back to normal -* modified FB_WNOISE value in SN76496 core according to John Kortink's last informations -* added support for Maxim's PSG core, same as used in SMSPLUS (it becomes the default PSG core) -* updated FM core to the latest MAME version -* corrected DAC output level (fixes voices and some special FX being too low) -* added support for Gens YM2612 (FM) core (MAME's one still remains default FM core) -* added configurable preamplification for each sound cores (see Emulator Options) -* added some other configurable sound options (boost overall volume, FM improvment for Gens YM2612) - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [04/11/07] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* corrected MAX_OUTPUT value in SN76496 core: fix PSG sound (SFX) volume - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [03/17/07] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - - * added an option to enable alternate line rendering timing (fix single line error in Road Rash series and Legend of Galahad's Intro) - * Color RAM update now always reset color 0 to border color (fix color glitches in Mortal Kombat,...) (thanks to Noop's for the idea) - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [03/09/07] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* modified HV counter tables (fix graphic glitches in Skitchin's sky, Lotus 2 Recs, Panorama Cotton, Dashin Desperados & maybe more) -* completely rewrote DMA timings emulation so that it works for all games (no more cpu freezing) -* added all DMA tranfer rates handling for each three DMA modes and added dma busy flag emulation -* modified interrupts handling on VDP register #0 and #1 writes (fix Lemmings status bar) -* added VDP RAM write latency (fix Chaos Engine/Soldier of Fortune gfx glitches) -* modified FM timers handling a bit (fix Vectorman2 music) -* corrected Sprite Limit rendering (fix Sonic 1 & Micromachines 2 title screens) -* corrected IO Registers writes (fix Decap' Attack controls, no more need for alternate input) -* corrected 6 Buttons Pad emulation (fix 6buttons detection in Mortal Kombat 3, Comix Zone and other 6-buttons compatible games) -* modified sound mixing a bit according to Generator sourcecode (FM and PSG ratios seems more correct) - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [02/07/07] (Eke-Eke) ----------------------------------------------------------------------------------------------------------------------------------------------------- - -* fixed fm timers (fix missing music in Castle of Illusion, Quackshot, Undead Line, Wonderboy in Monster Lair, Cal 50, Turbo Outrun, Thundeforce 4 and maybe more) -* added complete EEPROM emulation (save support now works fine in Wonderboy5, Megaman Willy Wars, NBA Jam...) (credits to Notaz, adapted from Picodrive code) -* added preliminar dma timing emulation (fix bottom screen in Legend of Galahad) (credits to Notaz, adapted from Picodrive code) -* hack: clear Vint pending after Hint (INT level 4) acknowledge (fix Fatal Rewind) -* hack: modify read_bus16 to return a random value (fake fetch) (fix Time Killers) -* modified cpu execution timings, with more correct hblank and interrupts timing (fix ISS Deluxe, Double Dragon 2 and certainly more) (Based on Gens code) -* modified busreq mechanism: better synchro between z80 & 68k (no need to dejitter anymore) (Based on Gens code) -* added sprite collision detection (fix Strider 2) -* modified dma fill operation for big endian platform (fix Contra Hardcorps gfx garbage) - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [05/25/03] (Charles MacDonald) ----------------------------------------------------------------------------------------------------------------------------------------------------- - - * Fixed a typo that made Z80 banked access to the VDP registers always fail. - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [05/17/03] (Charles MacDonald) ----------------------------------------------------------------------------------------------------------------------------------------------------- - - * Modified the rendering code to handle unaligned longword access to memory. - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [04/20/03] (Charles MacDonald) ----------------------------------------------------------------------------------------------------------------------------------------------------- - - * Modified 68000 emulator to prevent 'tas.b $mem' from writing data back - after a read (fixes Gargoyles). - * Fixed bug in 68000 emulator to swap order of words written for address - register indirect pre-decremented writes (fixes Jim Power graphics). - * Added support for 240-line displays (for Super Skidmarks). - * Rewrote part of the interrupt handling (fixes some raster effects). - * Removed sprite collision detection code (never really worked). - * Optimized sprite rendering inner loop. - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [04/13/03] (Charles MacDonald) ----------------------------------------------------------------------------------------------------------------------------------------------------- - * Finished up memory map for VDP DMA V-bus reads. - * Fixed handling of 68000 writes to I/O chip at even addresses. - * Fixed bit 7 handling of control register in I/O chip. - * Finished up Z80 memory map. - * Added code to handle Genesis hardware lock-ups. - * Removed some faulty code from the 68000 memory map handlers. - - ----------------------------------------------------------------------------------------------------------------------------------------------------- - [03/22/03] (Charles MacDonald) ----------------------------------------------------------------------------------------------------------------------------------------------------- - - * Completed implementation of Z80 banked memory handlers. - diff --git a/genplus-gx/sdl/LICENSE.txt b/genplus-gx/sdl/LICENSE.txt deleted file mode 100644 index a8d781cfd8..0000000000 --- a/genplus-gx/sdl/LICENSE.txt +++ /dev/null @@ -1,585 +0,0 @@ - -Unless otherwise explicitly stated, all code in Genesis Plus is released -under the following license: - -Copyright Charles MacDonald -Some portions copyright Nicola Salmoria and the MAME team -All rights reserved. - -Copyright (c) 2006-2013 Eke-Eke -All rights reserved. - -Redistribution and use of this code or any derivative works are permitted -provided that the following conditions are met: - -* Redistributions may not be sold, nor may they be used in a commercial -product or activity. - -* Redistributions that are modified from the original source must include the -complete source code, including the source code for all components used by a -binary built from the modified sources. However, as a special exception, the -source code distributed need not include anything that is normally distributed -(in either source or binary form) with the major components (compiler, kernel, -and so on) of the operating system on which the executable runs, unless that -component itself accompanies the executable. - -* Redistributions must reproduce the above copyright notice, this list of -conditions and the following disclaimer in the documentation and/or other -materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - ----------------------------------------------------------------------------------------- - -TREMOR library is distributed under the following license: - -Copyright (c) 2002, Xiph.org Foundation - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -- Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -- Neither the name of the Xiph.org Foundation nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - ----------------------------------------------------------------------------------------- - -NTSC Filter and Blip Buffer libraries are distributed under the -terms of the GNU Lesser General Public License - - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/genplus-gx/sdl/Makefile.sdl b/genplus-gx/sdl/Makefile.sdl deleted file mode 100644 index 1dd05ce166..0000000000 --- a/genplus-gx/sdl/Makefile.sdl +++ /dev/null @@ -1,173 +0,0 @@ - -# Makefile for genplus SDL -# -# (c) 1999, 2000, 2001, 2002, 2003 Charles MacDonald -# modified by Eke-Eke -# -# Defines : -# -DLSB_FIRST : for little endian systems. -# -DLOGERROR : enable message logging -# -DLOGVDP : enable VDP debug messages -# -DLOGSOUND : enable AUDIO debug messages -# -DLOG_SCD : enable SCD debug messages -# -DLOG_CDD : enable CDD debug messages -# -DLOG_CDC : enable CDC debug messages -# -DLOG_PCM : enable PCM debug messages -# -DLOGSOUND : enable AUDIO debug messages -# -D8BPP_RENDERING - configure for 8-bit pixels (RGB332) -# -D15BPP_RENDERING - configure for 15-bit pixels (RGB555) -# -D16BPP_RENDERING - configure for 16-bit pixels (RGB565) -# -D32BPP_RENDERING - configure for 32-bit pixels (RGB888) - -NAME = gen_sdl.exe - -CC = gcc -CFLAGS = `sdl-config --cflags` -march=i686 -O6 -fomit-frame-pointer -Wall -Wno-strict-aliasing -ansi -std=c89 -pedantic-errors -#-g -ggdb -pg -#-fomit-frame-pointer -#LDFLAGS = -pg -DEFINES = -DLSB_FIRST -DUSE_16BPP_RENDERING -DUSE_LIBTREMOR - -SRCDIR = ../core -INCLUDES = -I$(SRCDIR) -I$(SRCDIR)/z80 -I$(SRCDIR)/m68k -I$(SRCDIR)/sound -I$(SRCDIR)/input_hw -I$(SRCDIR)/cart_hw -I$(SRCDIR)/cart_hw/svp -I$(SRCDIR)/cd_hw -I$(SRCDIR)/ntsc -I$(SRCDIR)/tremor -I$(SRCDIR)/../sdl -LIBS = `sdl-config --libs` -lz -lm - -OBJDIR = ./build_sdl - -OBJECTS = $(OBJDIR)/z80.o - -OBJECTS += $(OBJDIR)/m68kcpu.o \ - $(OBJDIR)/s68kcpu.o - -OBJECTS += $(OBJDIR)/genesis.o \ - $(OBJDIR)/vdp_ctrl.o \ - $(OBJDIR)/vdp_render.o \ - $(OBJDIR)/system.o \ - $(OBJDIR)/io_ctrl.o \ - $(OBJDIR)/mem68k.o \ - $(OBJDIR)/memz80.o \ - $(OBJDIR)/membnk.o \ - $(OBJDIR)/state.o \ - $(OBJDIR)/loadrom.o - -OBJECTS += $(OBJDIR)/input.o \ - $(OBJDIR)/gamepad.o \ - $(OBJDIR)/lightgun.o \ - $(OBJDIR)/mouse.o \ - $(OBJDIR)/activator.o \ - $(OBJDIR)/xe_a1p.o \ - $(OBJDIR)/teamplayer.o \ - $(OBJDIR)/paddle.o \ - $(OBJDIR)/sportspad.o \ - $(OBJDIR)/terebi_oekaki.o - -OBJECTS += $(OBJDIR)/sound.o \ - $(OBJDIR)/sn76489.o \ - $(OBJDIR)/ym2413.o \ - $(OBJDIR)/ym2612.o - -OBJECTS += $(OBJDIR)/blip_buf.o - -OBJECTS += $(OBJDIR)/eq.o - -OBJECTS += $(OBJDIR)/sram.o \ - $(OBJDIR)/svp.o \ - $(OBJDIR)/ssp16.o \ - $(OBJDIR)/ggenie.o \ - $(OBJDIR)/areplay.o \ - $(OBJDIR)/eeprom_93c.o \ - $(OBJDIR)/eeprom_i2c.o \ - $(OBJDIR)/eeprom_spi.o \ - $(OBJDIR)/md_cart.o \ - $(OBJDIR)/sms_cart.o - -OBJECTS += $(OBJDIR)/scd.o \ - $(OBJDIR)/cdd.o \ - $(OBJDIR)/cdc.o \ - $(OBJDIR)/gfx.o \ - $(OBJDIR)/pcm.o \ - $(OBJDIR)/cd_cart.o - -OBJECTS += $(OBJDIR)/sms_ntsc.o \ - $(OBJDIR)/md_ntsc.o - -OBJECTS += $(OBJDIR)/main.o \ - $(OBJDIR)/config.o \ - $(OBJDIR)/error.o \ - $(OBJDIR)/unzip.o \ - $(OBJDIR)/fileio.o - -OBJECTS += $(OBJDIR)/bitwise.o \ - $(OBJDIR)/block.o \ - $(OBJDIR)/codebook.o \ - $(OBJDIR)/floor0.o \ - $(OBJDIR)/floor1.o \ - $(OBJDIR)/framing.o \ - $(OBJDIR)/info.o \ - $(OBJDIR)/mapping0.o \ - $(OBJDIR)/mdct.o \ - $(OBJDIR)/registry.o \ - $(OBJDIR)/res012.o \ - $(OBJDIR)/sharedbook.o \ - $(OBJDIR)/synthesis.o \ - $(OBJDIR)/vorbisfile.o \ - $(OBJDIR)/window.o - -OBJECTS += $(OBJDIR)/icon.o - -all: $(NAME) - -$(NAME): $(OBJDIR) $(OBJECTS) - $(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $@ - -$(OBJDIR) : - @[ -d $@ ] || mkdir -p $@ - -$(OBJDIR)/%.o : $(SRCDIR)/%.c $(SRCDIR)/%.h - $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ - -$(OBJDIR)/%.o : $(SRCDIR)/sound/%.c $(SRCDIR)/sound/%.h - $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ - -$(OBJDIR)/%.o : $(SRCDIR)/input_hw/%.c $(SRCDIR)/input_hw/%.h - $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ - -$(OBJDIR)/%.o : $(SRCDIR)/cart_hw/%.c $(SRCDIR)/cart_hw/%.h - $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ - -$(OBJDIR)/%.o : $(SRCDIR)/cart_hw/svp/%.c - $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ - -$(OBJDIR)/%.o : $(SRCDIR)/cart_hw/svp/%.c $(SRCDIR)/cart_hw/svp/%.h - $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ - -$(OBJDIR)/%.o : $(SRCDIR)/cd_hw/%.c $(SRCDIR)/cd_hw/%.h - $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ - -$(OBJDIR)/%.o : $(SRCDIR)/z80/%.c $(SRCDIR)/z80/%.h - $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ - -$(OBJDIR)/%.o : $(SRCDIR)/m68k/%.c - $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ - -$(OBJDIR)/%.o : $(SRCDIR)/ntsc/%.c $(SRCDIR)/ntsc/%.h - $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ - -$(OBJDIR)/%.o : $(SRCDIR)/tremor/%.c $(SRCDIR)/tremor/%.h - $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ - -$(OBJDIR)/%.o : $(SRCDIR)/tremor/%.c - $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ - -$(OBJDIR)/%.o : $(SRCDIR)/../sdl/%.c $(SRCDIR)/../sdl/%.h - $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ - -$(OBJDIR)/icon.o : - windres $(SRCDIR)/../sdl/icon.rc $@ - -pack : - strip $(NAME) - upx -9 $(NAME) - -clean: - rm -f $(OBJECTS) $(NAME) diff --git a/genplus-gx/sdl/README.txt b/genplus-gx/sdl/README.txt deleted file mode 100644 index 500adecab7..0000000000 --- a/genplus-gx/sdl/README.txt +++ /dev/null @@ -1,146 +0,0 @@ - -DISCLAIMER: - -THIS IS A VERY BASIC & UNSTABLE PORT WHICH ONLY PURPOSE -IS TO SHOW HOW TO USE GENESIS PLUS GX CORE & INTERFACE IT -WITH SDL IN PARTICULAR. BUILDS ARE NOT MEANT TO BE REALLY -USED FOR ANYTHING ELSE BUT EASIER CORE DEBUGGING ON WINDOWS. -PLEASE DO NOT DISTRIBUTE WIN32 BINARIES WITHOUT THIS NOTICE. -END USERS SHOULD PREFERABLY USE LIBRETRO PORT WITH RETROARCH. - ----------------------------------------------------------------------------- - Genesis Plus (Windows Port) ----------------------------------------------------------------------------- - - based on the original version 1.3 - by Charles Mac Donald - WWW: http://cgfm2.emuviews.com - - version 1.7.4 - backported from Genesis Plus GX - by Eke-Eke - WWW: http://code.google.com/p/genplus-gx - E-mail: ekeeke31@gmail.com - - - What's New - ---------- - - see CHANGELOG.txt - - - Features - --------- - - * accurate emulation of SG-1000, Mark-III, Master System (I & II), Game Gear, Genesis / Mega Drive, Sega / Mega CD hardware models (incl. backwards compatibility modes) - * NTSC (60Hz) & PAL (50Hz) video hardware emulation - * accurate CDD, CDC & GFX chip emulation (Sega/Mega CD) - * CD-DA fader emulation (Sega/Mega CD) - * Mode 1 cartridge support (Sega/Mega CD) - * highly accurate 68000 & Z80 CPU emulation - * highly accurate VDP emulation (all rendering modes, mid-line changes, undocumented registers,…) & timings (HBLANK, DMA, FIFO, HV interrupts,…) - * sample-accurate YM2612,YM2413, PSG, & PCM emulation (all sound chips are running at the original frequency) - * cycle-accurate chip synchronization (68000’s/Z80/YM2612/PSG/PCM) - * high-quality audio resampling using Blip Buffer - * basic hardware latency emulation (VDP/68k, Z80/68k) - * full overscan area emulation (horizontal & vertical color borders) - * optional Game Gear extended screen mode - * internal BOOT ROM support (Master System, Genesis / Mega Drive, Sega / Mega CD) - * optional TMSS hardware emulation (Genesis / Mega Drive) - * support for Blargg's software NTSC filters - * preliminary PICO emulation - * support for raw (.bin, .gen, .md, .sms, .gg & .sg) and interleaved (.smd & .mdx) ROM files - * support for CUE+BIN, ISO+OGG & ISO+WAV CD image files - * 2-buttons, 3-buttons & 6-buttons controllers emulation - * Sega Team Player & EA 4-Way Play multitaps emulation - * Sega Mouse emulation - * Sega Paddle Control & Sports Pad analog emulation - * Terebi Oekaki tablet emulation - * Sega Light Phaser, Menacer & Justifiers lightgun emulation - * Sega Activator & XE-1AP analog controller emulation - * SVP DSP (Virtua Racing) emulation - * J-Cart adapter (Micro Machines & Pete Sampras series, Super Skidmarks) emulation - * Backup RAM (max. 64KB), I2C (24Cxx), SPI (95xxx) & MicroWire (93C46) EEPROMs emulation - * Sega/Mega CD RAM cart (max. 512KB) emulation - * “official” ROM bankswitch hardware (Super Street Fighter 2) emulation - * “official” backup RAM bankswitch hardware (Phantasy Star 4, Legend of Thor, Sonic the Hedgehog 3) emulation - * support for all known unlicensed/pirate cartridges bankswitch & copy protection hardware - * emulation of all known Master System & Game Gear cartridge “mappers” (incl. unlicensed Korean ones) - * Game Genie & Action Replay hardware emulation - * Sonic & Knuckles “Lock-On” hardware emulation - * support for ROM image up to 10MB (Ultimate MK3 hack) - - - Usage - ----- - - The Windows version runs windowed in a 16-bit desktop with 48Hz sound using SDL but - without joystick support. - - - Controls - ----- - - Arrow Keys - Directional pad - A/Q,S,D,F - buttons A, B(1), C(2), START - W,X,C,V - buttons X, Y, Z, MODE if 6-buttons controller is enabled - Tab - Hard Reset - Esc - Exit program - - F2 - Toggle Fullscreen/Windowed mode - F4 - Toggle Audio (Turbo mode must be disabled first) - F6 - Toggle Turbo mode (Audio must be disabled first) - F7 - Load Savestate (game.gpz) - F8 - Save Savestate (game.gpz) - F9 - Toggle VDP mode: PAL(50hz)/NTSC(60hz) - F10 - Soft Reset - F11 - Toggle Border emulation - F12 - Toggle Player # (test only) - - - The mouse is used for lightguns, Sega Mouse, PICO & Terebi Oekaki tablet (automatically detected when loading supported game). - - A SRAM file (game.srm) is automatically saved on exit and loaded on startup. - - - Credits - -------- - - Core(s) improvements & additional features by Eke-Eke - - Original code by Charles MacDonald - - Original Z80 core by Juergen Buchmueller - - Original Musashi 68k core by Karl Stenerud - - Original YM2612/YM2413 cores by Jarek Burczynski & Tatsuyuki Satoh - - Original SN76489 core by Maxim - - Original SVP core by Notaz - - Blip Buffer & NTSC Video filter libraries by Shay Green (Blargg) - - 3-Band EQ implementation by Neil C - - TREMOR VORBIS decoding library by Xiph.org - - Zlib by Jean-Loup Gailly & Mark Adler - - - Aknowledgements - ---------------- - - The following emulator authors: Bart Trzynadlowski, Steve Snake, Stef, Notaz, AamirM - - The regular people at spritesmind.net and smspower.org. - - The MAME team for the CPU and sound chip emulators. - - Nemesis for the researches on the YM2612 and VDP. - - Tasco Deluxe for the documentation of Realtec mapper. - - Haze for the reverse-engineering of many unlicensed games protection. - diff --git a/genplus-gx/sdl/config.c b/genplus-gx/sdl/config.c deleted file mode 100644 index 408cac5423..0000000000 --- a/genplus-gx/sdl/config.c +++ /dev/null @@ -1,52 +0,0 @@ - -#include "osd.h" - -t_config config; - - -void set_config_defaults(void) -{ - int i; - - /* sound options */ - config.psg_preamp = 150; - config.fm_preamp = 100; - config.hq_fm = 1; - config.psgBoostNoise = 1; - config.filter = 1; - config.low_freq = 200; - config.high_freq = 8000; - config.lg = 1.0; - config.mg = 1.0; - config.hg = 1.0; - config.lp_range = 0x9999; /* 0.6 in 16.16 fixed point */ - config.dac_bits = 14; - config.ym2413 = 2; /* = AUTO (0 = always OFF, 1 = always ON) */ - config.mono = 0; - - /* system options */ - config.system = 0; /* = AUTO (or SYSTEM_SG, SYSTEM_MARKIII, SYSTEM_SMS, SYSTEM_SMS2, SYSTEM_GG, SYSTEM_MD) */ - config.region_detect = 0; /* = AUTO (1 = USA, 2 = EUROPE, 3 = JAPAN/NTSC, 4 = JAPAN/PAL) */ - config.vdp_mode = 0; /* = AUTO (1 = NTSC, 2 = PAL) */ - config.master_clock = 0; /* = AUTO (1 = NTSC, 2 = PAL) */ - config.force_dtack = 0; - config.addr_error = 1; - config.bios = 0; - config.lock_on = 0; /* = OFF (can be TYPE_SK, TYPE_GG & TYPE_AR) */ - - /* display options */ - config.overscan = 0; /* 3 = all borders (0 = no borders , 1 = vertical borders only, 2 = horizontal borders only) */ - config.gg_extra = 0; /* 1 = show extended Game Gear screen (256x192) */ - config.render = 0; /* 1 = double resolution output (only when interlaced mode 2 is enabled) */ - - /* controllers options */ - input.system[0] = SYSTEM_MD_GAMEPAD; - input.system[1] = SYSTEM_MD_GAMEPAD; - config.gun_cursor[0] = 1; - config.gun_cursor[1] = 1; - config.invert_mouse = 0; - for (i=0;i - -static int check_zip(char *filename); - -int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension) -{ - int size = 0; - - if(check_zip(filename)) - { - unz_file_info info; - int ret = 0; - char fname[256]; - - /* Attempt to open the archive */ - unzFile *fd = unzOpen(filename); - if (!fd) return 0; - - /* Go to first file in archive */ - ret = unzGoToFirstFile(fd); - if(ret != UNZ_OK) - { - unzClose(fd); - return 0; - } - - /* Get file informations and update filename */ - ret = unzGetCurrentFileInfo(fd, &info, fname, 256, NULL, 0, NULL, 0); - if(ret != UNZ_OK) - { - unzClose(fd); - return 0; - } - - /* Compressed filename extension */ - if (extension) - { - strncpy(extension, &fname[strlen(fname) - 3], 3); - extension[3] = 0; - } - - /* Open the file for reading */ - ret = unzOpenCurrentFile(fd); - if(ret != UNZ_OK) - { - unzClose(fd); - return 0; - } - - /* Retrieve uncompressed file size */ - size = info.uncompressed_size; - if(size > maxsize) - { - size = maxsize; - } - - /* Read (decompress) the file */ - ret = unzReadCurrentFile(fd, buffer, size); - if(ret != size) - { - unzCloseCurrentFile(fd); - unzClose(fd); - return 0; - } - - /* Close the current file */ - ret = unzCloseCurrentFile(fd); - if(ret != UNZ_OK) - { - unzClose(fd); - return 0; - } - - /* Close the archive */ - ret = unzClose(fd); - if(ret != UNZ_OK) return 0; - } - else - { - /* Open file */ - gzFile *gd = gzopen(filename, "rb"); - if (!gd) return 0; - - /* Read file data */ - size = gzread(gd, buffer, maxsize); - - /* filename extension */ - if (extension) - { - strncpy(extension, &filename[strlen(filename) - 3], 3); - extension[3] = 0; - } - - /* Close file */ - gzclose(gd); - } - - /* Return loaded ROM size */ - return size; -} - -/* - Verifies if a file is a ZIP archive or not. - Returns: 1= ZIP archive, 0= not a ZIP archive -*/ -static int check_zip(char *filename) -{ - uint8 buf[2]; - FILE *fd = fopen(filename, "rb"); - if(!fd) return (0); - fread(buf, 2, 1, fd); - fclose(fd); - if(memcmp(buf, "PK", 2) == 0) return (1); - return (0); -} diff --git a/genplus-gx/sdl/fileio.h b/genplus-gx/sdl/fileio.h deleted file mode 100644 index 30db2e0ec4..0000000000 --- a/genplus-gx/sdl/fileio.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * fileio.c - * - * Load a normal file, or ZIP/GZ archive. - * Returns loaded ROM size (zero if an error occured) - * - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Charles Mac Donald - * modified by Eke-Eke (Genesis Plus GX) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ - -#ifndef _FILEIO_H_ -#define _FILEIO_H_ - -/* Function prototypes */ -extern int load_archive(char *filename, unsigned char *buffer, int maxsize, char *extension); - -#endif /* _FILEIO_H_ */ diff --git a/genplus-gx/sdl/icon.rc b/genplus-gx/sdl/icon.rc deleted file mode 100644 index 0b47594d50..0000000000 --- a/genplus-gx/sdl/icon.rc +++ /dev/null @@ -1 +0,0 @@ -MAINICON ICON "md.ico" diff --git a/genplus-gx/sdl/main.c b/genplus-gx/sdl/main.c deleted file mode 100644 index 1b867e1cab..0000000000 --- a/genplus-gx/sdl/main.c +++ /dev/null @@ -1,934 +0,0 @@ -#ifdef __WIN32__ -#include -#else -#define MessageBox(owner, text, caption, type) printf("%s: %s\n", caption, text) -#endif - -#include "SDL.h" -#include "SDL_thread.h" - -#include "shared.h" -#include "sms_ntsc.h" -#include "md_ntsc.h" - -#define SOUND_FREQUENCY 48000 -#define SOUND_SAMPLES_SIZE 2048 - -#define VIDEO_WIDTH 320 -#define VIDEO_HEIGHT 240 - -int joynum = 0; - -int log_error = 0; -int debug_on = 0; -int turbo_mode = 0; -int use_sound = 1; -int fullscreen = 0; /* SDL_FULLSCREEN */ - -/* sound */ - -struct { - char* current_pos; - char* buffer; - int current_emulated_samples; -} sdl_sound; - - -static uint8 brm_format[0x40] = -{ - 0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x5f,0x00,0x00,0x00,0x00,0x40, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x53,0x45,0x47,0x41,0x5f,0x43,0x44,0x5f,0x52,0x4f,0x4d,0x00,0x01,0x00,0x00,0x00, - 0x52,0x41,0x4d,0x5f,0x43,0x41,0x52,0x54,0x52,0x49,0x44,0x47,0x45,0x5f,0x5f,0x5f -}; - - -static short soundframe[SOUND_SAMPLES_SIZE]; - -static void sdl_sound_callback(void *userdata, Uint8 *stream, int len) -{ - if(sdl_sound.current_emulated_samples < len) { - memset(stream, 0, len); - } - else { - memcpy(stream, sdl_sound.buffer, len); - /* loop to compensate desync */ - do { - sdl_sound.current_emulated_samples -= len; - } while(sdl_sound.current_emulated_samples > 2 * len); - memcpy(sdl_sound.buffer, - sdl_sound.current_pos - sdl_sound.current_emulated_samples, - sdl_sound.current_emulated_samples); - sdl_sound.current_pos = sdl_sound.buffer + sdl_sound.current_emulated_samples; - } -} - -static int sdl_sound_init() -{ - int n; - SDL_AudioSpec as_desired, as_obtained; - - if(SDL_Init(SDL_INIT_AUDIO) < 0) { - MessageBox(NULL, "SDL Audio initialization failed", "Error", 0); - return 0; - } - - as_desired.freq = SOUND_FREQUENCY; - as_desired.format = AUDIO_S16LSB; - as_desired.channels = 2; - as_desired.samples = SOUND_SAMPLES_SIZE; - as_desired.callback = sdl_sound_callback; - - if(SDL_OpenAudio(&as_desired, &as_obtained) == -1) { - MessageBox(NULL, "SDL Audio open failed", "Error", 0); - return 0; - } - - if(as_desired.samples != as_obtained.samples) { - MessageBox(NULL, "SDL Audio wrong setup", "Error", 0); - return 0; - } - - sdl_sound.current_emulated_samples = 0; - n = SOUND_SAMPLES_SIZE * 2 * sizeof(short) * 20; - sdl_sound.buffer = (char*)malloc(n); - if(!sdl_sound.buffer) { - MessageBox(NULL, "Can't allocate audio buffer", "Error", 0); - return 0; - } - memset(sdl_sound.buffer, 0, n); - sdl_sound.current_pos = sdl_sound.buffer; - return 1; -} - -static void sdl_sound_update(enabled) -{ - int size = audio_update(soundframe) * 2; - - if (enabled) - { - int i; - short *out; - - SDL_LockAudio(); - out = (short*)sdl_sound.current_pos; - for(i = 0; i < size; i++) - { - *out++ = soundframe[i]; - } - sdl_sound.current_pos = (char*)out; - sdl_sound.current_emulated_samples += size * sizeof(short); - SDL_UnlockAudio(); - } -} - -static void sdl_sound_close() -{ - SDL_PauseAudio(1); - SDL_CloseAudio(); - if (sdl_sound.buffer) - free(sdl_sound.buffer); -} - -/* video */ -md_ntsc_t *md_ntsc; -sms_ntsc_t *sms_ntsc; - -struct { - SDL_Surface* surf_screen; - SDL_Surface* surf_bitmap; - SDL_Rect srect; - SDL_Rect drect; - Uint32 frames_rendered; -} sdl_video; - -static int sdl_video_init() -{ - if(SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) { - MessageBox(NULL, "SDL Video initialization failed", "Error", 0); - return 0; - } - sdl_video.surf_screen = SDL_SetVideoMode(VIDEO_WIDTH, VIDEO_HEIGHT, 16, SDL_SWSURFACE | fullscreen); - sdl_video.surf_bitmap = SDL_CreateRGBSurface(SDL_SWSURFACE, 720, 576, 16, 0, 0, 0, 0); - sdl_video.frames_rendered = 0; - SDL_ShowCursor(0); - return 1; -} - -static void sdl_video_update() -{ - if (system_hw == SYSTEM_MCD) - { - system_frame_scd(0); - } - else if ((system_hw & SYSTEM_PBC) == SYSTEM_MD) - { - system_frame_gen(0); - } - else - { - system_frame_sms(0); - } - - /* viewport size changed */ - if(bitmap.viewport.changed & 1) - { - bitmap.viewport.changed &= ~1; - - /* source bitmap */ - sdl_video.srect.w = bitmap.viewport.w+2*bitmap.viewport.x; - sdl_video.srect.h = bitmap.viewport.h+2*bitmap.viewport.y; - sdl_video.srect.x = 0; - sdl_video.srect.y = 0; - if (sdl_video.srect.w > VIDEO_WIDTH) - { - sdl_video.srect.x = (sdl_video.srect.w - VIDEO_WIDTH) / 2; - sdl_video.srect.w = VIDEO_WIDTH; - } - if (sdl_video.srect.h > VIDEO_HEIGHT) - { - sdl_video.srect.y = (sdl_video.srect.h - VIDEO_HEIGHT) / 2; - sdl_video.srect.h = VIDEO_HEIGHT; - } - - /* destination bitmap */ - sdl_video.drect.w = sdl_video.srect.w; - sdl_video.drect.h = sdl_video.srect.h; - sdl_video.drect.x = (VIDEO_WIDTH - sdl_video.drect.w) / 2; - sdl_video.drect.y = (VIDEO_HEIGHT - sdl_video.drect.h) / 2; - - /* clear destination surface */ - SDL_FillRect(sdl_video.surf_screen, 0, 0); - -#if 0 - if (config.render && (interlaced || config.ntsc)) rect.h *= 2; - if (config.ntsc) rect.w = (reg[12]&1) ? MD_NTSC_OUT_WIDTH(rect.w) : SMS_NTSC_OUT_WIDTH(rect.w); - if (config.ntsc) - { - sms_ntsc = (sms_ntsc_t *)malloc(sizeof(sms_ntsc_t)); - md_ntsc = (md_ntsc_t *)malloc(sizeof(md_ntsc_t)); - - switch (config.ntsc) - { - case 1: - sms_ntsc_init(sms_ntsc, &sms_ntsc_composite); - md_ntsc_init(md_ntsc, &md_ntsc_composite); - break; - case 2: - sms_ntsc_init(sms_ntsc, &sms_ntsc_svideo); - md_ntsc_init(md_ntsc, &md_ntsc_svideo); - break; - case 3: - sms_ntsc_init(sms_ntsc, &sms_ntsc_rgb); - md_ntsc_init(md_ntsc, &md_ntsc_rgb); - break; - } - } - else - { - if (sms_ntsc) - { - free(sms_ntsc); - sms_ntsc = NULL; - } - - if (md_ntsc) - { - free(md_ntsc); - md_ntsc = NULL; - } - } -#endif - } - - SDL_BlitSurface(sdl_video.surf_bitmap, &sdl_video.srect, sdl_video.surf_screen, &sdl_video.drect); - SDL_UpdateRect(sdl_video.surf_screen, 0, 0, 0, 0); - - ++sdl_video.frames_rendered; -} - -static void sdl_video_close() -{ - if (sdl_video.surf_bitmap) - SDL_FreeSurface(sdl_video.surf_bitmap); - if (sdl_video.surf_screen) - SDL_FreeSurface(sdl_video.surf_screen); -} - -/* Timer Sync */ - -struct { - SDL_sem* sem_sync; - unsigned ticks; -} sdl_sync; - -static Uint32 sdl_sync_timer_callback(Uint32 interval) -{ - SDL_SemPost(sdl_sync.sem_sync); - sdl_sync.ticks++; - if (sdl_sync.ticks == (vdp_pal ? 50 : 20)) - { - SDL_Event event; - SDL_UserEvent userevent; - - userevent.type = SDL_USEREVENT; - userevent.code = vdp_pal ? (sdl_video.frames_rendered / 3) : sdl_video.frames_rendered; - userevent.data1 = NULL; - userevent.data2 = NULL; - sdl_sync.ticks = sdl_video.frames_rendered = 0; - - event.type = SDL_USEREVENT; - event.user = userevent; - - SDL_PushEvent(&event); - } - return interval; -} - -static int sdl_sync_init() -{ - if(SDL_InitSubSystem(SDL_INIT_TIMER|SDL_INIT_EVENTTHREAD) < 0) - { - MessageBox(NULL, "SDL Timer initialization failed", "Error", 0); - return 0; - } - - sdl_sync.sem_sync = SDL_CreateSemaphore(0); - sdl_sync.ticks = 0; - return 1; -} - -static void sdl_sync_close() -{ - if(sdl_sync.sem_sync) - SDL_DestroySemaphore(sdl_sync.sem_sync); -} - -static const uint16 vc_table[4][2] = -{ - /* NTSC, PAL */ - {0xDA , 0xF2}, /* Mode 4 (192 lines) */ - {0xEA , 0x102}, /* Mode 5 (224 lines) */ - {0xDA , 0xF2}, /* Mode 4 (192 lines) */ - {0x106, 0x10A} /* Mode 5 (240 lines) */ -}; - -static int sdl_control_update(SDLKey keystate) -{ - switch (keystate) - { - case SDLK_TAB: - { - system_reset(); - break; - } - - case SDLK_F1: - { - if (SDL_ShowCursor(-1)) SDL_ShowCursor(0); - else SDL_ShowCursor(1); - break; - } - - case SDLK_F2: - { - if (fullscreen) fullscreen = 0; - else fullscreen = SDL_FULLSCREEN; - sdl_video.surf_screen = SDL_SetVideoMode(VIDEO_WIDTH, VIDEO_HEIGHT, 16, SDL_SWSURFACE | fullscreen); - break; - } - - case SDLK_F3: - { - if (config.bios == 0) config.bios = 3; - else if (config.bios == 3) config.bios = 1; - break; - } - - case SDLK_F4: - { - if (!turbo_mode) use_sound ^= 1; - break; - } - - case SDLK_F5: - { - log_error ^= 1; - break; - } - - case SDLK_F6: - { - if (!use_sound) - { - turbo_mode ^=1; - sdl_sync.ticks = 0; - } - break; - } - - case SDLK_F7: - { - FILE *f = fopen("game.gp0","rb"); - if (f) - { - uint8 buf[STATE_SIZE]; - fread(&buf, STATE_SIZE, 1, f); - state_load(buf); - fclose(f); - } - break; - } - - case SDLK_F8: - { - FILE *f = fopen("game.gp0","wb"); - if (f) - { - uint8 buf[STATE_SIZE]; - int len = state_save(buf); - fwrite(&buf, len, 1, f); - fclose(f); - } - break; - } - - case SDLK_F9: - { - config.region_detect = (config.region_detect + 1) % 5; - get_region(0); - - /* framerate has changed, reinitialize audio timings */ - audio_init(snd.sample_rate, 0); - - /* system with region BIOS should be reinitialized */ - if ((system_hw == SYSTEM_MCD) || ((system_hw & SYSTEM_SMS) && (config.bios & 1))) - { - system_init(); - system_reset(); - } - else - { - /* reinitialize I/O region register */ - if (system_hw == SYSTEM_MD) - { - io_reg[0x00] = 0x20 | region_code | (config.bios & 1); - } - else - { - io_reg[0x00] = 0x80 | (region_code >> 1); - } - - /* reinitialize VDP */ - if (vdp_pal) - { - status |= 1; - lines_per_frame = 313; - } - else - { - status &= ~1; - lines_per_frame = 262; - } - - /* reinitialize VC max value */ - switch (bitmap.viewport.h) - { - case 192: - vc_max = vc_table[0][vdp_pal]; - break; - case 224: - vc_max = vc_table[1][vdp_pal]; - break; - case 240: - vc_max = vc_table[3][vdp_pal]; - break; - } - } - break; - } - - case SDLK_F10: - { - gen_reset(0); - break; - } - - case SDLK_F11: - { - config.overscan = (config.overscan + 1) & 3; - if ((system_hw == SYSTEM_GG) && !config.gg_extra) - { - bitmap.viewport.x = (config.overscan & 2) ? 14 : -48; - } - else - { - bitmap.viewport.x = (config.overscan & 2) * 7; - } - bitmap.viewport.changed = 3; - break; - } - - case SDLK_F12: - { - joynum = (joynum + 1) % MAX_DEVICES; - while (input.dev[joynum] == NO_DEVICE) - { - joynum = (joynum + 1) % MAX_DEVICES; - } - break; - } - - case SDLK_ESCAPE: - { - return 0; - } - - default: - break; - } - - return 1; -} - -int sdl_input_update(void) -{ - uint8 *keystate = SDL_GetKeyState(NULL); - - /* reset input */ - input.pad[joynum] = 0; - - switch (input.dev[joynum]) - { - case DEVICE_LIGHTGUN: - { - /* get mouse coordinates (absolute values) */ - int x,y; - int state = SDL_GetMouseState(&x,&y); - - /* X axis */ - input.analog[joynum][0] = x - (VIDEO_WIDTH-bitmap.viewport.w)/2; - - /* Y axis */ - input.analog[joynum][1] = y - (VIDEO_HEIGHT-bitmap.viewport.h)/2; - - /* TRIGGER, B, C (Menacer only), START (Menacer & Justifier only) */ - if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_A; - if(state & SDL_BUTTON_RMASK) input.pad[joynum] |= INPUT_B; - if(state & SDL_BUTTON_MMASK) input.pad[joynum] |= INPUT_C; - if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_START; - break; - } - - case DEVICE_PADDLE: - { - /* get mouse (absolute values) */ - int x; - int state = SDL_GetMouseState(&x, NULL); - - /* Range is [0;256], 128 being middle position */ - input.analog[joynum][0] = x * 256 /VIDEO_WIDTH; - - /* Button I -> 0 0 0 0 0 0 0 I*/ - if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_B; - - break; - } - - case DEVICE_SPORTSPAD: - { - /* get mouse (relative values) */ - int x,y; - int state = SDL_GetRelativeMouseState(&x,&y); - - /* Range is [0;256] */ - input.analog[joynum][0] = (unsigned char)(-x & 0xFF); - input.analog[joynum][1] = (unsigned char)(-y & 0xFF); - - /* Buttons I & II -> 0 0 0 0 0 0 II I*/ - if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_B; - if(state & SDL_BUTTON_RMASK) input.pad[joynum] |= INPUT_C; - - break; - } - - case DEVICE_MOUSE: - { - /* get mouse (relative values) */ - int x,y; - int state = SDL_GetRelativeMouseState(&x,&y); - - /* Sega Mouse range is [-256;+256] */ - input.analog[joynum][0] = x * 2; - input.analog[joynum][1] = y * 2; - - /* Vertical movement is upsidedown */ - if (!config.invert_mouse) - input.analog[joynum][1] = 0 - input.analog[joynum][1]; - - /* Start,Left,Right,Middle buttons -> 0 0 0 0 START MIDDLE RIGHT LEFT */ - if(state & SDL_BUTTON_LMASK) input.pad[joynum] |= INPUT_B; - if(state & SDL_BUTTON_RMASK) input.pad[joynum] |= INPUT_C; - if(state & SDL_BUTTON_MMASK) input.pad[joynum] |= INPUT_A; - if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_START; - - break; - } - - case DEVICE_XE_A1P: - { - /* A,B,C,D,Select,START,E1,E2 buttons -> E1(?) E2(?) START SELECT(?) A B C D */ - if(keystate[SDLK_a]) input.pad[joynum] |= INPUT_START; - if(keystate[SDLK_s]) input.pad[joynum] |= INPUT_A; - if(keystate[SDLK_d]) input.pad[joynum] |= INPUT_C; - if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_Y; - if(keystate[SDLK_z]) input.pad[joynum] |= INPUT_B; - if(keystate[SDLK_x]) input.pad[joynum] |= INPUT_X; - if(keystate[SDLK_c]) input.pad[joynum] |= INPUT_MODE; - if(keystate[SDLK_v]) input.pad[joynum] |= INPUT_Z; - - /* Left Analog Stick (bidirectional) */ - if(keystate[SDLK_UP]) input.analog[joynum][1]-=2; - else if(keystate[SDLK_DOWN]) input.analog[joynum][1]+=2; - else input.analog[joynum][1] = 128; - if(keystate[SDLK_LEFT]) input.analog[joynum][0]-=2; - else if(keystate[SDLK_RIGHT]) input.analog[joynum][0]+=2; - else input.analog[joynum][0] = 128; - - /* Right Analog Stick (unidirectional) */ - if(keystate[SDLK_KP8]) input.analog[joynum+1][0]-=2; - else if(keystate[SDLK_KP2]) input.analog[joynum+1][0]+=2; - else if(keystate[SDLK_KP4]) input.analog[joynum+1][0]-=2; - else if(keystate[SDLK_KP6]) input.analog[joynum+1][0]+=2; - else input.analog[joynum+1][0] = 128; - - /* Limiters */ - if (input.analog[joynum][0] > 0xFF) input.analog[joynum][0] = 0xFF; - else if (input.analog[joynum][0] < 0) input.analog[joynum][0] = 0; - if (input.analog[joynum][1] > 0xFF) input.analog[joynum][1] = 0xFF; - else if (input.analog[joynum][1] < 0) input.analog[joynum][1] = 0; - if (input.analog[joynum+1][0] > 0xFF) input.analog[joynum+1][0] = 0xFF; - else if (input.analog[joynum+1][0] < 0) input.analog[joynum+1][0] = 0; - if (input.analog[joynum+1][1] > 0xFF) input.analog[joynum+1][1] = 0xFF; - else if (input.analog[joynum+1][1] < 0) input.analog[joynum+1][1] = 0; - - break; - } - - case DEVICE_PICO: - { - /* get mouse (absolute values) */ - int x,y; - int state = SDL_GetMouseState(&x,&y); - - /* Calculate X Y axis values */ - input.analog[0][0] = 0x3c + (x * (0x17c-0x03c+1)) / VIDEO_WIDTH; - input.analog[0][1] = 0x1fc + (y * (0x2f7-0x1fc+1)) / VIDEO_HEIGHT; - - /* Map mouse buttons to player #1 inputs */ - if(state & SDL_BUTTON_MMASK) pico_current = (pico_current + 1) & 7; - if(state & SDL_BUTTON_RMASK) input.pad[0] |= INPUT_PICO_RED; - if(state & SDL_BUTTON_LMASK) input.pad[0] |= INPUT_PICO_PEN; - - break; - } - - case DEVICE_TEREBI: - { - /* get mouse (absolute values) */ - int x,y; - int state = SDL_GetMouseState(&x,&y); - - /* Calculate X Y axis values */ - input.analog[0][0] = (x * 250) / VIDEO_WIDTH; - input.analog[0][1] = (y * 250) / VIDEO_HEIGHT; - - /* Map mouse buttons to player #1 inputs */ - if(state & SDL_BUTTON_RMASK) input.pad[0] |= INPUT_B; - - break; - } - - case DEVICE_ACTIVATOR: - { - if(keystate[SDLK_g]) input.pad[joynum] |= INPUT_ACTIVATOR_7L; - if(keystate[SDLK_h]) input.pad[joynum] |= INPUT_ACTIVATOR_7U; - if(keystate[SDLK_j]) input.pad[joynum] |= INPUT_ACTIVATOR_8L; - if(keystate[SDLK_k]) input.pad[joynum] |= INPUT_ACTIVATOR_8U; - } - - default: - { - if(keystate[SDLK_a]) input.pad[joynum] |= INPUT_A; - if(keystate[SDLK_s]) input.pad[joynum] |= INPUT_B; - if(keystate[SDLK_d]) input.pad[joynum] |= INPUT_C; - if(keystate[SDLK_f]) input.pad[joynum] |= INPUT_START; - if(keystate[SDLK_z]) input.pad[joynum] |= INPUT_X; - if(keystate[SDLK_x]) input.pad[joynum] |= INPUT_Y; - if(keystate[SDLK_c]) input.pad[joynum] |= INPUT_Z; - if(keystate[SDLK_v]) input.pad[joynum] |= INPUT_MODE; - - if(keystate[SDLK_UP]) input.pad[joynum] |= INPUT_UP; - else - if(keystate[SDLK_DOWN]) input.pad[joynum] |= INPUT_DOWN; - if(keystate[SDLK_LEFT]) input.pad[joynum] |= INPUT_LEFT; - else - if(keystate[SDLK_RIGHT]) input.pad[joynum] |= INPUT_RIGHT; - - break; - } - } - return 1; -} - - -int main (int argc, char **argv) -{ - FILE *fp; - int running = 1; - - /* Print help if no game specified */ - if(argc < 2) - { - char caption[256]; - sprintf(caption, "Genesis Plus GX\\SDL\nusage: %s gamename\n", argv[0]); - MessageBox(NULL, caption, "Information", 0); - exit(1); - } - - /* set default config */ - error_init(); - set_config_defaults(); - - /* mark all BIOS as unloaded */ - system_bios = 0; - - /* Genesis BOOT ROM support (2KB max) */ - memset(boot_rom, 0xFF, 0x800); - fp = fopen(MD_BIOS, "rb"); - if (fp != NULL) - { - int i; - - /* read BOOT ROM */ - fread(boot_rom, 1, 0x800, fp); - fclose(fp); - - /* check BOOT ROM */ - if (!memcmp((char *)(boot_rom + 0x120),"GENESIS OS", 10)) - { - /* mark Genesis BIOS as loaded */ - system_bios = SYSTEM_MD; - } - - /* Byteswap ROM */ - for (i=0; i<0x800; i+=2) - { - uint8 temp = boot_rom[i]; - boot_rom[i] = boot_rom[i+1]; - boot_rom[i+1] = temp; - } - } - - /* initialize SDL */ - if(SDL_Init(0) < 0) - { - char caption[256]; - sprintf(caption, "SDL initialization failed"); - MessageBox(NULL, caption, "Error", 0); - exit(1); - } - sdl_video_init(); - if (use_sound) sdl_sound_init(); - sdl_sync_init(); - - /* initialize Genesis virtual system */ - SDL_LockSurface(sdl_video.surf_bitmap); - memset(&bitmap, 0, sizeof(t_bitmap)); - bitmap.width = 720; - bitmap.height = 576; -#if defined(USE_8BPP_RENDERING) - bitmap.pitch = (bitmap.width * 1); -#elif defined(USE_15BPP_RENDERING) - bitmap.pitch = (bitmap.width * 2); -#elif defined(USE_16BPP_RENDERING) - bitmap.pitch = (bitmap.width * 2); -#elif defined(USE_32BPP_RENDERING) - bitmap.pitch = (bitmap.width * 4); -#endif - bitmap.data = sdl_video.surf_bitmap->pixels; - SDL_UnlockSurface(sdl_video.surf_bitmap); - bitmap.viewport.changed = 3; - - /* Load game file */ - if(!load_rom(argv[1])) - { - char caption[256]; - sprintf(caption, "Error loading file `%s'.", argv[1]); - MessageBox(NULL, caption, "Error", 0); - exit(1); - } - - /* initialize system hardware */ - audio_init(SOUND_FREQUENCY, 0); - system_init(); - - /* Mega CD specific */ - if (system_hw == SYSTEM_MCD) - { - /* load internal backup RAM */ - fp = fopen("./scd.brm", "rb"); - if (fp!=NULL) - { - fread(scd.bram, 0x2000, 1, fp); - fclose(fp); - } - - /* check if internal backup RAM is formatted */ - if (memcmp(scd.bram + 0x2000 - 0x20, brm_format + 0x20, 0x20)) - { - /* clear internal backup RAM */ - memset(scd.bram, 0x00, 0x200); - - /* Internal Backup RAM size fields */ - brm_format[0x10] = brm_format[0x12] = brm_format[0x14] = brm_format[0x16] = 0x00; - brm_format[0x11] = brm_format[0x13] = brm_format[0x15] = brm_format[0x17] = (sizeof(scd.bram) / 64) - 3; - - /* format internal backup RAM */ - memcpy(scd.bram + 0x2000 - 0x40, brm_format, 0x40); - } - - /* load cartridge backup RAM */ - if (scd.cartridge.id) - { - fp = fopen("./cart.brm", "rb"); - if (fp!=NULL) - { - fread(scd.cartridge.area, scd.cartridge.mask + 1, 1, fp); - fclose(fp); - } - - /* check if cartridge backup RAM is formatted */ - if (memcmp(scd.cartridge.area + scd.cartridge.mask + 1 - 0x20, brm_format + 0x20, 0x20)) - { - /* clear cartridge backup RAM */ - memset(scd.cartridge.area, 0x00, scd.cartridge.mask + 1); - - /* Cartridge Backup RAM size fields */ - brm_format[0x10] = brm_format[0x12] = brm_format[0x14] = brm_format[0x16] = (((scd.cartridge.mask + 1) / 64) - 3) >> 8; - brm_format[0x11] = brm_format[0x13] = brm_format[0x15] = brm_format[0x17] = (((scd.cartridge.mask + 1) / 64) - 3) & 0xff; - - /* format cartridge backup RAM */ - memcpy(scd.cartridge.area + scd.cartridge.mask + 1 - sizeof(brm_format), brm_format, sizeof(brm_format)); - } - } - } - - if (sram.on) - { - /* load SRAM */ - fp = fopen("./game.srm", "rb"); - if (fp!=NULL) - { - fread(sram.sram,0x10000,1, fp); - fclose(fp); - } - } - - /* reset system hardware */ - system_reset(); - - if(use_sound) SDL_PauseAudio(0); - - /* 3 frames = 50 ms (60hz) or 60 ms (50hz) */ - if(sdl_sync.sem_sync) - SDL_SetTimer(vdp_pal ? 60 : 50, sdl_sync_timer_callback); - - /* emulation loop */ - while(running) - { - SDL_Event event; - if (SDL_PollEvent(&event)) - { - switch(event.type) - { - case SDL_USEREVENT: - { - char caption[100]; - sprintf(caption,"Genesis Plus GX - %d fps - %s)", event.user.code, (rominfo.international[0] != 0x20) ? rominfo.international : rominfo.domestic); - SDL_WM_SetCaption(caption, NULL); - break; - } - - case SDL_QUIT: - { - running = 0; - break; - } - - case SDL_KEYDOWN: - { - running = sdl_control_update(event.key.keysym.sym); - break; - } - } - } - - sdl_video_update(); - sdl_sound_update(use_sound); - - if(!turbo_mode && sdl_sync.sem_sync && sdl_video.frames_rendered % 3 == 0) - { - SDL_SemWait(sdl_sync.sem_sync); - } - } - - if (system_hw == SYSTEM_MCD) - { - /* save internal backup RAM (if formatted) */ - if (!memcmp(scd.bram + 0x2000 - 0x20, brm_format + 0x20, 0x20)) - { - fp = fopen("./scd.brm", "wb"); - if (fp!=NULL) - { - fwrite(scd.bram, 0x2000, 1, fp); - fclose(fp); - } - } - - /* save cartridge backup RAM (if formatted) */ - if (scd.cartridge.id) - { - if (!memcmp(scd.cartridge.area + scd.cartridge.mask + 1 - 0x20, brm_format + 0x20, 0x20)) - { - fp = fopen("./cart.brm", "wb"); - if (fp!=NULL) - { - fwrite(scd.cartridge.area, scd.cartridge.mask + 1, 1, fp); - fclose(fp); - } - } - } - } - - if (sram.on) - { - /* save SRAM */ - fp = fopen("./game.srm", "wb"); - if (fp!=NULL) - { - fwrite(sram.sram,0x10000,1, fp); - fclose(fp); - } - } - - audio_shutdown(); - error_shutdown(); - - sdl_video_close(); - sdl_sound_close(); - sdl_sync_close(); - SDL_Quit(); - - return 0; -} diff --git a/genplus-gx/sdl/main.h b/genplus-gx/sdl/main.h deleted file mode 100644 index dfa5d8d52e..0000000000 --- a/genplus-gx/sdl/main.h +++ /dev/null @@ -1,11 +0,0 @@ - -#ifndef _MAIN_H_ -#define _MAIN_H_ - -#define MAX_INPUTS 8 - -extern int debug_on; -extern int log_error; -extern int sdl_input_update(void); - -#endif /* _MAIN_H_ */ diff --git a/genplus-gx/sdl/md.ico b/genplus-gx/sdl/md.ico deleted file mode 100644 index 7cf20f88c4ce7d1b870b7e26a1d77f28df994c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42126 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 Xs1{Hypjtq+fNBBN0;&amOAGuz*3qa0 diff --git a/genplus-gx/sdl/osd.h b/genplus-gx/sdl/osd.h deleted file mode 100644 index ad95a52b00..0000000000 --- a/genplus-gx/sdl/osd.h +++ /dev/null @@ -1,35 +0,0 @@ - -#ifndef _OSD_H_ -#define _OSD_H_ - -#include -#include -#include -#include - -#include -#include - -#include "shared.h" -#include "main.h" -#include "config.h" -#include "error.h" -#include "unzip.h" -#include "fileio.h" - -#define osd_input_update sdl_input_update - -#define GG_ROM "./ggenie.bin" -#define AR_ROM "./areplay.bin" -#define SK_ROM "./sk.bin" -#define SK_UPMEM "./sk2chip.bin" -#define CD_BIOS_US "./bios_CD_U.bin" -#define CD_BIOS_EU "./bios_CD_E.bin" -#define CD_BIOS_JP "./bios_CD_J.bin" -#define MD_BIOS "./bios_MD.bin" -#define MS_BIOS_US "./bios_U.sms" -#define MS_BIOS_EU "./bios_E.sms" -#define MS_BIOS_JP "./bios_J.sms" -#define GG_BIOS "./bios.gg" - -#endif /* _OSD_H_ */ diff --git a/genplus-gx/sdl/readme-sdl.txt b/genplus-gx/sdl/readme-sdl.txt deleted file mode 100644 index 3c8eb6485a..0000000000 --- a/genplus-gx/sdl/readme-sdl.txt +++ /dev/null @@ -1,5 +0,0 @@ -Compile with MinGW. -You will also need to install the SDL library (http://www.libsdl.org/). -Zlib is required for zipped rom support. - -Please distribute required dlls with the executable. \ No newline at end of file diff --git a/genplus-gx/sdl/unzip.c b/genplus-gx/sdl/unzip.c deleted file mode 100644 index ef52bc6269..0000000000 --- a/genplus-gx/sdl/unzip.c +++ /dev/null @@ -1,1294 +0,0 @@ -/* unzip.c -- IO on .zip files using zlib - Version 0.15 beta, Mar 19th, 1998, - - Read unzip.h for more info -*/ - - -#include -#include -#include -#include -#include "unzip.h" - -#ifdef STDC -# include -# include -# include -#endif -#ifdef NO_ERRNO_H - extern int errno; -#else - #include -#endif - - -#ifndef local - #define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - - - -#if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) && \ - !defined(CASESENSITIVITYDEFAULT_NO) -#define CASESENSITIVITYDEFAULT_NO -#endif - - -#ifndef UNZ_BUFSIZE -#define UNZ_BUFSIZE (16384) -#endif - -#ifndef UNZ_MAXFILENAMEINZIP -#define UNZ_MAXFILENAMEINZIP (256) -#endif - -#ifndef ALLOC -# define ALLOC(size) (malloc(size)) -#endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} -#endif - -#define SIZECENTRALDIRITEM (0x2e) -#define SIZEZIPLOCALHEADER (0x1e) - -/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ - -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif - -#ifndef SEEK_END -#define SEEK_END 2 -#endif - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif - -const char unz_copyright[] = - " unzip 0.15 Copyright 1998 Gilles Vollant "; - -/* unz_file_info_interntal contain internal info about a file in zipfile*/ -typedef struct unz_file_info_internal_s -{ - uLong offset_curfile;/* relative offset of local header 4 bytes */ -} unz_file_info_internal; - - -/* file_in_zip_read_info_s contain internal information about a file in zipfile, - when reading and decompress it */ -typedef struct -{ - char *read_buffer; /* internal buffer for compressed data */ - z_stream stream; /* zLib stream structure for inflate */ - - uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ - uLong stream_initialised; /* flag set if stream structure is initialised*/ - - uLong offset_local_extrafield;/* offset of the local extra field */ - uInt size_local_extrafield;/* size of the local extra field */ - uLong pos_local_extrafield; /* position in the local extra field in read*/ - - uLong crc32; /* crc32 of all data uncompressed */ - uLong crc32_wait; /* crc32 we must obtain after decompress all */ - uLong rest_read_compressed; /* number of byte to be decompressed */ - uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ - FILE* file; /* io structore of the zipfile */ - uLong compression_method; /* compression method (0==store) */ - uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ -} file_in_zip_read_info_s; - - -/* unz_s contain internal information about the zipfile -*/ -typedef struct -{ - FILE* file; /* io structore of the zipfile */ - unz_global_info gi; /* public global information */ - uLong byte_before_the_zipfile; /* byte before the zipfile, (>0 for sfx)*/ - uLong num_file; /* number of the current file in the zipfile*/ - uLong pos_in_central_dir; /* pos of the current file in the central dir*/ - uLong current_file_ok; /* flag about the usability of the current file*/ - uLong central_pos; /* position of the beginning of the central dir*/ - - uLong size_central_dir; /* size of the central directory */ - uLong offset_central_dir; /* offset of start of central directory with - respect to the starting disk number */ - - unz_file_info cur_file_info; /* public info about the current file in zip*/ - unz_file_info_internal cur_file_info_internal; /* private info about it*/ - file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current - file if we are decompressing it */ -} unz_s; - - -/* =========================================================================== - Read a byte from a gz_stream; update next_in and avail_in. Return EOF - for end of file. - IN assertion: the stream s has been sucessfully opened for reading. -*/ - - -local int unzlocal_getByte(fin,pi) - FILE *fin; - int *pi; -{ - unsigned char c; - int err = fread(&c, 1, 1, fin); - if (err==1) - { - *pi = (int)c; - return UNZ_OK; - } - else - { - if (ferror(fin)) - return UNZ_ERRNO; - else - return UNZ_EOF; - } -} - - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets -*/ -local int unzlocal_getShort (fin,pX) - FILE* fin; - uLong *pX; -{ - uLong x ; - int i = 0; - int err; - - err = unzlocal_getByte(fin,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unzlocal_getByte(fin,&i); - x += ((uLong)i)<<8; - - if (err==UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int unzlocal_getLong (fin,pX) - FILE* fin; - uLong *pX; -{ - uLong x ; - int i = 0; - int err; - - err = unzlocal_getByte(fin,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unzlocal_getByte(fin,&i); - x += ((uLong)i)<<8; - - if (err==UNZ_OK) - err = unzlocal_getByte(fin,&i); - x += ((uLong)i)<<16; - - if (err==UNZ_OK) - err = unzlocal_getByte(fin,&i); - x += ((uLong)i)<<24; - - if (err==UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - - -/* My own strcmpi / strcasecmp */ -local int strcmpcasenosensitive_internal (fileName1,fileName2) - const char* fileName1; - const char* fileName2; -{ - for (;;) - { - char c1=*(fileName1++); - char c2=*(fileName2++); - if ((c1>='a') && (c1<='z')) - c1 -= 0x20; - if ((c2>='a') && (c2<='z')) - c2 -= 0x20; - if (c1=='\0') - return ((c2=='\0') ? 0 : -1); - if (c2=='\0') - return 1; - if (c1c2) - return 1; - } -} - - -#ifdef CASESENSITIVITYDEFAULT_NO -#define CASESENSITIVITYDEFAULTVALUE 2 -#else -#define CASESENSITIVITYDEFAULTVALUE 1 -#endif - -#ifndef STRCMPCASENOSENTIVEFUNCTION -#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal -#endif - -/* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) - -*/ -extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) - const char* fileName1; - const char* fileName2; - int iCaseSensitivity; -{ - if (iCaseSensitivity==0) - iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; - - if (iCaseSensitivity==1) - return strcmp(fileName1,fileName2); - - return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); -} - -#define BUFREADCOMMENT (0x400) - -/* - Locate the Central directory of a zipfile (at the end, just before - the global comment) -*/ -local uLong unzlocal_SearchCentralDir(fin) - FILE *fin; -{ - unsigned char* buf; - uLong uSizeFile; - uLong uBackRead; - uLong uMaxBack=0xffff; /* maximum size of global comment */ - uLong uPosFound=0; - - if (fseek(fin,0,SEEK_END) != 0) - return 0; - - - uSizeFile = ftell( fin ); - - if (uMaxBack>uSizeFile) - uMaxBack = uSizeFile; - - buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); - if (buf==NULL) - return 0; - - uBackRead = 4; - while (uBackReaduMaxBack) - uBackRead = uMaxBack; - else - uBackRead+=BUFREADCOMMENT; - uReadPos = uSizeFile-uBackRead ; - - uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? - (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); - if (fseek(fin,uReadPos,SEEK_SET)!=0) - break; - - if (fread(buf,(uInt)uReadSize,1,fin)!=1) - break; - - for (i=(int)uReadSize-3; (i--)>0;) - if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && - ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) - { - uPosFound = uReadPos+i; - break; - } - - if (uPosFound!=0) - break; - } - TRYFREE(buf); - return uPosFound; -} - -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows NT computer "c:\\test\\zlib109.zip" or on an Unix computer - "zlib/zlib109.zip". - If the zipfile cannot be opened (file don't exist or in not valid), the - return value is NULL. - Else, the return value is a unzFile Handle, usable with other function - of this unzip package. -*/ -extern unzFile ZEXPORT unzOpen (path) - const char *path; -{ - unz_s us; - unz_s *s; - uLong central_pos,uL; - FILE * fin ; - - uLong number_disk; /* number of the current dist, used for - spaning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used - for spaning ZIP, unsupported, always 0*/ - uLong number_entry_CD; /* total number of entries in - the central dir - (same than number_entry on nospan) */ - - int err=UNZ_OK; - - if (unz_copyright[0]!=' ') - return NULL; - - fin=fopen(path,"rb"); - if (fin==NULL) - return NULL; - - central_pos = unzlocal_SearchCentralDir(fin); - if (central_pos==0) - err=UNZ_ERRNO; - - if (fseek(fin,central_pos,SEEK_SET)!=0) - err=UNZ_ERRNO; - - /* the signature, already checked */ - if (unzlocal_getLong(fin,&uL)!=UNZ_OK) - err=UNZ_ERRNO; - - /* number of this disk */ - if (unzlocal_getShort(fin,&number_disk)!=UNZ_OK) - err=UNZ_ERRNO; - - /* number of the disk with the start of the central directory */ - if (unzlocal_getShort(fin,&number_disk_with_CD)!=UNZ_OK) - err=UNZ_ERRNO; - - /* total number of entries in the central dir on this disk */ - if (unzlocal_getShort(fin,&us.gi.number_entry)!=UNZ_OK) - err=UNZ_ERRNO; - - /* total number of entries in the central dir */ - if (unzlocal_getShort(fin,&number_entry_CD)!=UNZ_OK) - err=UNZ_ERRNO; - - if ((number_entry_CD!=us.gi.number_entry) || - (number_disk_with_CD!=0) || - (number_disk!=0)) - err=UNZ_BADZIPFILE; - - /* size of the central directory */ - if (unzlocal_getLong(fin,&us.size_central_dir)!=UNZ_OK) - err=UNZ_ERRNO; - - /* offset of start of central directory with respect to the - starting disk number */ - if (unzlocal_getLong(fin,&us.offset_central_dir)!=UNZ_OK) - err=UNZ_ERRNO; - - /* zipfile comment length */ - if (unzlocal_getShort(fin,&us.gi.size_comment)!=UNZ_OK) - err=UNZ_ERRNO; - - if ((central_pospfile_in_zip_read!=NULL) - unzCloseCurrentFile(file); - - fclose(s->file); - TRYFREE(s); - return UNZ_OK; -} - - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) - unzFile file; - unz_global_info *pglobal_info; -{ - unz_s* s; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - *pglobal_info=s->gi; - return UNZ_OK; -} - - -/* - Translate date/time from Dos format to tm_unz (readable more easilty) -*/ -local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) - uLong ulDosDate; - tm_unz* ptm; -{ - uLong uDate; - uDate = (uLong)(ulDosDate>>16); - ptm->tm_mday = (uInt)(uDate&0x1f) ; - ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; - ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; - - ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); - ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; - ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; -} - -/* - Get Info about the current file in the zipfile, with internal only info -*/ -local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, - unz_file_info *pfile_info, - unz_file_info_internal - *pfile_info_internal, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); - -local int unzlocal_GetCurrentFileInfoInternal (file, - pfile_info, - pfile_info_internal, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - unz_file_info_internal *pfile_info_internal; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; -{ - unz_s* s; - unz_file_info file_info; - unz_file_info_internal file_info_internal; - int err=UNZ_OK; - uLong uMagic; - long lSeek=0; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (fseek(s->file,s->pos_in_central_dir+s->byte_before_the_zipfile,SEEK_SET)!=0) - err=UNZ_ERRNO; - - - /* we check the magic */ - if (err==UNZ_OK) - { - if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) - err=UNZ_ERRNO; - else if (uMagic!=0x02014b50) - err=UNZ_BADZIPFILE; - } - - if (unzlocal_getShort(s->file,&file_info.version) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.version_needed) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.flag) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.compression_method) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(s->file,&file_info.dosDate) != UNZ_OK) - err=UNZ_ERRNO; - - unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); - - if (unzlocal_getLong(s->file,&file_info.crc) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(s->file,&file_info.compressed_size) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(s->file,&file_info.uncompressed_size) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.size_filename) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.size_file_extra) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.size_file_comment) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.disk_num_start) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&file_info.internal_fa) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(s->file,&file_info.external_fa) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(s->file,&file_info_internal.offset_curfile) != UNZ_OK) - err=UNZ_ERRNO; - - lSeek+=file_info.size_filename; - if ((err==UNZ_OK) && (szFileName!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_filename0) && (fileNameBufferSize>0)) - if (fread(szFileName,(uInt)uSizeRead,1,s->file)!=1) - err=UNZ_ERRNO; - lSeek -= uSizeRead; - } - - if ((err==UNZ_OK) && (extraField!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_file_extrafile,lSeek,SEEK_CUR)==0) - lSeek=0; - else - err=UNZ_ERRNO; - } - - if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) - if (fread(extraField,(uInt)uSizeRead,1,s->file)!=1) - err=UNZ_ERRNO; - lSeek += file_info.size_file_extra - uSizeRead; - } - else - lSeek+=file_info.size_file_extra; - - if ((err==UNZ_OK) && (szComment!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_file_commentfile,lSeek,SEEK_CUR)==0) - lSeek=0; - else - err=UNZ_ERRNO; - } - - if ((file_info.size_file_comment>0) && (commentBufferSize>0)) - if (fread(szComment,(uInt)uSizeRead,1,s->file)!=1) - err=UNZ_ERRNO; - lSeek+=file_info.size_file_comment - uSizeRead; - } - else - lSeek+=file_info.size_file_comment; - - if ((err==UNZ_OK) && (pfile_info!=NULL)) - *pfile_info=file_info; - - if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) - *pfile_info_internal=file_info_internal; - - return err; -} - - - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. -*/ -extern int ZEXPORT unzGetCurrentFileInfo (file, - pfile_info, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; -{ - return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, - szFileName,fileNameBufferSize, - extraField,extraFieldBufferSize, - szComment,commentBufferSize); -} - -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ -extern int ZEXPORT unzGoToFirstFile (file) - unzFile file; -{ - int err=UNZ_OK; - unz_s* s; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - s->pos_in_central_dir=s->offset_central_dir; - s->num_file=0; - err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} - - -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ -extern int ZEXPORT unzGoToNextFile (file) - unzFile file; -{ - unz_s* s; - int err; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - if (s->num_file+1==s->gi.number_entry) - return UNZ_END_OF_LIST_OF_FILE; - - s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + - s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; - s->num_file++; - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} - - -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzipStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ -extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) - unzFile file; - const char *szFileName; - int iCaseSensitivity; -{ - unz_s* s; - int err; - - uLong num_fileSaved; - uLong pos_in_central_dirSaved; - - if (file==NULL) - return UNZ_PARAMERROR; - - if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) - return UNZ_PARAMERROR; - - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - - num_fileSaved = s->num_file; - pos_in_central_dirSaved = s->pos_in_central_dir; - - err = unzGoToFirstFile(file); - - while (err == UNZ_OK) - { - char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; - unzGetCurrentFileInfo(file,NULL, - szCurrentFileName,sizeof(szCurrentFileName)-1, - NULL,0,NULL,0); - if (unzStringFileNameCompare(szCurrentFileName, - szFileName,iCaseSensitivity)==0) - return UNZ_OK; - err = unzGoToNextFile(file); - } - - s->num_file = num_fileSaved ; - s->pos_in_central_dir = pos_in_central_dirSaved ; - return err; -} - - -/* - Read the local header of the current zipfile - Check the coherency of the local header and info in the end of central - directory about this file - store in *piSizeVar the size of extra info in local header - (filename and size of extra field data) -*/ -local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, - poffset_local_extrafield, - psize_local_extrafield) - unz_s* s; - uInt* piSizeVar; - uLong *poffset_local_extrafield; - uInt *psize_local_extrafield; -{ - uLong uMagic,uData,uFlags; - uLong size_filename; - uLong size_extra_field; - int err=UNZ_OK; - - *piSizeVar = 0; - *poffset_local_extrafield = 0; - *psize_local_extrafield = 0; - - if (fseek(s->file,s->cur_file_info_internal.offset_curfile + - s->byte_before_the_zipfile,SEEK_SET)!=0) - return UNZ_ERRNO; - - - if (err==UNZ_OK) - { - if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK) - err=UNZ_ERRNO; - else if (uMagic!=0x04034b50) - err=UNZ_BADZIPFILE; - } - - if (unzlocal_getShort(s->file,&uData) != UNZ_OK) - err=UNZ_ERRNO; -/* - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) - err=UNZ_BADZIPFILE; -*/ - if (unzlocal_getShort(s->file,&uFlags) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(s->file,&uData) != UNZ_OK) - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) - err=UNZ_BADZIPFILE; - - if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && - (s->cur_file_info.compression_method!=Z_DEFLATED)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* date/time */ - err=UNZ_ERRNO; - - if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* crc */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size compr */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(s->file,&uData) != UNZ_OK) /* size uncompr */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - - if (unzlocal_getShort(s->file,&size_filename) != UNZ_OK) - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) - err=UNZ_BADZIPFILE; - - *piSizeVar += (uInt)size_filename; - - if (unzlocal_getShort(s->file,&size_extra_field) != UNZ_OK) - err=UNZ_ERRNO; - *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + - SIZEZIPLOCALHEADER + size_filename; - *psize_local_extrafield = (uInt)size_extra_field; - - *piSizeVar += (uInt)size_extra_field; - - return err; -} - -/* - Open for reading data the current file in the zipfile. - If there is no error and the file is opened, the return value is UNZ_OK. -*/ -extern int ZEXPORT unzOpenCurrentFile (file) - unzFile file; -{ - int err=UNZ_OK; - int Store; - uInt iSizeVar; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uLong offset_local_extrafield; /* offset of the local extra field */ - uInt size_local_extrafield; /* size of the local extra field */ - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_PARAMERROR; - - if (s->pfile_in_zip_read != NULL) - unzCloseCurrentFile(file); - - if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, - &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) - return UNZ_BADZIPFILE; - - pfile_in_zip_read_info = (file_in_zip_read_info_s*) - ALLOC(sizeof(file_in_zip_read_info_s)); - if (pfile_in_zip_read_info==NULL) - return UNZ_INTERNALERROR; - - pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); - pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; - pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; - pfile_in_zip_read_info->pos_local_extrafield=0; - - if (pfile_in_zip_read_info->read_buffer==NULL) - { - TRYFREE(pfile_in_zip_read_info); - return UNZ_INTERNALERROR; - } - - pfile_in_zip_read_info->stream_initialised=0; - - if ((s->cur_file_info.compression_method!=0) && - (s->cur_file_info.compression_method!=Z_DEFLATED)) - err=UNZ_BADZIPFILE; - Store = s->cur_file_info.compression_method==0; - - pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; - pfile_in_zip_read_info->crc32=0; - pfile_in_zip_read_info->compression_method = - s->cur_file_info.compression_method; - pfile_in_zip_read_info->file=s->file; - pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; - - pfile_in_zip_read_info->stream.total_out = 0; - - if (!Store) - { - pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; - pfile_in_zip_read_info->stream.zfree = (free_func)0; - pfile_in_zip_read_info->stream.opaque = (voidpf)0; - - err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); - if (err == Z_OK) - pfile_in_zip_read_info->stream_initialised=1; - /* windowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. - * In unzip, i don't wait absolutely Z_STREAM_END because I known the - * size of both compressed and uncompressed data - */ - } - pfile_in_zip_read_info->rest_read_compressed = - s->cur_file_info.compressed_size ; - pfile_in_zip_read_info->rest_read_uncompressed = - s->cur_file_info.uncompressed_size ; - - pfile_in_zip_read_info->pos_in_zipfile = - s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + - iSizeVar; - - pfile_in_zip_read_info->stream.avail_in = (uInt)0; - - - s->pfile_in_zip_read = pfile_in_zip_read_info; - return UNZ_OK; -} - - -/* - Read bytes from the current file. - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error - (UNZ_ERRNO for IO error, or zLib error for uncompress error) -*/ -extern int ZEXPORT unzReadCurrentFile (file, buf, len) - unzFile file; - voidp buf; - unsigned len; -{ - int err=UNZ_OK; - uInt iRead = 0; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - if ((pfile_in_zip_read_info->read_buffer == NULL)) - return UNZ_END_OF_LIST_OF_FILE; - if (len==0) - return 0; - - pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; - - pfile_in_zip_read_info->stream.avail_out = (uInt)len; - - if (len>pfile_in_zip_read_info->rest_read_uncompressed) - pfile_in_zip_read_info->stream.avail_out = - (uInt)pfile_in_zip_read_info->rest_read_uncompressed; - - while (pfile_in_zip_read_info->stream.avail_out>0) - { - if ((pfile_in_zip_read_info->stream.avail_in==0) && - (pfile_in_zip_read_info->rest_read_compressed>0)) - { - uInt uReadThis = UNZ_BUFSIZE; - if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; - if (uReadThis == 0) - return UNZ_EOF; - if (fseek(pfile_in_zip_read_info->file, - pfile_in_zip_read_info->pos_in_zipfile + - pfile_in_zip_read_info->byte_before_the_zipfile,SEEK_SET)!=0) - return UNZ_ERRNO; - if (fread(pfile_in_zip_read_info->read_buffer,uReadThis,1, - pfile_in_zip_read_info->file)!=1) - return UNZ_ERRNO; - pfile_in_zip_read_info->pos_in_zipfile += uReadThis; - - pfile_in_zip_read_info->rest_read_compressed-=uReadThis; - - pfile_in_zip_read_info->stream.next_in = - (Bytef*)pfile_in_zip_read_info->read_buffer; - pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; - } - - if (pfile_in_zip_read_info->compression_method==0) - { - uInt uDoCopy,i ; - if (pfile_in_zip_read_info->stream.avail_out < - pfile_in_zip_read_info->stream.avail_in) - uDoCopy = pfile_in_zip_read_info->stream.avail_out ; - else - uDoCopy = pfile_in_zip_read_info->stream.avail_in ; - - for (i=0;istream.next_out+i) = - *(pfile_in_zip_read_info->stream.next_in+i); - - pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, - pfile_in_zip_read_info->stream.next_out, - uDoCopy); - pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; - pfile_in_zip_read_info->stream.avail_in -= uDoCopy; - pfile_in_zip_read_info->stream.avail_out -= uDoCopy; - pfile_in_zip_read_info->stream.next_out += uDoCopy; - pfile_in_zip_read_info->stream.next_in += uDoCopy; - pfile_in_zip_read_info->stream.total_out += uDoCopy; - iRead += uDoCopy; - } - else - { - uLong uTotalOutBefore,uTotalOutAfter; - const Bytef *bufBefore; - uLong uOutThis; - int flush=Z_SYNC_FLUSH; - - uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; - bufBefore = pfile_in_zip_read_info->stream.next_out; - - /* - if ((pfile_in_zip_read_info->rest_read_uncompressed == - pfile_in_zip_read_info->stream.avail_out) && - (pfile_in_zip_read_info->rest_read_compressed == 0)) - flush = Z_FINISH; - */ - err=inflate(&pfile_in_zip_read_info->stream,flush); - - uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; - uOutThis = uTotalOutAfter-uTotalOutBefore; - - pfile_in_zip_read_info->crc32 = - crc32(pfile_in_zip_read_info->crc32,bufBefore, - (uInt)(uOutThis)); - - pfile_in_zip_read_info->rest_read_uncompressed -= - uOutThis; - - iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); - - if (err==Z_STREAM_END) - return (iRead==0) ? UNZ_EOF : iRead; - if (err!=Z_OK) - break; - } - } - - if (err==Z_OK) - return iRead; - return err; -} - - -/* - Give the current position in uncompressed data -*/ -extern z_off_t ZEXPORT unztell (file) - unzFile file; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - return (z_off_t)pfile_in_zip_read_info->stream.total_out; -} - - -/* - return 1 if the end of file was reached, 0 elsewhere -*/ -extern int ZEXPORT unzeof (file) - unzFile file; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - if (pfile_in_zip_read_info->rest_read_uncompressed == 0) - return 1; - else - return 0; -} - -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf==NULL, it return the size of the local extra field that can be read - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of bytes copied in buf, or (if <0) - the error code -*/ -extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) - unzFile file; - voidp buf; - unsigned len; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uInt read_now; - uLong size_to_read; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - size_to_read = (pfile_in_zip_read_info->size_local_extrafield - - pfile_in_zip_read_info->pos_local_extrafield); - - if (buf==NULL) - return (int)size_to_read; - - if (len>size_to_read) - read_now = (uInt)size_to_read; - else - read_now = (uInt)len ; - - if (read_now==0) - return 0; - - if (fseek(pfile_in_zip_read_info->file, - pfile_in_zip_read_info->offset_local_extrafield + - pfile_in_zip_read_info->pos_local_extrafield,SEEK_SET)!=0) - return UNZ_ERRNO; - - if (fread(buf,(uInt)size_to_read,1,pfile_in_zip_read_info->file)!=1) - return UNZ_ERRNO; - - return (int)read_now; -} - -/* - Close the file in zip opened with unzipOpenCurrentFile - Return UNZ_CRCERROR if all the file was read but the CRC is not good -*/ -extern int ZEXPORT unzCloseCurrentFile (file) - unzFile file; -{ - int err=UNZ_OK; - - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - - if (pfile_in_zip_read_info->rest_read_uncompressed == 0) - { - if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) - err=UNZ_CRCERROR; - } - - - TRYFREE(pfile_in_zip_read_info->read_buffer); - pfile_in_zip_read_info->read_buffer = NULL; - if (pfile_in_zip_read_info->stream_initialised) - inflateEnd(&pfile_in_zip_read_info->stream); - - pfile_in_zip_read_info->stream_initialised = 0; - TRYFREE(pfile_in_zip_read_info); - - s->pfile_in_zip_read=NULL; - - return err; -} - - -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 -*/ -extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) - unzFile file; - char *szComment; - uLong uSizeBuf; -{ -/* int err=UNZ_OK; */ - unz_s* s; - uLong uReadThis ; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - - uReadThis = uSizeBuf; - if (uReadThis>s->gi.size_comment) - uReadThis = s->gi.size_comment; - - if (fseek(s->file,s->central_pos+22,SEEK_SET)!=0) - return UNZ_ERRNO; - - if (uReadThis>0) - { - *szComment='\0'; - if (fread(szComment,(uInt)uReadThis,1,s->file)!=1) - return UNZ_ERRNO; - } - - if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) - *(szComment+s->gi.size_comment)='\0'; - return (int)uReadThis; -} diff --git a/genplus-gx/sdl/unzip.h b/genplus-gx/sdl/unzip.h deleted file mode 100644 index a30f79cb44..0000000000 --- a/genplus-gx/sdl/unzip.h +++ /dev/null @@ -1,273 +0,0 @@ -/* unzip.h -- IO for uncompress .zip files using zlib - Version 0.15 beta, Mar 19th, 1998, - - Copyright (C) 1998 Gilles Vollant - - This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g - WinZip, InfoZip tools and compatible. - Encryption and multi volume ZipFile (span) are not supported. - Old compressions used by old PKZip 1.x are not supported - - THIS IS AN ALPHA VERSION. AT THIS STAGE OF DEVELOPPEMENT, SOMES API OR STRUCTURE - CAN CHANGE IN FUTURE VERSION !! - I WAIT FEEDBACK at mail info@winimage.com - Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution - - Condition of use and distribution are the same than zlib : - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* for more info about .ZIP format, see - ftp://ftp.cdrom.com/pub/infozip/doc/appnote-970311-iz.zip - PkWare has also a specification at : - ftp://ftp.pkware.com/probdesc.zip */ - -#ifndef _unz_H -#define _unz_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ZLIB_H -#include "zlib.h" -#endif - -#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagunzFile__ { int unused; } unzFile__; -typedef unzFile__ *unzFile; -#else -typedef voidp unzFile; -#endif - - -#define UNZ_OK (0) -#define UNZ_END_OF_LIST_OF_FILE (-100) -#define UNZ_ERRNO (Z_ERRNO) -#define UNZ_EOF (0) -#define UNZ_PARAMERROR (-102) -#define UNZ_BADZIPFILE (-103) -#define UNZ_INTERNALERROR (-104) -#define UNZ_CRCERROR (-105) - -/* tm_unz contain date/time info */ -typedef struct tm_unz_s -{ - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ -} tm_unz; - -/* unz_global_info structure contain global data about the ZIPfile - These data comes from the end of central dir */ -typedef struct unz_global_info_s -{ - uLong number_entry; /* total number of entries in - the central dir on this disk */ - uLong size_comment; /* size of the global comment of the zipfile */ -} unz_global_info; - - -/* unz_file_info contain information about a file in the zipfile */ -typedef struct unz_file_info_s -{ - uLong version; /* version made by 2 bytes */ - uLong version_needed; /* version needed to extract 2 bytes */ - uLong flag; /* general purpose bit flag 2 bytes */ - uLong compression_method; /* compression method 2 bytes */ - uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ - uLong crc; /* crc-32 4 bytes */ - uLong compressed_size; /* compressed size 4 bytes */ - uLong uncompressed_size; /* uncompressed size 4 bytes */ - uLong size_filename; /* filename length 2 bytes */ - uLong size_file_extra; /* extra field length 2 bytes */ - uLong size_file_comment; /* file comment length 2 bytes */ - - uLong disk_num_start; /* disk number start 2 bytes */ - uLong internal_fa; /* internal file attributes 2 bytes */ - uLong external_fa; /* external file attributes 4 bytes */ - - tm_unz tmu_date; -} unz_file_info; - -extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, - const char* fileName2, - int iCaseSensitivity)); -/* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) -*/ - - -extern unzFile ZEXPORT unzOpen OF((const char *path)); -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows NT computer "c:\\zlib\\zlib111.zip" or on an Unix computer - "zlib/zlib111.zip". - If the zipfile cannot be opened (file don't exist or in not valid), the - return value is NULL. - Else, the return value is a unzFile Handle, usable with other function - of this unzip package. -*/ - -extern int ZEXPORT unzClose OF((unzFile file)); -/* - Close a ZipFile opened with unzipOpen. - If there is files inside the .Zip opened with unzOpenCurrentFile (see later), - these files MUST be closed with unzipCloseCurrentFile before call unzipClose. - return UNZ_OK if there is no problem. */ - -extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, - unz_global_info *pglobal_info)); -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. */ - - -extern int ZEXPORT unzGetGlobalComment OF((unzFile file, - char *szComment, - uLong uSizeBuf)); -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 -*/ - - -/***************************************************************************/ -/* Unzip package allow you browse the directory of the zipfile */ - -extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ - -extern int ZEXPORT unzGoToNextFile OF((unzFile file)); -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ - -extern int ZEXPORT unzLocateFile OF((unzFile file, - const char *szFileName, - int iCaseSensitivity)); -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ - - -extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, - unz_file_info *pfile_info, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); -/* - Get Info about the current file - if pfile_info!=NULL, the *pfile_info structure will contain somes info about - the current file - if szFileName!=NULL, the filemane string will be copied in szFileName - (fileNameBufferSize is the size of the buffer) - if extraField!=NULL, the extra field information will be copied in extraField - (extraFieldBufferSize is the size of the buffer). - This is the Central-header version of the extra field - if szComment!=NULL, the comment string of the file will be copied in szComment - (commentBufferSize is the size of the buffer) -*/ - -/***************************************************************************/ -/* for reading the content of the current zipfile, you can open it, read data - from it, and close it (you can close it before reading all the file) - */ - -extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); -/* - Open for reading data the current file in the zipfile. - If there is no error, the return value is UNZ_OK. -*/ - -extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); -/* - Close the file in zip opened with unzOpenCurrentFile - Return UNZ_CRCERROR if all the file was read but the CRC is not good -*/ - -extern int ZEXPORT unzReadCurrentFile OF((unzFile file, - voidp buf, - unsigned len)); -/* - Read bytes from the current file (opened by unzOpenCurrentFile) - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error - (UNZ_ERRNO for IO error, or zLib error for uncompress error) -*/ - -extern z_off_t ZEXPORT unztell OF((unzFile file)); -/* - Give the current position in uncompressed data -*/ - -extern int ZEXPORT unzeof OF((unzFile file)); -/* - return 1 if the end of file was reached, 0 elsewhere -*/ - -extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, - voidp buf, - unsigned len)); -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf==NULL, it return the size of the local extra field - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of bytes copied in buf, or (if <0) - the error code -*/ - -#ifdef __cplusplus -} -#endif - -#endif /* _unz_H */