void retro_run(void) { bool updated = false; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) check_variables(); update_input(); JaguarExecuteNew(); static int lastw=STARTWIDTH; if(lastw!=TOMGetVideoModeWidth()){ retro_get_system_av_info(&g_av_info); printf("width change:%d-" ,lastw); lastw=TOMGetVideoModeWidth(); printf(">%d\n" ,lastw); game_width = TOMGetVideoModeWidth(); game_height = TOMGetVideoModeHeight(); tomWidth = game_width; tomHeight = game_height; printf("new res:%dx%d %f\n",game_width,game_height,(float)game_width/game_height); bool ret; ret = environ_cb(RETRO_ENVIRONMENT_SET_GEOMETRY, &g_av_info.geometry); } SDLSoundCallback(NULL,sampleBuffer, vjs.hardwareTypeNTSC==1?BUFNTSC:BUFPAL); video_cb(videoBuffer, game_width, game_height, MAXWIDTH << 2); audio_batch_cb((int16_t *)sampleBuffer, vjs.hardwareTypeNTSC==1?BUFNTSC/2:BUFPAL/2); }
static void check_variables(void) { struct retro_variable var = {0}; var.key = "test_opt0"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) log_cb(RETRO_LOG_INFO, "Key -> Val: %s -> %s.\n", var.key, var.value); var.key = "test_opt1"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) log_cb(RETRO_LOG_INFO, "Key -> Val: %s -> %s.\n", var.key, var.value); var.key = "test_opt2"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) log_cb(RETRO_LOG_INFO, "Key -> Val: %s -> %s.\n", var.key, var.value); float last = last_aspect; float last_rate = last_sample_rate; struct retro_system_av_info info; retro_get_system_av_info(&info); if ((last != last_aspect && last != 0.0f) || (last_rate != last_sample_rate && last_rate != 0.0f)) { // SET_SYSTEM_AV_INFO can only be called within retro_run(). // check_variables() is called once in retro_load_game(), but the checks // on last and last_rate ensures this path is never hit that early. // last_aspect and last_sample_rate are not updated until retro_get_system_av_info(), // which must come after retro_load_game(). bool ret; if (last_rate != last_sample_rate && last_rate != 0.0f) // If audio rate changes, go through SET_SYSTEM_AV_INFO. ret = environ_cb(RETRO_ENVIRONMENT_SET_SYSTEM_AV_INFO, &info); else // If only aspect changed, take the simpler path. ret = environ_cb(RETRO_ENVIRONMENT_SET_GEOMETRY, &info.geometry); log_cb(RETRO_LOG_INFO, "SET_SYSTEM_AV_INFO/SET_GEOMETRY = %u.\n", ret); } }
void retro_run (void) { bool updated = false; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) check_variables(); if(NEWGAME_FROM_OSD==1) { struct retro_system_av_info ninfo; retro_get_system_av_info(&ninfo); environ_cb(RETRO_ENVIRONMENT_SET_SYSTEM_AV_INFO, &ninfo); printf("ChangeAV: w:%d h:%d ra:%f %f \n",ninfo.geometry.base_width,ninfo.geometry.base_height,ninfo.geometry.aspect_ratio); NEWGAME_FROM_OSD=0; } retro_poll_mame_input(); if (draw_this_frame) video_cb(videoBuffer,rtwi, rthe, topw << LOG_PIXEL_BYTES); else video_cb(NULL,rtwi, rthe, topw << LOG_PIXEL_BYTES); co_switch(emuThread); }
void retro_run( void ) { bool updated = false; if ( env_cb( RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated ) && updated ) { int res = update_variables(); if ( res & UPDATE_RESET ) { retro_reset(); } if ( res & UPDATE_AV ) { struct retro_system_av_info info; retro_get_system_av_info( &info ); env_cb( RETRO_ENVIRONMENT_SET_SYSTEM_AV_INFO, &info ); } } input_poll_cb(); uint16_t* fb = TVFB + WinL + WinT * TVP / 2; eo_tick(); keybovl_update( input_state_cb, state.devices, fb, TVP / 2, state.transp, state.scaled, state.ms, 20 ); video_cb( (void*)fb, WinR - WinL, WinB - WinT, TVP ); }
void update_geometry() { struct retro_system_av_info av_info; retro_get_system_av_info(&av_info); environ_cb(RETRO_ENVIRONMENT_SET_GEOMETRY, &av_info); }
void retro_run (void) { struct LayoutData layout; bool updated = false; bool have_touch = false; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) { check_variables(false); struct retro_system_av_info new_av_info; retro_get_system_av_info(&new_av_info); environ_cb(RETRO_ENVIRONMENT_SET_GEOMETRY, &new_av_info); } poll_cb(); get_layout_params(current_layout, screen_buf, &layout); if(pointer_device != 0) { int16_t analogX = 0; int16_t analogY = 0; float final_acceleration = analog_stick_acceleration * (1.0 + (float)analog_stick_acceleration_modifier / 100.0); if(pointer_device == 1) { analogX = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration; analogY = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration; } else if(pointer_device == 2) { analogX = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / final_acceleration; analogY = input_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / final_acceleration; } else { analogX = 0; analogY = 0; } // Convert cartesian coordinate analog stick to polar coordinates double radius = sqrt(analogX * analogX + analogY * analogY); double angle = atan2(analogY, analogX); double max = (float)0x8000/analog_stick_acceleration; //log_cb(RETRO_LOG_DEBUG, "%d %d.\n", analogX,analogY); //log_cb(RETRO_LOG_DEBUG, "%d %d.\n", radius,analog_stick_deadzone); if (radius > (float)analog_stick_deadzone*max/100) { // Re-scale analog stick range to negate deadzone (makes slow movements possible) radius = (radius - (float)analog_stick_deadzone*max/100)*((float)max/(max - (float)analog_stick_deadzone*max/100)); // Convert back to cartesian coordinates analogX = (int32_t)round(radius * cos(angle)); analogY = (int32_t)round(radius * sin(angle)); } else { analogX = 0; analogY = 0; } //log_cb(RETRO_LOG_DEBUG, "%d %d.\n", GPU_LR_FRAMEBUFFER_NATIVE_WIDTH,GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT); //log_cb(RETRO_LOG_DEBUG, "%d %d.\n", analogX,analogY); have_touch = have_touch || input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R2); TouchX = Saturate(0, (GPU_LR_FRAMEBUFFER_NATIVE_WIDTH-1), TouchX + analogX); TouchY = Saturate(0, (GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT-1), TouchY + analogY); FramesWithPointer = (analogX || analogY) ? FramesWithPointerBase : FramesWithPointer; } if(mouse_enable) { // TOUCH: Mouse if(!touchEnabled) { const int16_t mouseX = input_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X); const int16_t mouseY = input_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y); have_touch = have_touch || input_cb(1, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT); TouchX = Saturate(0, (GPU_LR_FRAMEBUFFER_NATIVE_WIDTH-1), TouchX + mouseX); TouchY = Saturate(0, (GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT-1), TouchY + mouseY); FramesWithPointer = (mouseX || mouseY) ? FramesWithPointerBase : FramesWithPointer; } // TOUCH: Pointer else if(input_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_PRESSED)) { const float X_FACTOR = ((float)layout.width / 65536.0f); const float Y_FACTOR = ((float)layout.height / 65536.0f); float x = (input_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X) + 32768.0f) * X_FACTOR; float y = (input_cb(0, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y) + 32768.0f) * Y_FACTOR; if ((x >= layout.touch_x) && (x < layout.touch_x + GPU_LR_FRAMEBUFFER_NATIVE_WIDTH) && (y >= layout.touch_y) && (y < layout.touch_y + GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT)) { have_touch = true; TouchX = x - layout.touch_x; TouchY = y - layout.touch_y; } } } if(have_touch) NDS_setTouchPos(TouchX, TouchY, scale); else NDS_releaseTouch(); // BUTTONS //NDS_beginProcessingInput(); NDS_setPad( input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_Y), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_X), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L), input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R), 0, // debug input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L2) //Lid ); if (!microphone_force_enable) { if(input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L3)) NDS_setMic(true); else if(!input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L3)) NDS_setMic(false); } else NDS_setMic(true); if(input_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R3) && quick_switch_enable && delay_timer == 0) { switch (current_layout) { case LAYOUT_TOP_ONLY: current_layout = LAYOUT_BOTTOM_ONLY; break; case LAYOUT_BOTTOM_ONLY: current_layout = LAYOUT_TOP_ONLY; break; } delay_timer++; } if(delay_timer != 0) { delay_timer++; if(delay_timer == 30) delay_timer = 0; } NDS_endProcessingInput(); // RUN frameIndex ++; bool skipped = frameIndex <= frameSkip; if (skipped) NDS_SkipNextFrame(); NDS_exec(); SPU_Emulate_user(); if (!skipped) { u16 *screen = GPU->GetCustomFramebuffer(); if (layout.draw_screen1) SwapScreen (layout.dst, screen, layout.pitch); if (layout.draw_screen2) { screen = GPU->GetCustomFramebuffer() + GPU_LR_FRAMEBUFFER_NATIVE_WIDTH * GPU_LR_FRAMEBUFFER_NATIVE_HEIGHT; SwapScreen (layout.dst2, screen, layout.pitch); DrawPointer(layout.dst2, layout.pitch); } } video_cb(skipped ? 0 : screen_buf, layout.width, layout.height, layout.pitch * 2); frameIndex = skipped ? frameIndex : 0; }