diff --git a/Common/KeyMap.cpp b/Common/KeyMap.cpp index 1b9ef81d4b..7ebe1676e4 100644 --- a/Common/KeyMap.cpp +++ b/Common/KeyMap.cpp @@ -74,6 +74,7 @@ static const DefMappingStruct defaultQwertyKeyboardKeyMap[] = { {VIRTKEY_UNTHROTTLE, NKCODE_TAB}, {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, {VIRTKEY_PAUSE , NKCODE_ESCAPE}, + {VIRTKEY_FRAME_ADVANCE, NKCODE_F}, {VIRTKEY_REWIND , NKCODE_DEL}, {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, }; @@ -103,6 +104,7 @@ static const DefMappingStruct defaultAzertyKeyboardKeyMap[] = { {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, {VIRTKEY_UNTHROTTLE, NKCODE_TAB}, {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, + {VIRTKEY_FRAME_ADVANCE, NKCODE_F}, {VIRTKEY_PAUSE , NKCODE_ESCAPE}, {VIRTKEY_REWIND , NKCODE_DEL}, {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, @@ -133,6 +135,7 @@ static const DefMappingStruct defaultQwertzKeyboardKeyMap[] = { {VIRTKEY_RAPID_FIRE, NKCODE_SHIFT_LEFT}, {VIRTKEY_UNTHROTTLE, NKCODE_TAB}, {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, + {VIRTKEY_FRAME_ADVANCE, NKCODE_F}, {VIRTKEY_PAUSE , NKCODE_ESCAPE}, {VIRTKEY_REWIND , NKCODE_DEL}, {VIRTKEY_ANALOG_LIGHTLY, NKCODE_SHIFT_RIGHT}, @@ -204,6 +207,7 @@ static const DefMappingStruct defaultBlackberryQWERTYKeyMap[] = { {VIRTKEY_UNTHROTTLE , NKCODE_TAB}, {VIRTKEY_SPEED_TOGGLE, NKCODE_GRAVE}, {VIRTKEY_PAUSE , NKCODE_ESCAPE}, + {VIRTKEY_FRAME_ADVANCE, NKCODE_F}, {VIRTKEY_REWIND , NKCODE_DEL}, }; @@ -218,34 +222,34 @@ static const DefMappingStruct defaultPadMap[] = { {CTRL_RIGHT , JOYSTICK_AXIS_HAT_X, +1}, {CTRL_UP , JOYSTICK_AXIS_HAT_Y, -1}, {CTRL_DOWN , JOYSTICK_AXIS_HAT_Y, +1}, - {CTRL_START , NKCODE_BUTTON_START}, + {CTRL_START , NKCODE_BUTTON_START}, {CTRL_SELECT , NKCODE_BUTTON_SELECT}, - {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, - {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, - {VIRTKEY_UNTHROTTLE , NKCODE_BUTTON_R2}, + {CTRL_LTRIGGER , NKCODE_BUTTON_L1}, + {CTRL_RTRIGGER , NKCODE_BUTTON_R1}, + {VIRTKEY_UNTHROTTLE , NKCODE_BUTTON_R2}, {VIRTKEY_PAUSE , NKCODE_BUTTON_THUMBR}, - {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_L2}, - {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, - {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, - {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, - {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, + {VIRTKEY_SPEED_TOGGLE, NKCODE_BUTTON_L2}, + {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, + {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, + {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, + {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, #else - {CTRL_CROSS , NKCODE_BUTTON_2}, - {CTRL_CIRCLE , NKCODE_BUTTON_3}, - {CTRL_SQUARE , NKCODE_BUTTON_4}, - {CTRL_TRIANGLE , NKCODE_BUTTON_1}, + {CTRL_CROSS , NKCODE_BUTTON_2}, + {CTRL_CIRCLE , NKCODE_BUTTON_3}, + {CTRL_SQUARE , NKCODE_BUTTON_4}, + {CTRL_TRIANGLE , NKCODE_BUTTON_1}, {CTRL_UP , NKCODE_DPAD_UP}, {CTRL_RIGHT , NKCODE_DPAD_RIGHT}, {CTRL_DOWN , NKCODE_DPAD_DOWN}, {CTRL_LEFT , NKCODE_DPAD_LEFT}, {CTRL_START , NKCODE_BUTTON_10}, - {CTRL_SELECT , NKCODE_BUTTON_9}, - {CTRL_LTRIGGER , NKCODE_BUTTON_7}, - {CTRL_RTRIGGER , NKCODE_BUTTON_8}, - {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, - {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, - {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, - {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, + {CTRL_SELECT , NKCODE_BUTTON_9}, + {CTRL_LTRIGGER , NKCODE_BUTTON_7}, + {CTRL_RTRIGGER , NKCODE_BUTTON_8}, + {VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1}, + {VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1}, + {VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1}, + {VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1}, #endif }; @@ -583,7 +587,7 @@ const KeyMap_IntStrPair key_names[] = { {NKCODE_NUMPAD_7, "Num7"}, {NKCODE_NUMPAD_8, "Num8"}, {NKCODE_NUMPAD_9, "Num9"}, - + {NKCODE_LANGUAGE_SWITCH, "Language"}, {NKCODE_MANNER_MODE, "Manner"}, {NKCODE_3D_MODE, "3D Mode"}, @@ -607,7 +611,7 @@ const KeyMap_IntStrPair key_names[] = { {NKCODE_EXT_MOUSEWHEEL_UP, "MWheelU"}, {NKCODE_EXT_MOUSEWHEEL_DOWN, "MWheelD"}, - {NKCODE_START_QUESTION, "¿"}, + {NKCODE_START_QUESTION, "¿"}, {NKCODE_LEFTBRACE, "{"}, {NKCODE_RIGHTBRACE, "}"}, }; @@ -672,6 +676,7 @@ const KeyMap_IntStrPair psp_button_names[] = { {VIRTKEY_UNTHROTTLE, "Unthrottle"}, {VIRTKEY_SPEED_TOGGLE, "SpeedToggle"}, {VIRTKEY_PAUSE, "Pause"}, + {VIRTKEY_FRAME_ADVANCE, "Frame Advance"}, #ifndef MOBILE_DEVICE {VIRTKEY_REWIND, "Rewind"}, #endif @@ -980,6 +985,7 @@ void AutoConfForPad(const std::string &name) { // Add a couple of convenient keyboard mappings by default, too. g_controllerMap[VIRTKEY_PAUSE].push_back(KeyDef(DEVICE_ID_KEYBOARD, NKCODE_ESCAPE)); g_controllerMap[VIRTKEY_UNTHROTTLE].push_back(KeyDef(DEVICE_ID_KEYBOARD, NKCODE_TAB)); + g_controllerMap[VIRTKEY_FRAME_ADVANCE].push_back(KeyDef(DEVICE_ID_KEYBOARD, NKCODE_F)); #endif } diff --git a/Common/KeyMap.h b/Common/KeyMap.h index 6adcd03b36..4f21dfcb3e 100644 --- a/Common/KeyMap.h +++ b/Common/KeyMap.h @@ -50,6 +50,7 @@ enum { VIRTKEY_ANALOG_LIGHTLY = 0x10011, VIRTKEY_AXIS_SWAP = 0x10012, VIRTKEY_DEVMENU = 0x10013, + VIRTKEY_FRAME_ADVANCE = 0x10014, VIRTKEY_LAST, VIRTKEY_COUNT = VIRTKEY_LAST - VIRTKEY_FIRST }; diff --git a/Core/HLE/sceCtrl.cpp b/Core/HLE/sceCtrl.cpp index 298ada31a7..95d41e9e8c 100644 --- a/Core/HLE/sceCtrl.cpp +++ b/Core/HLE/sceCtrl.cpp @@ -102,7 +102,7 @@ const u32 CTRL_EMU_RAPIDFIRE_MASK = CTRL_UP | CTRL_DOWN | CTRL_LEFT | CTRL_RIGHT static void __CtrlUpdateLatch() { lock_guard guard(ctrlMutex); - + // Copy in the current data to the current buffer. ctrlBufs[ctrlBuf] = ctrlCurrent; u32 buttons = ctrlCurrent.buttons; @@ -119,7 +119,7 @@ static void __CtrlUpdateLatch() latch.btnRelease |= ~buttons; dialogBtnMake |= buttons & changed; ctrlLatchBufs++; - + ctrlOldButtons = buttons; ctrlBufs[ctrlBuf].frame = (u32) CoreTiming::GetGlobalTimeUs(); @@ -327,7 +327,7 @@ void __CtrlInit() void __CtrlDoState(PointerWrap &p) { lock_guard guard(ctrlMutex); - + auto s = p.Section("sceCtrl", 1, 3); if (!s) return; @@ -519,7 +519,7 @@ static u32 sceCtrlReadLatch(u32 latchDataPtr) return __CtrlResetLatch(); } -static const HLEFunction sceCtrl[] = +static const HLEFunction sceCtrl[] = { {0X3E65A0EA, nullptr, "sceCtrlInit", '?', "" }, //(int unknown), init with 0 {0X1F4011E6, &WrapU_U, "sceCtrlSetSamplingMode", 'x', "x" }, @@ -538,7 +538,7 @@ static const HLEFunction sceCtrl[] = {0X6841BE1A, nullptr, "sceCtrlSetRapidFire", '?', "" }, {0XA7144800, &WrapI_II, "sceCtrlSetIdleCancelThreshold", 'i', "ii"}, {0X687660FA, &WrapI_UU, "sceCtrlGetIdleCancelThreshold", 'i', "xx"}, -}; +}; void Register_sceCtrl() { diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 3e2bcc1a2b..7abfbaae24 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -70,10 +70,22 @@ #include "Windows/MainWindow.h" #endif +bool frameStep_; + +static void __EmuScreenVblank() +{ + if (frameStep_) + { + frameStep_ = false; + Core_EnableStepping(true); + } +} + EmuScreen::EmuScreen(const std::string &filename) : bootPending_(true), gamePath_(filename), invalid_(true), quit_(false), pauseTrigger_(false), saveStatePreviewShownTime_(0.0), saveStatePreview_(nullptr) { memset(axisState_, 0, sizeof(axisState_)); saveStateSlot_ = SaveState::GetCurrentSlot(); + __DisplayListenVblank(__EmuScreenVblank); } void EmuScreen::bootGame(const std::string &filename) { @@ -174,7 +186,7 @@ void EmuScreen::bootComplete() { NOTICE_LOG(BOOT, "Loading %s...", PSP_CoreParameter().fileToStart.c_str()); autoLoad(); - I18NCategory *sc = GetI18NCategory("Screen"); + I18NCategory *sc = GetI18NCategory("Screen"); #ifndef MOBILE_DEVICE if (g_Config.bFirstRun) { @@ -341,7 +353,7 @@ bool EmuScreen::touch(const TouchInput &touch) { } void EmuScreen::onVKeyDown(int virtualKeyCode) { - I18NCategory *sc = GetI18NCategory("Screen"); + I18NCategory *sc = GetI18NCategory("Screen"); switch (virtualKeyCode) { case VIRTKEY_UNTHROTTLE: @@ -363,6 +375,19 @@ void EmuScreen::onVKeyDown(int virtualKeyCode) { pauseTrigger_ = true; break; + case VIRTKEY_FRAME_ADVANCE: + // If game is running, pause emulation immediately. Otherwise, advance a single frame. + if (Core_IsStepping()) + { + frameStep_ = true; + Core_EnableStepping(false); + } + else if (!frameStep_) + { + Core_EnableStepping(true); + } + break; + case VIRTKEY_AXIS_SWAP: KeyMap::SwapAxis(); break; @@ -778,7 +803,7 @@ void EmuScreen::update(InputState &input) { } float delta_y = tiltInputCurve(normalized_input_y * 2.0 * (g_Config.iTiltSensitivityY)) ; - + if (g_Config.bInvertTiltY) { delta_y *= -1; } @@ -787,7 +812,7 @@ void EmuScreen::update(InputState &input) { leftstick_x += clamp1(delta_x); __CtrlSetAnalogX(clamp1(leftstick_x), CTRL_STICK_LEFT); - + leftstick_y += clamp1(delta_y); __CtrlSetAnalogY(clamp1(leftstick_y), CTRL_STICK_LEFT); }