int main(int argc, char* argv[]) { atexit(AtExit); if (argc < 2) { printf("Usage:\n"); #ifdef MODULE_SUPPORT printf("%s <in.ncch> [-d|-noscreen|-codepatch <code>|-modules <num> <in.ncch>|-overdrivlist <num> <services>|-sdmc <path>|-sysdata <path>|-sdwrite|-slotone|-configsave|-gdbport <port>]\n", argv[0]); #else printf("%s <in.ncch> [-d|-noscreen|-codepatch <code>|-sdmc <path>|-sysdata <path>|-sdwrite|-slotone|-configsave|-gdbport <port>]\n", argv[0]); #endif return 1; } //disasm = (argc > 2) && (strcmp(argv[2], "-d") == 0); //noscreen = (argc > 2) && (strcmp(argv[2], "-noscreen") == 0); for (int i = 2; i < argc; i++) { if ((strcmp(argv[i], "-d") == 0))disasm = true; else if ((strcmp(argv[i], "-noscreen") == 0))noscreen = true; else if ((strcmp(argv[i], "-codepatch") == 0)) { i++; codepath = malloc(strlen(argv[i])); strcpy(codepath, argv[i]); } else if ((strcmp(argv[i], "-sdmc") == 0)) { i++; strcpy(config_sdmc_path, argv[i]); config_has_sdmc = true; } else if ((strcmp(argv[i], "-sysdata") == 0)) { i++; strcpy(config_sysdataoutpath, argv[i]); config_usesys = true; } else if ((strcmp(argv[i], "-sdwrite") == 0))config_slotone = true; else if ((strcmp(argv[i], "-slotone") == 0))config_sdmcwriteable = true; else if ((strcmp(argv[i], "-configsave") == 0))config_nand_cfg_save = true; #ifdef GDB_STUB if ((strcmp(argv[i], "-gdbport") == 0)) { i++; global_gdb_port = atoi(argv[i]); if (global_gdb_port < 1 || global_gdb_port > 65535) { DEBUG("ARM9 GDB stub port must be in the range 1 to 65535\n"); exit(-1); } gdb_ctrl_iface.stall = stall_cpu; gdb_ctrl_iface.unstall = unstall_cpu; gdb_ctrl_iface.read_reg = read_cpu_reg; gdb_ctrl_iface.set_reg = set_cpu_reg; gdb_ctrl_iface.install_post_ex_fn = install_post_exec_fn; gdb_ctrl_iface.remove_post_ex_fn = remove_post_exec_fn; gdb_base_memory_iface.prefetch16 = gdb_prefetch16; gdb_base_memory_iface.prefetch32 = gdb_prefetch32; gdb_base_memory_iface.read32 = gdb_read32; gdb_base_memory_iface.write32 = gdb_write32; gdb_base_memory_iface.read16 = gdb_read16; gdb_base_memory_iface.write16 = gdb_write16; gdb_base_memory_iface.read8 = gdb_read8; gdb_base_memory_iface.write8 = gdb_write8; } #endif if (i >= argc)break; #ifdef MODULE_SUPPORT if ((strcmp(argv[i], "-modules") == 0)) { i++; modulenum = atoi(argv[i]); modulenames = malloc(sizeof(char*)*modulenum); i++; for (int j = 0; j < modulenum; j++) { *(modulenames + j) = malloc(strlen(argv[i])); strcpy(*(modulenames + j), argv[i]); i++; } } if (i >= argc)break; if ((strcmp(argv[i], "-overdrivlist") == 0)) { i++; overdrivnum = atoi(argv[i]); overdrivnames = malloc(sizeof(char*)*modulenum); i++; for (int j = 0; j < modulenum; j++) { *(overdrivnames + j) = malloc(strlen(argv[i])); strcpy(*(overdrivnames + j), argv[i]); i++; } } if (i >= argc)break; #endif } #ifdef MODULE_SUPPORT curprocesshandlelist = malloc(sizeof(u32)*(modulenum + 1)); ModuleSupport_MemInit(modulenum); #endif signal(SIGINT, AtSig); if (!noscreen) screen_Init(); hid_spvr_init(); hid_user_init(); initDSP(); mcu_GPU_init(); initGPU(); srv_InitGlobal(); arm11_Init(); #ifdef MODULE_SUPPORT int i; for (i = 0; i<modulenum; i++) { u32 handzwei = handle_New(HANDLE_TYPE_PROCESS, 0); curprocesshandle = handzwei; *(curprocesshandlelist + i) = handzwei; ModuleSupport_SwapProcessMem(i); u32 hand = handle_New(HANDLE_TYPE_THREAD, 0); threads_New(hand); // Load file. FILE* fd = fopen(*(modulenames + i), "rb"); if (fd == NULL) { perror("Error opening file"); return 1; } if (loader_LoadFile(fd) != 0) { fclose(fd); return 1; } } u32 handzwei = handle_New(HANDLE_TYPE_PROCESS, 0); *(curprocesshandlelist + modulenum) = handzwei; ModuleSupport_SwapProcessMem(modulenum); #else u32 handzwei = handle_New(HANDLE_TYPE_PROCESS, 0); curprocesshandle = handzwei; #endif FILE* fd = fopen(argv[1], "rb"); if (fd == NULL) { perror("Error opening file"); return 1; } u32 hand = handle_New(HANDLE_TYPE_THREAD, 0); threads_New(hand); // Load file. if (loader_LoadFile(fd) != 0) { fclose(fd); return 1; } #ifdef GDB_STUB if (global_gdb_port) { gdb_stub = createStub_gdb(global_gdb_port, &gdb_memio, &gdb_base_memory_iface); if (gdb_stub == NULL) { DEBUG("Failed to create ARM9 gdbstub on port %d\n", global_gdb_port); exit(-1); } activateStub_gdb(gdb_stub, &gdb_ctrl_iface); } #endif // Execute. while (running) { if (!noscreen) screen_HandleEvent(); #ifdef MODULE_SUPPORT int k; for (k = 0; k <= modulenum; k++) { ModuleSupport_SwapProcess(k); DEBUG("Process %X\n",k); } #else threads_Execute(); #endif if (!noscreen) screen_RenderGPU(); FPS_Lock(); //mem_Dbugdump(); } fclose(fd); return 0; }
static int common_gtk_glade_main( struct configured_features *my_config) { SDL_TimerID limiter_timer; gdbstub_handle_t arm9_gdb_stub; gdbstub_handle_t arm7_gdb_stub; struct armcpu_memory_iface *arm9_memio = &arm9_base_memory_iface; struct armcpu_memory_iface *arm7_memio = &arm7_base_memory_iface; struct armcpu_ctrl_iface *arm9_ctrl_iface; struct armcpu_ctrl_iface *arm7_ctrl_iface; #ifdef GTKGLEXT_AVAILABLE // check if you have GTHREAD when running configure script //g_thread_init(NULL); register_gl_fun(my_gl_Begin,my_gl_End); #endif #ifdef DEBUG LogStart(); #endif init_keyvals(); if ( my_config->arm9_gdb_port != 0) { arm9_gdb_stub = createStub_gdb( my_config->arm9_gdb_port, &arm9_memio, &arm9_base_memory_iface); if ( arm9_gdb_stub == NULL) { g_print( "Failed to create ARM9 gdbstub on port %d\n", my_config->arm9_gdb_port); return -1; } } if ( my_config->arm7_gdb_port != 0) { arm7_gdb_stub = createStub_gdb( my_config->arm7_gdb_port, &arm7_memio, &arm7_base_memory_iface); if ( arm7_gdb_stub == NULL) { g_print( "Failed to create ARM7 gdbstub on port %d\n", my_config->arm7_gdb_port); return -1; } } if(SDL_Init( SDL_INIT_TIMER | SDL_INIT_VIDEO) == -1) { fprintf(stderr, "Error trying to initialize SDL: %s\n", SDL_GetError()); return 1; } desmume_init( arm9_memio, &arm9_ctrl_iface, arm7_memio, &arm7_ctrl_iface); /* * Activate the GDB stubs * This has to come after the NDS_Init (called in desmume_init) * where the cpus are set up. */ if ( my_config->arm9_gdb_port != 0) { activateStub_gdb( arm9_gdb_stub, arm9_ctrl_iface); } if ( my_config->arm7_gdb_port != 0) { activateStub_gdb( arm7_gdb_stub, arm7_ctrl_iface); } /* Initialize joysticks */ if(!init_joy()) return 1; CONFIG_FILE = g_build_filename(g_get_home_dir(), ".desmume.ini", NULL); Read_ConfigFile(); /* load the interface */ xml = glade_xml_new(get_ui_file("DeSmuMe.glade"), NULL, NULL); xml_tools = glade_xml_new(get_ui_file("DeSmuMe_Dtools.glade"), NULL, NULL); pWindow = glade_xml_get_widget(xml, "wMainW"); pDrawingArea = glade_xml_get_widget(xml, "wDraw_Main"); pDrawingArea2 = glade_xml_get_widget(xml, "wDraw_Sub"); /* connect the signals in the interface */ glade_xml_signal_autoconnect_StringObject(xml); glade_xml_signal_autoconnect_StringObject(xml_tools); init_GL_capabilities( my_config->software_colour_convert); /* check command line file */ if( my_config->nds_file) { if(desmume_open( my_config->nds_file) >= 0) { desmume_resume(); enable_rom_features(); } else { GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Unable to load :\n%s", my_config->nds_file); gtk_dialog_run(GTK_DIALOG(pDialog)); gtk_widget_destroy(pDialog); } } gtk_widget_show(pDrawingArea); gtk_widget_show(pDrawingArea2); { int use_null_3d = my_config->disable_3d; #ifdef GTKGLEXT_AVAILABLE if ( !use_null_3d) { /* setup the gdk 3D emulation */ if ( init_opengl_gdk_3Demu()) { NDS_3D_SetDriver(1); if (!gpu3D->NDS_3D_Init()) { fprintf( stderr, "Failed to initialise openGL 3D emulation; " "removing 3D support\n"); use_null_3d = 1; } } else { fprintf( stderr, "Failed to setup openGL 3D emulation; " "removing 3D support\n"); use_null_3d = 1; } } #endif if ( use_null_3d) { NDS_3D_SetDriver ( 0); gpu3D->NDS_3D_Init(); } } // on_menu_tileview_activate(NULL,NULL); /* setup the frame limiter and indicate if it is disabled */ glade_fps_limiter_disabled = my_config->disable_limiter; if ( !glade_fps_limiter_disabled) { /* create the semaphore used for fps limiting */ glade_fps_limiter_semaphore = SDL_CreateSemaphore( 1); /* start a SDL timer for every FPS_LIMITER_FRAME_PERIOD * frames to keep us at 60 fps */ limiter_timer = SDL_AddTimer( 16 * FPS_LIMITER_FRAME_PERIOD, glade_fps_limiter_fn, glade_fps_limiter_semaphore); if ( limiter_timer == NULL) { fprintf( stderr, "Error trying to start FPS limiter timer: %s\n", SDL_GetError()); SDL_DestroySemaphore( glade_fps_limiter_semaphore); glade_fps_limiter_disabled = 1; } } /* start event loop */ gtk_main(); desmume_free(); if ( !glade_fps_limiter_disabled) { /* tidy up the FPS limiter timer and semaphore */ SDL_RemoveTimer( limiter_timer); SDL_DestroySemaphore( glade_fps_limiter_semaphore); } #ifdef DEBUG LogStop(); #endif /* Unload joystick */ uninit_joy(); SDL_Quit(); Write_ConfigFile(); return EXIT_SUCCESS; }