void emu_loop(bool reset) { if (reset) { emu_reset(); } exiting = false; #ifdef __EMSCRIPTEN__ emscripten_set_main_loop(emu_inner_loop, -1, 1); #else while (!exiting) { if (cpu_events & EVENT_RESET) { cpu_events = EVENT_NONE; gui_console_printf("CPU Reset triggered..."); emu_reset(); } if (cpu_events & EVENT_DEBUG_STEP) { cpu_events = EVENT_NONE; debugger(DBG_STEP, 0); } sched_process_pending_events(); if (cycle_count_delta < 0) { cpu_execute(); // execute instructions with available clock cycles } else { QThread::yieldCurrentThread(); } } emu_cleanup(); #endif }
extern "C" DLL_EXPORT void CDECL_CALL EmuMain(char *rom) { int i; char *s; /* If we have special perms, drop them ASAP! */ vid_preinit(); init_exports(); s = strdup("."); sys_sanitize(s); sys_initpath(s); for (i = 0; defaultconfig[i]; i++) rc_command(defaultconfig[i]); /* FIXME - make interface modules responsible for atexit() */ atexit(shutdown); catch_signals(); vid_init(); pcm_init(); rom = strdup(rom); sys_sanitize(rom); loader_init(rom); emu_reset(); emu_run(); }
// TODO : Make sure it works with the recent commits. void emu_inner_loop(void) { while (!exiting) { sched_process_pending_events(); if (cpu_events & EVENT_RESET) { gui_console_printf("CPU Reset triggered..."); emu_reset(); } if (cycle_count_delta < 0) { cpu_execute(); // execute instructions with available clock cycles } } }
void emu_init(int game_id) { vid_init(); pcm_init(); vid_preinit(); // load ROM & load palette bitbox_rom_load(game_id); emu_reset(); vid_begin(); lcd_begin(); emu_started = 1; // at the end , start line blitting }
void emu_loop(bool reset) { if (reset) { emu_reset(); } exiting = false; emulationPaused = false; #ifdef __EMSCRIPTEN__ emscripten_set_main_loop(emu_main_loop_inner, 0, 1); #else while (!exiting) { emu_main_loop_inner(); } #endif emu_cleanup(); }
int gbcLoadRom(const char *filename) { char *p; if (!loader_init(filename)) return 0; strcpy(sram_filename, filename); p = strrchr(sram_filename, '.'); if (p) *p = '\0'; strcat(sram_filename, ".sav"); sram_save_counter = SRAM_SAVE_LOOPS; gbcLoadSRAM(); emu_reset(); return 1; }
static int gnuboy_main(const char *rom) { rb->lcd_puts(0,0,"Init video"); vid_init(); rb->lcd_puts(0,1,"Init sound"); pcm_init(); rb->lcd_puts(0,2,"Loading rom"); loader_init(rom); if(shut) return PLUGIN_ERROR; rb->lcd_puts(0,3,"Emu reset"); emu_reset(); rb->lcd_puts(0,4,"Emu run"); rb->lcd_clear_display(); rb->lcd_update(); emu_run(); /* never reached */ return PLUGIN_OK; }
int gbcLoadRomFromBuffer(const char * name, const signed char *data) { char *p; if (!loader_init_buffer(name, data)) return 0; /* strcpy(sram_filename, data); p = strrchr(sram_filename, '.'); if (p) *p = '\0'; strcat(sram_filename, ".sav"); sram_save_counter = SRAM_SAVE_LOOPS; gbcLoadSRAM(); */ emu_reset(); return 1; }
int emu_init() { emu_reset(); fill_table(); return 0; }
int main(int argc, char *argv[]) { int i; char *opt, *arg, *cmd, *s, *rom = 0; /* Avoid initializing video if we don't have to */ for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "--help")) help(base(argv[0])); else if (!strcmp(argv[i], "--version")) version(base(argv[0])); else if (!strcmp(argv[i], "--copying")) copying(); else if (!strcmp(argv[i], "--bind")) i += 2; else if (!strcmp(argv[i], "--source")) i++; else if (!strcmp(argv[i], "--showvars")) { show_exports(); exit(0); } else if (argv[i][0] == '-' && argv[i][1] == '-'); else if (argv[i][0] == '-' && argv[i][1]); else rom = argv[i]; } if (!rom) usage(base(argv[0])); /* If we have special perms, drop them ASAP! */ vid_preinit(); init_exports(); s = strdup(argv[0]); sys_sanitize(s); sys_initpath(s); for (i = 0; defaultconfig[i]; i++) rc_command(defaultconfig[i]); for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "--bind")) { if (i + 2 >= argc) die("missing arguments to bind\n"); cmd = malloc(strlen(argv[i+1]) + strlen(argv[i+2]) + 9); sprintf(cmd, "bind %s \"%s\"", argv[i+1], argv[i+2]); rc_command(cmd); free(cmd); i += 2; } else if (!strcmp(argv[i], "--source")) { if (i + 1 >= argc) die("missing argument to source\n"); cmd = malloc(strlen(argv[i+1]) + 6); sprintf(cmd, "source %s", argv[++i]); rc_command(cmd); free(cmd); } else if (!strncmp(argv[i], "--no-", 5)) { opt = strdup(argv[i]+5); while ((s = strchr(opt, '-'))) *s = '_'; cmd = malloc(strlen(opt) + 7); sprintf(cmd, "set %s 0", opt); rc_command(cmd); free(cmd); free(opt); } else if (argv[i][0] == '-' && argv[i][1] == '-') { opt = strdup(argv[i]+2); if ((s = strchr(opt, '='))) { *s = 0; arg = s+1; } else arg = "1"; while ((s = strchr(opt, '-'))) *s = '_'; while ((s = strchr(arg, ','))) *s = ' '; cmd = malloc(strlen(opt) + strlen(arg) + 6); sprintf(cmd, "set %s %s", opt, arg); rc_command(cmd); free(cmd); free(opt); } /* short options not yet implemented */ else if (argv[i][0] == '-' && argv[i][1]); } /* FIXME - make interface modules responsible for atexit() */ atexit(shutdown); catch_signals(); vid_init(); pcm_init(); rom = strdup(rom); sys_sanitize(rom); loader_init(rom); emu_reset(); emu_run(); /* never reached */ return 0; }
void MainMenu () { s8 ret; u8 quit = 0; menu = 0; #ifdef HW_RVL u8 count = 6; char items[6][20] = #else u8 count = 5; char items[5][20] = #endif { {"Play Game"}, {"Hard Reset"}, {"Load New Game"}, {"Emulator Options"}, #ifdef HW_RVL {"Return to Loader"}, #endif {"System Reboot"} }; /* 50 hz TV mode */ if (gc_pal) { VIDEO_Configure (vmode); VIDEO_ClearFrameBuffer(vmode, xfb[whichfb], COLOR_BLACK); VIDEO_Flush(); VIDEO_WaitVSync(); VIDEO_WaitVSync(); } /* autosave (SRAM only) */ int temp = config.freeze_auto; config.freeze_auto = -1; memfile_autosave(); config.freeze_auto = temp; while (quit == 0) { strcpy (menutitle, "Version 1.04.2"); ret = DoMenu (&items[0], count); switch (ret) { case -1: /*** Button B ***/ case 0: /*** Play Game ***/ quit = 1; break; case 1: emu_reset(); quit = 1; break; case 2: /*** Load ROM Menu ***/ quit = loadmenu(); break; case 3: /*** Emulator Options */ Emu_options(); break; case 4: /*** SD/PSO/TP Reload ***/ memfile_autosave(); VIDEO_ClearFrameBuffer(vmode, xfb[whichfb], COLOR_BLACK); VIDEO_Flush(); VIDEO_WaitVSync(); #ifdef HW_RVL DI_Close(); exit(0); break; case 5: /*** Return to Wii System Menu ***/ memfile_autosave(); VIDEO_ClearFrameBuffer(vmode, xfb[whichfb], COLOR_BLACK); VIDEO_Flush(); VIDEO_WaitVSync(); DI_Close(); SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); #else SYS_ResetSystem(SYS_HOTRESET,0,0); #endif break; } } /*** Remove any still held buttons ***/ while (PAD_ButtonsHeld(0)) PAD_ScanPads(); #ifdef HW_RVL while (WPAD_ButtonsHeld(0)) WPAD_ScanPads(); #endif /*** Restore fullscreen 50hz ***/ if (gc_pal) { extern GXRModeObj TV50hz_576i; GXRModeObj *rmode = &TV50hz_576i; Mtx p; rmode->xfbHeight = 574; rmode->viYOrigin = 0; rmode->viHeight = 574; VIDEO_Configure (rmode); VIDEO_ClearFrameBuffer(rmode, xfb[whichfb], COLOR_BLACK); VIDEO_Flush(); VIDEO_WaitVSync(); VIDEO_WaitVSync(); /* reset rendering mode */ GX_SetViewport (0.0F, 0.0F, rmode->fbWidth, rmode->efbHeight, 0.0F, 1.0F); GX_SetScissor (0, 0, rmode->fbWidth, rmode->efbHeight); f32 yScale = GX_GetYScaleFactor(rmode->efbHeight, rmode->xfbHeight); u16 xfbHeight = GX_SetDispCopyYScale (yScale); GX_SetDispCopySrc (0, 0, rmode->fbWidth, rmode->efbHeight); GX_SetDispCopyDst (rmode->fbWidth, xfbHeight); GX_SetCopyFilter (rmode->aa, rmode->sample_pattern, GX_TRUE, rmode->vfilter); GX_SetFieldMode (rmode->field_rendering, ((rmode->viHeight == 2 * rmode->xfbHeight) ? GX_ENABLE : GX_DISABLE)); GX_SetPixelFmt (GX_PF_RGB8_Z24, GX_ZC_LINEAR); guOrtho(p, rmode->efbHeight/2, -(rmode->efbHeight/2), -(rmode->fbWidth/2), rmode->fbWidth/2, 100, 1000); GX_LoadProjectionMtx (p, GX_ORTHOGRAPHIC); } #ifndef HW_RVL /*** Stop the DVD from causing clicks while playing ***/ uselessinquiry (); #endif }
int action_reset(MENU_ITEM *self) { emu_reset(); return 2; }
int app_main(int argc,char** argv) { char * rom; /* to use the medios browser you have to define USE_MEDIOS_BROWSER. This completely changes the way the emu works, it mapps button_off to exit the emulator and return to the browser, While exit in the emu ingame menu still completly exits. Cj tell me if you want to do it this way and also let me know if it works for you? */ int i; for(i=0;i<argc;i++) printf("%d:%s\n",i,argv[i]); #ifdef USE_MEDIOS_BROWSER while(1) { osd_setEntirePalette(gui_pal,256); gfx_planeSetSize(BMAP1,LCD_WIDTH,LCD_HEIGHT,8); gfx_planeSetPos(BMAP1,X_OFFSET,Y_OFFSET); iniIcon(); gfx_openGraphics(); clearScreen(COLOR_WHITE); gfx_fontSet(STD6X9); if(argc<2) { ini_file_browser(); rom=browse("/",1); } else { rom = (char *)malloc(MAX_PATH); strcpy(rom,argv[1]); } if (rom=='0') { cleanup(); reload_firmware(); } gfx_openGraphics(); OSD_BITMAP1_ADDRESS = (int)gfx_planeGetBufferOffset(BMAP1); gfx_planeSetSize(BMAP1,160,144,8); gfx_planeSetPos(BMAP1,(LCD_WIDTH-OSD_BITMAP1_WIDTH) + X_OFFSET,(LCD_HEIGHT-OSD_BITMAP1_HEIGHT)/2 + Y_OFFSET); gfx_fillRect(0x00,0,0,160,144); gfx_fontSet(10); vid_init(); pcm_init(); //rom = (char *)malloc(MAX_PATH); printf("Rom name : %s\n",rom); loader_init(rom); emu_reset(); emu_run(); } #endif #ifndef USE_MEDIOS_BROWSER //this uses the avBoy browser and is the default gfx_openGraphics(); OSD_BITMAP1_ADDRESS = (int)gfx_planeGetBufferOffset(BMAP1); gfx_planeSetSize(BMAP1,160,144,8); gfx_planeSetPos(BMAP1,(LCD_WIDTH-OSD_BITMAP1_WIDTH) + X_OFFSET,(LCD_HEIGHT-OSD_BITMAP1_HEIGHT)/2 + Y_OFFSET); gfx_fillRect(0x00,0,0,160,144); gfx_fontSet(10); vid_init(); pcm_init(); rom = (char *)malloc(MAX_PATH); printf("argc = %d, argv = %x\n",argc,argv); if(argc<2) browser(rom); else strcpy(rom,argv[1]); //browser(rom); printf("Rom name : %s (%x,%x)\n",rom,rom,rom+MAX_PATH); loader_init(rom); emu_reset(); emu_run(); #endif printf("before return\n"); return 0; }
static int cmd_reset(int argc, char **argv) //gp32 { emu_reset(); return 0; }
void emu_init() { vid_init(); pcm_init(); emu_reset(); }
void emu_loop(bool reset) { #if OS_HAS_PAGEFAULT_HANDLER os_exception_frame_t seh_frame = { NULL, NULL }; os_faulthandler_arm(&seh_frame); #endif if(reset) { reset: emu_reset(); } gdbstub_reset(); addr_cache_flush(); flush_translations(); sched_update_next_event(0); exiting = false; // clang segfaults with that, for an iOS build :( #ifndef NO_SETJMP // Workaround for LLVM bug #18974 while(__builtin_setjmp(restart_after_exception)){}; #endif while (!exiting) { sched_process_pending_events(); while (!exiting && cycle_count_delta < 0) { if (cpu_events & EVENT_RESET) { gui_status_printf("Reset"); goto reset; } if (cpu_events & (EVENT_FIQ | EVENT_IRQ)) { // Align PC in case the interrupt occurred immediately after a jump if (arm.cpsr_low28 & 0x20) arm.reg[15] &= ~1; else arm.reg[15] &= ~3; if (cpu_events & EVENT_WAITING) arm.reg[15] += 4; // Skip over wait instruction arm.reg[15] += 4; cpu_exception((cpu_events & EVENT_FIQ) ? EX_FIQ : EX_IRQ); } cpu_events &= ~EVENT_WAITING; if (arm.cpsr_low28 & 0x20) cpu_thumb_loop(); else cpu_arm_loop(); } } #if OS_HAS_PAGEFAULT_HANDLER os_faulthandler_unarm(&seh_frame); #endif }
void retro_reset(void) { emu_reset(); }
BYTE emu_frame(void) { #if defined (DEBUG) WORD PCBREAK = 0xA930; #endif #if defined (SDL) && defined (__WIN32__) gfx_sdlwe_tick(); #endif gui_control_visible_cursor(); tas.lag_frame = TRUE; /* gestione uscita */ if (info.stop == TRUE) { emu_quit(EXIT_SUCCESS); } /* eseguo un frame dell'emulatore */ if (!(info.no_rom | info.pause)) { /* controllo se ci sono eventi di input */ if (tas.type) { tas_frame(); } else { BYTE i; for (i = PORT1; i < PORT_MAX; i++) { if (input_add_event[i]) { input_add_event[i](i); } } } /* riprendo a far correre la CPU */ info.execute_cpu = TRUE; while (info.execute_cpu == TRUE) { #if defined (DEBUG) if (cpu.PC == PCBREAK) { BYTE pippo = 5; pippo = pippo + 1; } #endif /* eseguo CPU, PPU e APU */ cpu_exe_op(); } if ((cfg->cheat_mode == GAMEGENIE_MODE) && (gamegenie.phase == GG_LOAD_ROM)) { emu_reset(CHANGE_ROM); gamegenie.phase = GG_FINISH; } if (tas.lag_frame) { tas.total_lag_frames++; } if (snd_end_frame) { snd_end_frame(); } //#if defined (DEBUG) // gfx_draw_screen(TRUE); //#else gfx_draw_screen(FALSE); //#endif if (!tas.type && (++tl.frames == tl.frames_snap)) { timeline_snap(TL_NORMAL); } r4011.frames++; } else { gfx_draw_screen(FALSE); } /* gestione frameskip e calcolo fps */ fps_frameskip(); return (EXIT_OK); }
void gbcReset() { emu_reset(); }
BYTE save_slot_load(BYTE slot) { uTCHAR *file; FILE *fp; if (tas.type) { text_add_line_info(1, "[yellow]movie playback interrupted[normal]"); tas_quit(); } /* game genie */ if (info.mapper.id == GAMEGENIE_MAPPER) { gamegenie_reset(); gamegenie.phase = GG_LOAD_ROM; emu_reset(CHANGE_ROM); gamegenie.phase = GG_FINISH; } if (slot < SAVE_SLOT_FILE) { if ((file = name_slot_file(slot)) == NULL) { return (EXIT_ERROR); } } else { file = cfg->save_file; } if ((fp = ufopen(file, uL("rb"))) == NULL) { text_add_line_info(1, "[red]error[normal] loading state"); fprintf(stderr, "error loading state\n"); return (EXIT_ERROR); } /* * mi salvo lo stato attuale da ripristinare in caso * di un file di salvataggio corrotto. */ timeline_snap(TL_SAVE_SLOT); if (slot == SAVE_SLOT_FILE) { slot_operation(SAVE_SLOT_COUNT, slot, fp); if (memcmp(info.sha1sum.prg.value, save_slot.sha1sum.prg.value, sizeof(info.sha1sum.prg.value)) != 0) { text_add_line_info(1, "[red]state file is not for this rom[normal]"); fprintf(stderr, "state file is not for this rom.\n"); timeline_back(TL_SAVE_SLOT, 0); fclose(fp); return (EXIT_ERROR); } } if (slot_operation(SAVE_SLOT_READ, slot, fp)) { fprintf(stderr, "error loading state, corrupted file.\n"); timeline_back(TL_SAVE_SLOT, 0); fclose(fp); return (EXIT_ERROR); } fclose(fp); if (slot < SAVE_SLOT_FILE) { text_save_slot(SAVE_SLOT_READ); } /* riavvio il timeline */ timeline_init(); return (EXIT_OK); }
bool emu_start(unsigned int port_gdb, unsigned int port_rdbg, const char *snapshot_file) { gui_busy_raii gui_busy; if(snapshot_file) { // Open snapshot size_t snapshot_size = gzip_filesize(snapshot_file); if(snapshot_size < sizeof(emu_snapshot)) return false; FILE *fp = fopen_utf8(snapshot_file, "rb"); if(!fp) return false; int dupfd = dup(fileno(fp)); fclose(fp); fp = nullptr; // gzdopen takes ownership of the fd gzFile gzf = gzdopen(dupfd, "r"); if(!gzf) { close(dupfd); return false; } auto snapshot = (struct emu_snapshot *) malloc(snapshot_size); if(!snapshot) { gzclose(gzf); return false; } if((size_t) gzread(gzf, snapshot, snapshot_size) != snapshot_size) { gzclose(gzf); free(snapshot); return false; } gzclose(gzf); //sched_reset(); sched.items[SCHED_THROTTLE].clock = CLOCK_27M; sched.items[SCHED_THROTTLE].proc = throttle_interval_event; // TODO: Max length path_boot1 = std::string(snapshot->path_boot1); path_flash = std::string(snapshot->path_flash); // TODO: Pass snapshot_size to flash_resume to avoid reading after the buffer // Resume components uint32_t sdram_size; if(snapshot->sig != SNAPSHOT_SIG || snapshot->version != SNAPSHOT_VER || !flash_resume(snapshot) || !flash_read_settings(&sdram_size, &product, &features, &asic_user_flags) || !cpu_resume(snapshot) || !memory_resume(snapshot) || !sched_resume(snapshot)) { emu_cleanup(); free(snapshot); return false; } free(snapshot); } else { if (!flash_open(path_flash.c_str())) return false; uint32_t sdram_size; flash_read_settings(&sdram_size, &product, &features, &asic_user_flags); flash_set_bootorder(boot_order); if(!memory_initialize(sdram_size)) { emu_cleanup(); return false; } } if(debug_on_start) cpu_events |= EVENT_DEBUG_STEP; uint8_t *rom = mem_areas[0].ptr; memset(rom, -1, 0x80000); for (int i = 0x00000; i < 0x80000; i += 4) RAM_FLAGS(&rom[i]) = RF_READ_ONLY; /* Load the ROM */ FILE *f = fopen_utf8(path_boot1.c_str(), "rb"); if (!f) { gui_perror(path_boot1.c_str()); emu_cleanup(); return false; } (void)fread(rom, 1, 0x80000, f); fclose(f); #ifndef NO_TRANSLATION if(!translate_init()) { gui_debug_printf("Could not init JIT, disabling translation.\n"); do_translate = false; } #endif addr_cache_init(); throttle_timer_on(); if(port_gdb) gdbstub_init(port_gdb); if(port_rdbg) rdebug_bind(port_rdbg); usblink_queue_reset(); if(!snapshot_file) emu_reset(); return true; }