mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-11-01 20:18:15 +01:00
As on a PSP: pressing HOME in a game shows "Do you want to quit the game?" over it. The game keeps running but gets no input while it's up (sceCtrl samples are blanked). Left/right picks Yes or No, the confirm button (our Confirmation button setting, or what compat forces) chooses, the other face button or HOME closes it, and Yes/No can be tapped. The volume keys change the game volume a step at a time, shown on the volume bar. Yes runs the game's registered exit callback first, like the PSP does, showing "Please wait..." meanwhile. Then, if the XMB launched the game, the XMB is booted again; otherwise it's back to the game browser, like Exit to menu. If the callback hasn't ended the game in 10 s, it's quit anyway. Not in the XMB itself, the PS1 emulator (its own HOME menu) or GE dumps. It lives in UI/ImposeHome.cpp; EmuScreen only feeds it input and frames and draws it over the PSP display. With a firmware dump installed, it's drawn with the firmware's own art from flash0:/kd/resource/impose.rsc, which is what impose.prx draws it from: prerendered text for each system language (the question, Yes/No normal and highlighted, Enter/Back, Please wait...), the button icons, the lines, the volume bar, the battery and the clock glyphs. The format is documented in ImposeHome.cpp. Without one, the same screen is drawn with our font and simple shapes at the same positions. Where impose.rsc doesn't say where things go, the layout follows impose_02g.prx (6.61), decrypted and disassembled: - The screen is filled with 0x9CE7 (#393939); the images are opaque. - Lines at (80, 96) and (80, 175); impose.prx grows them from the middle when it opens, which isn't done here. - Volume bar: the speaker at (28, 223), 30 steps from x 62, 12 apart. It shows our game volume in the PSP's 30 steps. - Button guide: the cross icon always left, the circle right, "Enter" and "Back" next to whichever confirms and cancels. - Status bar: the battery at (450, 5) (60% and up full, 30% two bars, 12% one, then empty), the clock ending next to it at y 5: "M/D H:MM", or "D/M" for the DD/MM/YYYY format, no leading zero on the month, day or hour, AM/PM for the 12-hour clock. The clock is the emulated PSP's local time (__RtcGetCurrentLocalTime, new), in the system's date and time formats. The battery is this device's, since the emulated PSP's is always full; a device without one shows it full. For that, Windows now reports -1 for SYSPROP_BATTERY_PERCENTAGE without a battery (was 100), as SDL already did; SDL polls the battery even when the status overlay doesn't show it, and the overlay leaves it out when there's none. Core side: __CtrlSetGameInputBlocked; __KernelCanExitToVSH and __KernelRequestExitToVSH to quit to the XMB from outside a syscall; and __KernelInvokeRegisteredExitCallback(toVSH), so a callback that returns without exiting ends in the XMB rather than powering down. New strings: "Do you want to quit the game?", "Please wait..." (Dialog). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NB244iFpvm14JH2FbwHXeQ
115 lines
4.4 KiB
C++
115 lines
4.4 KiB
C++
// Copyright (c) 2012- PPSSPP Project.
|
|
|
|
// This program 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 Foundation, version 2.0 or later versions.
|
|
|
|
// This program 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 2.0 for more details.
|
|
|
|
// A copy of the GPL 2.0 should have been included with the program.
|
|
// If not, see http://www.gnu.org/licenses/
|
|
|
|
// Official git repository and contact information can be found at
|
|
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
|
|
|
#pragma once
|
|
|
|
#include "Common/CommonTypes.h"
|
|
|
|
class PointerWrap;
|
|
|
|
void Register_sceCtrl();
|
|
|
|
const int CTRL_STICK_LEFT = 0;
|
|
// The actual PSP only has one, but HD remasters expose this, maybe also the emulator on the PSP/Vita.
|
|
const int CTRL_STICK_RIGHT = 1;
|
|
|
|
#define CTRL_SQUARE 0x8000
|
|
#define CTRL_TRIANGLE 0x1000
|
|
#define CTRL_CIRCLE 0x2000
|
|
#define CTRL_CROSS 0x4000
|
|
#define CTRL_UP 0x0010
|
|
#define CTRL_DOWN 0x0040
|
|
#define CTRL_LEFT 0x0080
|
|
#define CTRL_RIGHT 0x0020
|
|
#define CTRL_START 0x0008
|
|
#define CTRL_SELECT 0x0001
|
|
#define CTRL_LTRIGGER 0x0100
|
|
#define CTRL_RTRIGGER 0x0200
|
|
|
|
// System-ish buttons. Not generally used by games.
|
|
#define CTRL_HOME 0x00010000
|
|
#define CTRL_HOLD 0x00020000
|
|
#define CTRL_WLAN 0x00040000
|
|
#define CTRL_REMOTE_HOLD 0x00080000
|
|
#define CTRL_VOL_UP 0x00100000
|
|
#define CTRL_VOL_DOWN 0x00200000
|
|
#define CTRL_SCREEN 0x00400000
|
|
#define CTRL_NOTE 0x00800000
|
|
#define CTRL_DISC 0x01000000
|
|
#define CTRL_MEMSTICK 0x02000000
|
|
#define CTRL_FORWARD 0x10000000
|
|
#define CTRL_BACK 0x20000000
|
|
#define CTRL_PLAYPAUSE 0x40000000
|
|
|
|
// Obscure extra keys that were never mapped to hardware, but can be used to bring up the debug menu in SOTN, see issue #17464
|
|
#define CTRL_L3 0x0002
|
|
#define CTRL_R3 0x0004
|
|
#define CTRL_L2 0x0400
|
|
#define CTRL_R2 0x0800
|
|
|
|
#define CTRL_MASK_DPAD (CTRL_UP | CTRL_DOWN | CTRL_LEFT | CTRL_RIGHT)
|
|
#define CTRL_MASK_ACTION (CTRL_SQUARE | CTRL_TRIANGLE | CTRL_CIRCLE | CTRL_CROSS)
|
|
#define CTRL_MASK_TRIGGER (CTRL_LTRIGGER | CTRL_RTRIGGER)
|
|
#define CTRL_MASK_USER (CTRL_MASK_DPAD | CTRL_MASK_ACTION | CTRL_START | CTRL_SELECT | CTRL_MASK_TRIGGER | CTRL_HOME | CTRL_HOLD | CTRL_WLAN | CTRL_REMOTE_HOLD | CTRL_VOL_UP | CTRL_VOL_DOWN | CTRL_SCREEN | CTRL_NOTE | CTRL_L2 | CTRL_L3 | CTRL_R2 | CTRL_R3)
|
|
|
|
void __CtrlInit();
|
|
void __CtrlDoState(PointerWrap &p);
|
|
void __CtrlShutdown();
|
|
void __CtrlVblank();
|
|
|
|
// Clears and sets selected buttons. NOTE: Clearing happens first.
|
|
void __CtrlUpdateButtons(u32 bitsToSet, u32 bitsToClear);
|
|
// Presses buttons for a number of vblanks of emulated time; returns an id for __CtrlPressActive.
|
|
int __CtrlPressFor(u32 buttons, int vblanks);
|
|
bool __CtrlPressActive(int id);
|
|
|
|
// Call this to set the position of an analog stick, ideally when it changes.
|
|
// X and Y values should be from -1 to 1, inclusive, in a square (no need to force to a circle.)
|
|
// No deadzone filtering is done (but note that this applies to the actual PSP as well.)
|
|
void __CtrlSetAnalogXY(int stick, float x, float y);
|
|
void __CtrlSetAnalogX(int stick, float x);
|
|
void __CtrlSetAnalogY(int stick, float y);
|
|
|
|
// Call this to enable rapid-fire. This will cause buttons other than arrows to alternate.
|
|
void __CtrlSetRapidFire(bool state, int interval);
|
|
bool __CtrlGetRapidFire();
|
|
|
|
// For use by internal UI like MsgDialog
|
|
u32 __CtrlPeekButtons();
|
|
// While set, the game sees no buttons and centered sticks (a system overlay such as the HOME
|
|
// button's quit screen has the controls). __CtrlPeekButtons still returns the real state.
|
|
void __CtrlSetGameInputBlocked(bool blocked);
|
|
bool __CtrlIsGameInputBlocked();
|
|
|
|
// Exposed so sceVshBridge can reuse it directly for vshCtrlReadBufferPositive, matching JPCSP.
|
|
int sceCtrlReadBufferPositive(u32 ctrlDataPtr, u32 nBufs);
|
|
u32 __CtrlPeekButtonsVisual(); // also incorporates rapid-fire
|
|
void __CtrlPeekAnalog(int stick, float *x, float *y);
|
|
u32 __CtrlReadLatch();
|
|
|
|
void Register_sceCtrl_driver();
|
|
|
|
u16 sceCtrlGetRightVibration();
|
|
u16 sceCtrlGetLeftVibration();
|
|
|
|
namespace SceCtrl {
|
|
void SetLeftVibration(u16 lVibration);
|
|
void SetRightVibration(u16 rVibration);
|
|
void SetVibrationLeftDropout(u8 vibrationLDropout);
|
|
void SetVibrationRightDropout(u8 vibrationRDropout);
|
|
};
|