2012-01-05 21:47:34 +00:00
/* SSNES - A Super Nintendo Entertainment System (SNES) Emulator frontend for libsnes.
2012-01-08 00:08:18 +00:00
* Copyright ( C ) 2010 - 2012 - Hans - Kristian Arntzen
* Copyright ( C ) 2011 - 2012 - Daniel De Matteis
2012-01-05 21:47:34 +00:00
*
* Some code herein may be based on code found in BSNES .
*
* SSNES is free software : you can redistribute it and / or modify it under the terms
* of the GNU General Public License as published by the Free Software Found -
* ation , either version 3 of the License , or ( at your option ) any later version .
*
* SSNES 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 General Public License for more details .
*
* You should have received a copy of the GNU General Public License along with SSNES .
* If not , see < http : //www.gnu.org/licenses/>.
*/
2012-01-10 22:33:44 +00:00
# include <stdint.h>
# include <stdbool.h>
# include <stddef.h>
2012-01-11 00:04:17 +00:00
# include <string.h>
2012-01-10 22:33:44 +00:00
2012-01-05 21:47:34 +00:00
# include <sys/process.h>
2012-01-11 00:04:17 +00:00
# include <cell/sysmodule.h>
2012-01-16 14:45:55 +00:00
# include <sysutil/sysutil_screenshot.h>
2012-01-05 21:47:34 +00:00
# include <sysutil/sysutil_common.h>
# include <sys/spu_initialize.h>
2012-01-11 00:04:17 +00:00
# include <sysutil/sysutil_gamecontent.h>
2012-01-11 21:55:07 +00:00
# include "ps3_input.h"
2012-01-11 22:48:48 +00:00
# include "ps3_video_psgl.h"
2012-01-11 21:55:07 +00:00
2012-01-11 00:04:17 +00:00
# include "../conf/config_file.h"
2012-01-29 13:10:57 +00:00
# include "../conf/config_file_macros.h"
2012-01-11 00:04:17 +00:00
# include "../general.h"
2012-01-12 23:01:52 +00:00
# include "shared.h"
2012-01-11 21:27:07 +00:00
# include "menu.h"
2012-01-11 00:04:17 +00:00
# define MAX_PATH_LENGTH 1024
# define EMULATOR_CONTENT_DIR "SSNE10000"
2012-01-16 03:07:02 +00:00
uint32_t g_emulator_initialized = 0 ;
2012-01-11 00:04:17 +00:00
2012-01-11 01:25:49 +00:00
char special_action_msg [ 256 ] ; /* message which should be overlaid on top of the screen*/
uint32_t special_action_msg_expired ; /* time at which the message no longer needs to be overlaid onscreen*/
2012-01-20 17:00:33 +00:00
uint32_t mode_switch = MODE_MENU ;
bool init_ssnes = false ;
2012-01-20 23:30:01 +00:00
uint64_t ingame_menu_item = 0 ;
2012-01-11 01:25:49 +00:00
2012-01-11 00:04:17 +00:00
char contentInfoPath [ MAX_PATH_LENGTH ] ;
char usrDirPath [ MAX_PATH_LENGTH ] ;
char DEFAULT_PRESET_FILE [ MAX_PATH_LENGTH ] ;
char DEFAULT_BORDER_FILE [ MAX_PATH_LENGTH ] ;
char DEFAULT_MENU_BORDER_FILE [ MAX_PATH_LENGTH ] ;
char GAME_AWARE_SHADER_DIR_PATH [ MAX_PATH_LENGTH ] ;
char PRESETS_DIR_PATH [ MAX_PATH_LENGTH ] ;
char INPUT_PRESETS_DIR_PATH [ MAX_PATH_LENGTH ] ;
char BORDERS_DIR_PATH [ MAX_PATH_LENGTH ] ;
char SHADERS_DIR_PATH [ MAX_PATH_LENGTH ] ;
char DEFAULT_SHADER_FILE [ MAX_PATH_LENGTH ] ;
char DEFAULT_MENU_SHADER_FILE [ MAX_PATH_LENGTH ] ;
char SYS_CONFIG_FILE [ MAX_PATH_LENGTH ] ;
char MULTIMAN_GAME_TO_BOOT [ MAX_PATH_LENGTH ] ;
2012-01-05 21:47:34 +00:00
int ssnes_main ( int argc , char * argv [ ] ) ;
SYS_PROCESS_PARAM ( 1001 , 0x100000 )
# undef main
2012-01-11 00:04:17 +00:00
2012-01-12 23:01:52 +00:00
uint32_t set_text_message_speed ( uint32_t value )
{
return g_frame_count + value ;
}
2012-01-11 01:25:49 +00:00
void set_text_message ( const char * message , uint32_t speed )
{
snprintf ( special_action_msg , sizeof ( special_action_msg ) , message ) ;
2012-01-12 23:01:52 +00:00
special_action_msg_expired = set_text_message_speed ( speed ) ;
2012-01-11 01:25:49 +00:00
}
2012-01-11 00:04:17 +00:00
static bool file_exists ( const char * filename )
{
CellFsStat sb ;
if ( cellFsStat ( filename , & sb ) = = CELL_FS_SUCCEEDED )
return true ;
else
return false ;
}
2012-01-29 13:10:57 +00:00
static void default_settings ( void )
{
g_settings . video . smooth = 1 ;
g_settings . video . second_pass_smooth = 1 ;
2012-01-29 20:35:20 +00:00
strlcpy ( g_settings . video . cg_shader_path , DEFAULT_SHADER_FILE , sizeof ( g_settings . video . cg_shader_path ) ) ;
strlcpy ( g_settings . video . second_pass_shader , DEFAULT_SHADER_FILE , sizeof ( g_settings . video . second_pass_shader ) ) ;
2012-01-29 13:10:57 +00:00
g_settings . video . fbo_scale_x = 2.0f ;
g_settings . video . fbo_scale_y = 2.0f ;
g_settings . video . render_to_texture = 1 ;
g_settings . video . vsync = 1 ;
g_extern . state_slot = 0 ;
g_console . screenshots_enable = 0 ;
2012-01-29 20:35:20 +00:00
strlcpy ( g_settings . cheat_database , usrDirPath , sizeof ( g_settings . cheat_database ) ) ;
2012-01-29 13:10:57 +00:00
g_settings . rewind_enable = false ;
}
static bool init_settings ( void )
2012-01-11 00:04:17 +00:00
{
if ( ! file_exists ( SYS_CONFIG_FILE ) )
{
FILE * f ;
f = fopen ( SYS_CONFIG_FILE , " w " ) ;
fclose ( f ) ;
}
2012-01-29 13:10:57 +00:00
config_file_t * conf = config_file_new ( SYS_CONFIG_FILE ) ;
if ( ! conf )
return 1 ;
CONFIG_GET_BOOL ( video . smooth , " video_smooth " ) ;
CONFIG_GET_BOOL ( video . second_pass_smooth , " video_second_pass_smooth " ) ;
CONFIG_GET_STRING ( video . cg_shader_path , " video_cg_shader " ) ;
CONFIG_GET_STRING ( video . second_pass_shader , " video_second_pass_shader " ) ;
CONFIG_GET_DOUBLE ( video . fbo_scale_x , " video_fbo_scale_x " ) ;
CONFIG_GET_DOUBLE ( video . fbo_scale_y , " video_fbo_scale_y " ) ;
CONFIG_GET_BOOL ( video . render_to_texture , " video_render_to_texture " ) ;
CONFIG_GET_BOOL ( video . vsync , " video_vsync " ) ;
CONFIG_GET_INT_EXTERN ( state_slot , " state_slot " ) ;
CONFIG_GET_INT_CONSOLE ( screenshots_enable , " screenshots_enabled " ) ;
CONFIG_GET_STRING ( cheat_database , " cheat_database_path " ) ;
CONFIG_GET_BOOL ( rewind_enable , " rewind_enable " ) ;
2012-01-29 20:35:20 +00:00
config_file_free ( conf ) ;
2012-01-29 13:10:57 +00:00
return 0 ;
2012-01-11 00:04:17 +00:00
}
static void get_path_settings ( bool multiman_support )
{
unsigned int get_type ;
unsigned int get_attributes ;
CellGameContentSize size ;
char dirName [ CELL_GAME_DIRNAME_SIZE ] ;
memset ( & size , 0x00 , sizeof ( CellGameContentSize ) ) ;
int ret = cellGameBootCheck ( & get_type , & get_attributes , & size , dirName ) ;
if ( ret < 0 )
{
printf ( " cellGameBootCheck() Error: 0x%x \n " , ret ) ;
}
else
{
printf ( " cellGameBootCheck() OK \n " ) ;
printf ( " get_type = [%d] get_attributes = [0x%08x] dirName = [%s] \n " , get_type , get_attributes , dirName ) ;
printf ( " hddFreeSizeKB = [%d] sizeKB = [%d] sysSizeKB = [%d] \n " , size . hddFreeSizeKB , size . sizeKB , size . sysSizeKB ) ;
ret = cellGameContentPermit ( contentInfoPath , usrDirPath ) ;
if ( multiman_support )
{
snprintf ( contentInfoPath , sizeof ( contentInfoPath ) , " /dev_hdd0/game/%s " , EMULATOR_CONTENT_DIR ) ;
snprintf ( usrDirPath , sizeof ( usrDirPath ) , " /dev_hdd0/game/%s/USRDIR " , EMULATOR_CONTENT_DIR ) ;
}
if ( ret < 0 )
{
printf ( " cellGameContentPermit() Error: 0x%x \n " , ret ) ;
}
else
{
printf ( " cellGameContentPermit() OK \n " ) ;
printf ( " contentInfoPath:[%s] \n " , contentInfoPath ) ;
printf ( " usrDirPath:[%s] \n " , usrDirPath ) ;
}
/* now we fill in all the variables */
snprintf ( DEFAULT_PRESET_FILE , sizeof ( DEFAULT_PRESET_FILE ) , " %s/presets/stock.conf " , usrDirPath ) ;
snprintf ( DEFAULT_BORDER_FILE , sizeof ( DEFAULT_BORDER_FILE ) , " %s/borders/Centered-1080p/mega-man-2.png " , usrDirPath ) ;
2012-01-26 00:33:39 +00:00
snprintf ( DEFAULT_MENU_BORDER_FILE , sizeof ( DEFAULT_MENU_BORDER_FILE ) , " %s/borders/Menu/main-menu.jpg " , usrDirPath ) ;
2012-01-11 00:04:17 +00:00
snprintf ( GAME_AWARE_SHADER_DIR_PATH , sizeof ( GAME_AWARE_SHADER_DIR_PATH ) , " %s/gameaware " , usrDirPath ) ;
snprintf ( PRESETS_DIR_PATH , sizeof ( PRESETS_DIR_PATH ) , " %s/presets " , usrDirPath ) ;
snprintf ( INPUT_PRESETS_DIR_PATH , sizeof ( INPUT_PRESETS_DIR_PATH ) , " %s/input-presets " , usrDirPath ) ;
snprintf ( BORDERS_DIR_PATH , sizeof ( BORDERS_DIR_PATH ) , " %s/borders " , usrDirPath ) ;
snprintf ( SHADERS_DIR_PATH , sizeof ( SHADERS_DIR_PATH ) , " %s/shaders " , usrDirPath ) ;
snprintf ( DEFAULT_SHADER_FILE , sizeof ( DEFAULT_SHADER_FILE ) , " %s/shaders/stock.cg " , usrDirPath ) ;
snprintf ( DEFAULT_MENU_SHADER_FILE , sizeof ( DEFAULT_MENU_SHADER_FILE ) , " %s/shaders/Borders/Menu/border-only.cg " , usrDirPath ) ;
2012-01-11 00:17:04 +00:00
snprintf ( SYS_CONFIG_FILE , sizeof ( SYS_CONFIG_FILE ) , " %s/ssnes.cfg " , usrDirPath ) ;
2012-01-11 00:04:17 +00:00
}
}
2012-01-13 00:27:18 +00:00
static void callback_sysutil_exit ( uint64_t status , uint64_t param , void * userdata )
{
( void ) param ;
( void ) userdata ;
switch ( status )
{
case CELL_SYSUTIL_REQUEST_EXITGAME :
menu_is_running = 0 ;
g_quitting = true ;
2012-01-20 23:30:01 +00:00
g_console . in_game_menu = false ;
mode_switch = MODE_EXIT ;
if ( g_emulator_initialized )
ssnes_main_deinit ( ) ;
2012-01-13 00:27:18 +00:00
break ;
}
}
2012-01-20 23:30:01 +00:00
# define ingame_menu_reset_entry_colors(ingame_menu_item) \
{ \
for ( int i = 0 ; i < MENU_ITEM_LAST ; i + + ) \
menuitem_colors [ i ] = GREEN ; \
menuitem_colors [ ingame_menu_item ] = RED ; \
}
static void ingame_menu ( void )
{
uint32_t menuitem_colors [ MENU_ITEM_LAST ] ;
char comment [ 256 ] , msg_temp [ 256 ] ;
2012-01-21 16:50:21 +00:00
ps3_block_swap ( ) ;
2012-01-20 23:30:01 +00:00
do
{
uint64_t state = cell_pad_input_poll_device ( 0 ) ;
static uint64_t old_state = 0 ;
uint64_t stuck_in_loop = 1 ;
const uint64_t button_was_pressed = old_state & ( old_state ^ state ) ;
const uint64_t button_was_held = old_state & state ;
static uint64_t blocking = 0 ;
2012-01-21 02:56:31 +00:00
ssnes_render_cached_frame ( ) ;
2012-01-20 23:30:01 +00:00
if ( g_frame_count < special_action_msg_expired & & blocking )
{
}
else
{
if ( CTRL_CIRCLE ( state ) )
{
ingame_menu_item = 0 ;
g_console . in_game_menu = false ;
mode_switch = MODE_EMULATION ;
}
switch ( ingame_menu_item )
{
case MENU_ITEM_LOAD_STATE :
if ( CTRL_CROSS ( button_was_pressed ) )
{
}
if ( CTRL_LEFT ( button_was_pressed ) | | CTRL_LSTICK_LEFT ( button_was_pressed ) )
{
}
if ( CTRL_RIGHT ( button_was_pressed ) | | CTRL_LSTICK_RIGHT ( button_was_pressed ) )
{
}
ingame_menu_reset_entry_colors ( ingame_menu_item ) ;
strcpy ( comment , " Press LEFT or RIGHT to change the current save state slot. \n Press CROSS to load the state from the currently selected save state slot. " ) ;
break ;
case MENU_ITEM_SAVE_STATE :
if ( CTRL_CROSS ( button_was_pressed ) )
{
}
if ( CTRL_LEFT ( button_was_pressed ) | | CTRL_LSTICK_LEFT ( button_was_pressed ) )
{
}
if ( CTRL_RIGHT ( button_was_pressed ) | | CTRL_LSTICK_RIGHT ( button_was_pressed ) )
{
}
ingame_menu_reset_entry_colors ( ingame_menu_item ) ;
strcpy ( comment , " Press LEFT or RIGHT to change the current save state slot. \n Press CROSS to save the state to the currently selected save state slot. " ) ;
break ;
case MENU_ITEM_KEEP_ASPECT_RATIO :
if ( CTRL_LEFT ( button_was_pressed ) | | CTRL_LSTICK_LEFT ( button_was_pressed ) )
{
}
if ( CTRL_RIGHT ( button_was_pressed ) | | CTRL_LSTICK_RIGHT ( button_was_pressed ) )
{
}
if ( CTRL_START ( button_was_pressed ) )
{
}
ingame_menu_reset_entry_colors ( ingame_menu_item ) ;
strcpy ( comment , " Press LEFT or RIGHT to change the [Aspect Ratio]. \n Press START to reset back to default values. " ) ;
break ;
case MENU_ITEM_OVERSCAN_AMOUNT :
if ( CTRL_LEFT ( button_was_pressed ) | | CTRL_LSTICK_LEFT ( button_was_pressed ) | | CTRL_CROSS ( button_was_pressed ) | | CTRL_LSTICK_LEFT ( button_was_held ) )
{
}
if ( CTRL_RIGHT ( button_was_pressed ) | | CTRL_LSTICK_RIGHT ( button_was_pressed ) | | CTRL_CROSS ( button_was_pressed ) | | CTRL_LSTICK_RIGHT ( button_was_held ) )
{
}
if ( CTRL_START ( button_was_pressed ) )
{
}
ingame_menu_reset_entry_colors ( ingame_menu_item ) ;
strcpy ( comment , " Press LEFT or RIGHT to change the [Overscan] settings. \n Press START to reset back to default values. " ) ;
break ;
case MENU_ITEM_ORIENTATION :
if ( CTRL_LEFT ( button_was_pressed ) | | CTRL_LSTICK_LEFT ( button_was_pressed ) | | CTRL_CROSS ( button_was_pressed ) | | CTRL_LSTICK_LEFT ( button_was_held ) )
{
}
if ( CTRL_RIGHT ( button_was_pressed ) | | CTRL_LSTICK_RIGHT ( button_was_pressed ) | | CTRL_CROSS ( button_was_pressed ) | | CTRL_LSTICK_RIGHT ( button_was_held ) )
{
}
if ( CTRL_START ( button_was_pressed ) )
{
}
ingame_menu_reset_entry_colors ( ingame_menu_item ) ;
strcpy ( comment , " Press LEFT or RIGHT to change the [Orientation] settings. \n Press START to reset back to default values. " ) ;
break ;
case MENU_ITEM_FRAME_ADVANCE :
if ( CTRL_CROSS ( state ) | | CTRL_R2 ( state ) | | CTRL_L2 ( state ) )
{
}
ingame_menu_reset_entry_colors ( ingame_menu_item ) ;
strcpy ( comment , " Press 'CROSS', 'L2' or 'R2' button to step one frame. \n NOTE: Pressing the button rapidly will advance the frame more slowly \n and prevent buttons from being input. " ) ;
break ;
case MENU_ITEM_RESIZE_MODE :
if ( CTRL_CROSS ( state ) )
{
}
ingame_menu_reset_entry_colors ( ingame_menu_item ) ;
strcpy ( comment , " Allows you to resize the screen by moving around the two analog sticks. \n Press TRIANGLE to reset to default values, and CIRCLE to go back to the \n in-game menu. " ) ;
break ;
case MENU_ITEM_SCREENSHOT_MODE :
if ( CTRL_CROSS ( state ) )
{
}
ingame_menu_reset_entry_colors ( ingame_menu_item ) ;
strcpy ( comment , " Allows you to take a screenshot without any text clutter. \n Press CIRCLE to go back to the in-game menu while in 'Screenshot Mode'. " ) ;
break ;
case MENU_ITEM_RETURN_TO_GAME :
if ( CTRL_CROSS ( button_was_pressed ) )
{
ingame_menu_item = 0 ;
g_console . in_game_menu = false ;
mode_switch = MODE_EMULATION ;
}
ingame_menu_reset_entry_colors ( ingame_menu_item ) ;
strcpy ( comment , " Press 'CROSS' to return back to the game. " ) ;
break ;
case MENU_ITEM_RESET :
if ( CTRL_CROSS ( button_was_pressed ) )
{
ingame_menu_item = 0 ;
g_console . in_game_menu = false ;
mode_switch = MODE_EMULATION ;
}
ingame_menu_reset_entry_colors ( ingame_menu_item ) ;
strcpy ( comment , " Press 'CROSS' to reset the game. " ) ;
break ;
case MENU_ITEM_RETURN_TO_MENU :
if ( CTRL_CROSS ( button_was_pressed ) )
{
ingame_menu_item = 0 ;
g_console . in_game_menu = false ;
menu_is_running = 0 ;
mode_switch = MODE_MENU ;
}
ingame_menu_reset_entry_colors ( ingame_menu_item ) ;
strcpy ( comment , " Press 'CROSS' to return to the ROM Browser menu. " ) ;
break ;
# ifdef MULTIMAN_SUPPORT
case MENU_ITEM_RETURN_TO_MULTIMAN :
if ( CTRL_CROSS ( button_was_pressed ) )
{
g_console . in_game_menu = false ;
mode_switch = MODE_EXIT ;
}
ingame_menu_reset_entry_colors ( ingame_menu_item ) ;
strcpy ( comment , " Press 'CROSS' to quit the emulator and return to multiMAN. " ) ;
break ;
# endif
case MENU_ITEM_RETURN_TO_XMB :
if ( CTRL_CROSS ( button_was_pressed ) )
{
g_console . in_game_menu = false ;
# ifdef MULTIMAN_SUPPORT
return_to_MM = false ;
# endif
mode_switch = MODE_EXIT ;
}
ingame_menu_reset_entry_colors ( ingame_menu_item ) ;
strcpy ( comment , " Press 'CROSS' to quit the emulator and return to the XMB. " ) ;
break ;
}
if ( CTRL_UP ( button_was_pressed ) | | CTRL_LSTICK_UP ( button_was_pressed ) )
{
if ( ingame_menu_item > 0 )
ingame_menu_item - - ;
}
if ( CTRL_DOWN ( button_was_pressed ) | | CTRL_LSTICK_DOWN ( button_was_pressed ) )
{
if ( ingame_menu_item < MENU_ITEM_LAST )
ingame_menu_item + + ;
}
}
float x_position = 0.3f ;
float font_size = 1.1f ;
float ypos = 0.19f ;
float ypos_increment = 0.04f ;
cellDbgFontPrintf ( x_position , 0.10f , 1.4f + 0.01f , BLUE , " Quick Menu " ) ;
cellDbgFontPrintf ( x_position , 0.10f , 1.4f , WHITE , " Quick Menu " ) ;
cellDbgFontPrintf ( x_position , ypos , font_size + 0.01f , BLUE , " Load State #%d " , g_extern . state_slot ) ;
cellDbgFontPrintf ( x_position , ypos , font_size , menuitem_colors [ MENU_ITEM_LOAD_STATE ] , " Load State #%d " , g_extern . state_slot ) ;
cellDbgFontPrintf ( x_position , ypos + ( ypos_increment * MENU_ITEM_SAVE_STATE ) , font_size + 0.01f , BLUE , " Save State #%d " , g_extern . state_slot ) ;
cellDbgFontPrintf ( x_position , ypos + ( ypos_increment * MENU_ITEM_SAVE_STATE ) , font_size , menuitem_colors [ MENU_ITEM_SAVE_STATE ] , " Save State #%d " , g_extern . state_slot ) ;
cellDbgFontDraw ( ) ;
cellDbgFontPrintf ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_KEEP_ASPECT_RATIO ) ) , font_size + 0.01f , BLUE , " Aspect Ratio: " ) ;
cellDbgFontPrintf ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_KEEP_ASPECT_RATIO ) ) , font_size , menuitem_colors [ MENU_ITEM_KEEP_ASPECT_RATIO ] , " Aspect Ratio: " ) ;
cellDbgFontPrintf ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_OVERSCAN_AMOUNT ) ) , font_size , menuitem_colors [ MENU_ITEM_OVERSCAN_AMOUNT ] , " Overscan: " ) ;
cellDbgFontPrintf ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_ORIENTATION ) ) , font_size + 0.01f , BLUE , " Orientation: " ) ;
cellDbgFontPrintf ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_ORIENTATION ) ) , font_size , menuitem_colors [ MENU_ITEM_ORIENTATION ] , " Orientation: " ) ;
cellDbgFontPrintf ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_RESIZE_MODE ) ) , font_size + 0.01f , BLUE , " Resize Mode " ) ;
cellDbgFontPrintf ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_RESIZE_MODE ) ) , font_size , menuitem_colors [ MENU_ITEM_RESIZE_MODE ] , " Resize Mode " ) ;
cellDbgFontPuts ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_FRAME_ADVANCE ) ) , font_size + 0.01f , BLUE , " Frame Advance " ) ;
cellDbgFontPuts ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_FRAME_ADVANCE ) ) , font_size , menuitem_colors [ MENU_ITEM_FRAME_ADVANCE ] , " Frame Advance " ) ;
cellDbgFontPuts ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_SCREENSHOT_MODE ) ) , font_size + 0.01f , BLUE , " Screenshot Mode " ) ;
cellDbgFontPuts ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_SCREENSHOT_MODE ) ) , font_size , menuitem_colors [ MENU_ITEM_SCREENSHOT_MODE ] , " Screenshot Mode " ) ;
cellDbgFontDraw ( ) ;
cellDbgFontPuts ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_RESET ) ) , font_size + 0.01f , BLUE , " Reset " ) ;
cellDbgFontPuts ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_RESET ) ) , font_size , menuitem_colors [ MENU_ITEM_RESET ] , " Reset " ) ;
cellDbgFontPuts ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_RETURN_TO_GAME ) ) , font_size + 0.01f , BLUE , " Return to Game " ) ;
cellDbgFontPuts ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_RETURN_TO_GAME ) ) , font_size , menuitem_colors [ MENU_ITEM_RETURN_TO_GAME ] , " Return to Game " ) ;
cellDbgFontPuts ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_RETURN_TO_MENU ) ) , font_size + 0.01f , BLUE , " Return to Menu " ) ;
cellDbgFontPuts ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_RETURN_TO_MENU ) ) , font_size , menuitem_colors [ MENU_ITEM_RETURN_TO_MENU ] , " Return to Menu " ) ;
# ifdef MULTIMAN_SUPPORT
cellDbgFontPuts ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_RETURN_TO_MULTIMAN ) ) , font_size + 0.01f , BLUE , " Return to multiMAN " ) ;
cellDbgFontPuts ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_RETURN_TO_MULTIMAN ) ) , font_size , menuitem_colors [ MENU_ITEM_RETURN_TO_MULTIMAN ] , " Return to multiMAN " ) ;
# endif
cellDbgFontDraw ( ) ;
cellDbgFontPuts ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_RETURN_TO_XMB ) ) , font_size + 0.01f , BLUE , " Return to XMB " ) ;
cellDbgFontPuts ( x_position , ( ypos + ( ypos_increment * MENU_ITEM_RETURN_TO_XMB ) ) , font_size , menuitem_colors [ MENU_ITEM_RETURN_TO_XMB ] , " Return to XMB " ) ;
if ( g_frame_count < special_action_msg_expired )
{
cellDbgFontPrintf ( 0.09f , 0.90f , 1.51f , BLUE , special_action_msg ) ;
cellDbgFontPrintf ( 0.09f , 0.90f , 1.50f , WHITE , special_action_msg ) ;
cellDbgFontDraw ( ) ;
}
else
{
special_action_msg_expired = 0 ;
cellDbgFontPrintf ( 0.09f , 0.90f , 0.98f + 0.01f , BLUE , comment ) ;
cellDbgFontPrintf ( 0.09f , 0.90f , 0.98f , LIGHTBLUE , comment ) ;
}
cellDbgFontDraw ( ) ;
psglSwap ( ) ;
old_state = state ;
cellSysutilCheckCallback ( ) ;
} while ( g_console . in_game_menu ) ;
2012-01-21 16:50:21 +00:00
ps3_unblock_swap ( ) ;
2012-01-20 23:30:01 +00:00
}
2012-01-05 21:47:34 +00:00
int main ( int argc , char * argv [ ] )
{
2012-01-11 00:04:17 +00:00
// Initialize 6 SPUs but reserve 1 SPU as a raw SPU for PSGL
sys_spu_initialize ( 6 , 1 ) ;
2012-01-26 01:28:54 +00:00
cellSysmoduleLoadModule ( CELL_SYSMODULE_IO ) ;
2012-01-11 00:04:17 +00:00
cellSysmoduleLoadModule ( CELL_SYSMODULE_FS ) ;
cellSysmoduleLoadModule ( CELL_SYSMODULE_SYSUTIL_GAME ) ;
2012-01-26 00:33:39 +00:00
cellSysmoduleLoadModule ( CELL_SYSMODULE_AVCONF_EXT ) ;
cellSysmoduleLoadModule ( CELL_SYSMODULE_PNGDEC ) ;
cellSysmoduleLoadModule ( CELL_SYSMODULE_JPGDEC ) ;
2012-01-11 00:04:17 +00:00
2012-01-21 17:00:07 +00:00
ssnes_main_clear_state ( ) ;
2012-01-16 03:07:02 +00:00
2012-01-21 16:24:25 +00:00
g_console . block_config_read = true ;
2012-01-26 00:33:39 +00:00
g_extern . verbose = true ;
2012-01-29 13:10:57 +00:00
config_set_defaults_cb ( default_settings ) ;
2012-01-21 16:24:25 +00:00
config_set_defaults ( ) ;
2012-01-13 00:27:18 +00:00
SSNES_LOG ( " Registering Callback \n " ) ;
cellSysutilRegisterCallback ( 0 , callback_sysutil_exit , NULL ) ;
2012-01-11 00:04:17 +00:00
# ifdef MULTIMAN_SUPPORT
2012-01-16 15:38:27 +00:00
g_console . return_to_multiman_enable = true ;
2012-01-11 00:04:17 +00:00
if ( argc > 1 )
{
strncpy ( MULTIMAN_GAME_TO_BOOT , argv [ 1 ] , sizeof ( MULTIMAN_GAME_TO_BOOT ) ) ;
}
# else
2012-01-16 15:38:27 +00:00
g_console . return_to_multiman_enable = false ;
2012-01-11 00:04:17 +00:00
# endif
2012-01-16 15:38:27 +00:00
get_path_settings ( g_console . return_to_multiman_enable ) ;
2012-01-29 13:10:57 +00:00
if ( ! init_settings ( ) )
{
SSNES_ERR ( " Couldn't find config at path: \" %s \" \n " , SYS_CONFIG_FILE ) ;
}
2012-01-11 00:04:17 +00:00
2012-01-16 14:45:55 +00:00
# if(CELL_SDK_VERSION > 0x340000)
if ( g_console . screenshots_enable )
{
cellSysmoduleLoadModule ( CELL_SYSMODULE_SYSUTIL_SCREENSHOT ) ;
CellScreenShotSetParam screenshot_param = { 0 , 0 , 0 , 0 } ;
screenshot_param . photo_title = " SSNES PS3 " ;
screenshot_param . game_title = " SSNES PS3 " ;
cellScreenShotSetParameter ( & screenshot_param ) ;
cellScreenShotEnable ( ) ;
}
# endif
2012-01-11 23:05:32 +00:00
ps3_video_init ( ) ;
2012-01-11 21:27:07 +00:00
ps3_input_init ( ) ;
menu_init ( ) ;
2012-01-16 03:07:02 +00:00
2012-01-20 17:00:33 +00:00
begin_loop :
if ( mode_switch = = MODE_EMULATION )
{
2012-01-21 02:56:31 +00:00
g_extern . is_paused = false ;
2012-01-21 01:32:55 +00:00
input_ps3 . poll ( NULL ) ;
2012-01-20 17:00:33 +00:00
while ( ssnes_main_iterate ( ) ) ;
2012-01-21 02:56:31 +00:00
g_extern . is_paused = true ;
2012-01-20 23:30:01 +00:00
if ( g_console . in_game_menu )
ingame_menu ( ) ;
2012-01-20 17:00:33 +00:00
}
else if ( mode_switch = = MODE_MENU )
{
menu_loop ( ) ;
if ( init_ssnes )
{
2012-01-20 23:30:01 +00:00
if ( g_emulator_initialized )
ssnes_main_deinit ( ) ;
2012-01-20 17:00:33 +00:00
char arg1 [ ] = " ssnes " ;
char arg2 [ PATH_MAX ] ;
2012-01-21 01:58:19 +00:00
snprintf ( arg2 , sizeof ( arg2 ) , g_console . rom_path ) ;
2012-01-20 17:00:33 +00:00
char arg3 [ ] = " -v " ;
char arg4 [ ] = " -c " ;
char arg5 [ MAX_PATH_LENGTH ] ;
snprintf ( arg5 , sizeof ( arg5 ) , SYS_CONFIG_FILE ) ;
char * argv_ [ ] = { arg1 , arg2 , arg3 , arg4 , arg5 , NULL } ;
int argc = sizeof ( argv_ ) / sizeof ( argv_ [ 0 ] ) - 1 ;
int init_ret = ssnes_main_init ( argc , argv_ ) ;
2012-01-20 23:30:01 +00:00
g_emulator_initialized = 1 ;
2012-01-20 17:00:33 +00:00
init_ssnes = 0 ;
}
}
# ifdef MULTIMAN_SUPPORT
else if ( mode_switch = = MODE_MULTIMAN_STARTUP )
{
}
# endif
else
goto begin_shutdown ;
2012-01-16 03:07:02 +00:00
2012-01-20 17:00:33 +00:00
goto begin_loop ;
2012-01-11 21:27:07 +00:00
2012-01-20 17:00:33 +00:00
begin_shutdown :
2012-01-11 21:27:07 +00:00
ps3_input_deinit ( ) ;
2012-01-11 23:05:32 +00:00
ps3_video_deinit ( ) ;
2012-01-20 17:00:33 +00:00
sys_process_exit ( 0 ) ;
2012-01-05 21:47:34 +00:00
}