aboutsummaryrefslogtreecommitdiff
path: root/backends/platform/psp/osys_psp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/platform/psp/osys_psp.cpp')
-rw-r--r--backends/platform/psp/osys_psp.cpp257
1 files changed, 25 insertions, 232 deletions
diff --git a/backends/platform/psp/osys_psp.cpp b/backends/platform/psp/osys_psp.cpp
index e94d34d223..516da904a3 100644
--- a/backends/platform/psp/osys_psp.cpp
+++ b/backends/platform/psp/osys_psp.cpp
@@ -42,6 +42,8 @@
#include "graphics/surface.h"
#include "sound/mixer_intern.h"
+#include "backends/platform/psp/pspkeyboard.h"
+
#define SAMPLES_PER_SEC 44100
@@ -59,33 +61,8 @@ unsigned int __attribute__((aligned(16))) displayList[2048];
unsigned short __attribute__((aligned(16))) clut256[256];
unsigned short __attribute__((aligned(16))) mouseClut[256];
unsigned short __attribute__((aligned(16))) cursorPalette[256];
-unsigned short __attribute__((aligned(16))) kbClut[256];
unsigned int __attribute__((aligned(16))) mouseBuf256[MOUSE_SIZE*MOUSE_SIZE];
-extern unsigned int size_keyboard_symbols_compressed;
-extern unsigned char keyboard_symbols_compressed[];
-extern unsigned int size_keyboard_symbols_shift_compressed;
-extern unsigned char keyboard_symbols_shift_compressed[];
-extern unsigned int size_keyboard_letters_compressed;
-extern unsigned char keyboard_letters_compressed[];
-extern unsigned int size_keyboard_letters_shift_compressed;
-extern unsigned char keyboard_letters_shift_compressed[];
-unsigned char *keyboard_symbols;
-unsigned char *keyboard_symbols_shift;
-unsigned char *keyboard_letters;
-unsigned char *keyboard_letters_shift;
-
-unsigned char kbd_ascii[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '[', ']', '\\', ';', '\'', ',', '.', '/', '`'};
-Common::KeyCode kbd_code[] = {Common::KEYCODE_1, Common::KEYCODE_2, Common::KEYCODE_3, Common::KEYCODE_4, Common::KEYCODE_5, Common::KEYCODE_6, Common::KEYCODE_7, Common::KEYCODE_8, Common::KEYCODE_9, Common::KEYCODE_0, Common::KEYCODE_MINUS, Common::KEYCODE_EQUALS, Common::KEYCODE_LEFTBRACKET, Common::KEYCODE_RIGHTBRACKET,
- Common::KEYCODE_BACKSLASH, Common::KEYCODE_SEMICOLON, Common::KEYCODE_QUOTE, Common::KEYCODE_COMMA, Common::KEYCODE_PERIOD, Common::KEYCODE_SLASH, Common::KEYCODE_BACKQUOTE};
-unsigned char kbd_ascii_cl[] = {'!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '{', '}', '|', ':', '"', '<', '>', '?', '~'};
-Common::KeyCode kbd_code_cl[] = {Common::KEYCODE_EXCLAIM, Common::KEYCODE_AT, Common::KEYCODE_HASH, Common::KEYCODE_DOLLAR, (Common::KeyCode)37, Common::KEYCODE_CARET, Common::KEYCODE_AMPERSAND, Common::KEYCODE_ASTERISK, Common::KEYCODE_LEFTPAREN, Common::KEYCODE_RIGHTPAREN, Common::KEYCODE_UNDERSCORE,
- Common::KEYCODE_PLUS, (Common::KeyCode)123, (Common::KeyCode)125, (Common::KeyCode)124, Common::KEYCODE_COLON, Common::KEYCODE_QUOTEDBL, Common::KEYCODE_LESS, Common::KEYCODE_GREATER, Common::KEYCODE_QUESTION, (Common::KeyCode)126};
-#define CAPS_LOCK (1 << 0)
-#define SYMBOLS (1 << 1)
-
-
-
unsigned long RGBToColour(unsigned long r, unsigned long g, unsigned long b) {
return (((b >> 3) << 10) | ((g >> 3) << 5) | ((r >> 3) << 0)) | 0x8000;
@@ -107,8 +84,8 @@ const OSystem::GraphicsMode OSystem_PSP::s_supportedGraphicsModes[] = {
OSystem_PSP::OSystem_PSP() : _screenWidth(0), _screenHeight(0), _overlayWidth(0), _overlayHeight(0),
- _offscreen(0), _overlayBuffer(0), _overlayVisible(false), _shakePos(0), _lastScreenUpdate(0), _mouseBuf(0), _prevButtons(0), _lastPadCheck(0), _padAccel(0), _mixer(0) {
-
+ _offscreen(0), _overlayBuffer(0), _overlayVisible(false), _shakePos(0), _lastScreenUpdate(0),
+ _mouseBuf(0), _prevButtons(0), _lastPadCheck(0), _padAccel(0), _mixer(0) {
memset(_palette, 0, sizeof(_palette));
_cursorPaletteDisabled = true;
@@ -119,38 +96,12 @@ OSystem_PSP::OSystem_PSP() : _screenWidth(0), _screenHeight(0), _overlayWidth(0)
uint32 sdlFlags = SDL_INIT_AUDIO | SDL_INIT_TIMER;
SDL_Init(sdlFlags);
-
- //decompress keyboard data
- uLongf kbdSize = KBD_DATA_SIZE;
- keyboard_letters = (unsigned char *)memalign(16, KBD_DATA_SIZE);
- if (Z_OK != uncompress((Bytef *)keyboard_letters, &kbdSize, (const Bytef *)keyboard_letters_compressed, size_keyboard_letters_compressed))
- error("OSystem_PSP: uncompressing keyboard_letters failed");
-
- kbdSize = KBD_DATA_SIZE;
- keyboard_letters_shift = (unsigned char *)memalign(16, KBD_DATA_SIZE);
- if (Z_OK != uncompress((Bytef *)keyboard_letters_shift, &kbdSize, (const Bytef *)keyboard_letters_shift_compressed, size_keyboard_letters_shift_compressed))
- error("OSystem_PSP: uncompressing keyboard_letters_shift failed");
-
- kbdSize = KBD_DATA_SIZE;
- keyboard_symbols = (unsigned char *)memalign(16, KBD_DATA_SIZE);
- if (Z_OK != uncompress((Bytef *)keyboard_symbols, &kbdSize, (const Bytef *)keyboard_symbols_compressed, size_keyboard_symbols_compressed))
- error("OSystem_PSP: uncompressing keyboard_symbols failed");
-
- kbdSize = KBD_DATA_SIZE;
- keyboard_symbols_shift = (unsigned char *)memalign(16, KBD_DATA_SIZE);
- if (Z_OK != uncompress((Bytef *)keyboard_symbols_shift, &kbdSize, (const Bytef *)keyboard_symbols_shift_compressed, size_keyboard_symbols_shift_compressed))
- error("OSystem_PSP: uncompressing keyboard_symbols_shift failed");
-
- _keyboardVisible = false;
- _clut = clut256; // Mustn't use uncached as it'll cause cache coherency issues
- _kbdClut = (unsigned short *)(((unsigned int)kbClut) | 0x40000000);
+ _clut = clut256;
_mouseBuf = (byte *)mouseBuf256;
_graphicMode = STRETCHED_480X272;
- _keySelected = 1;
- _keyboardMode = 0;
- _mouseX = PSP_SCREEN_WIDTH >> 1;
- _mouseY = PSP_SCREEN_HEIGHT >> 1;
+ _mouseX = PSP_SCREEN_WIDTH >> 1; // Mouse in the middle of the screen
+ _mouseY = PSP_SCREEN_HEIGHT >> 1;
// Init GU
@@ -176,14 +127,11 @@ OSystem_PSP::OSystem_PSP() : _screenWidth(0), _screenHeight(0), _overlayWidth(0)
}
OSystem_PSP::~OSystem_PSP() {
- free(keyboard_symbols_shift);
- free(keyboard_symbols);
- free(keyboard_letters_shift);
- free(keyboard_letters);
free(_offscreen);
free(_overlayBuffer);
free(_mouseBuf);
+ delete _keyboard;
_offscreen = 0;
_overlayBuffer = 0;
@@ -196,6 +144,10 @@ void OSystem_PSP::initBackend() {
_savefile = new PSPSaveFileManager;
_timer = new DefaultTimerManager();
+
+ _keyboard = new PSPKeyboard();
+ _keyboard->load();
+
setTimerCallback(&timer_handler, 10);
setupMixer();
@@ -267,12 +219,6 @@ void OSystem_PSP::initSize(uint width, uint height, const Graphics::PixelFormat
clearOverlay();
memset(_palette, 0xFFFF, 256 * sizeof(unsigned short));
- _kbdClut[0] = 0xFFFF;
- _kbdClut[246] = 0x4CCC;
- _kbdClut[247] = 0x0000;
-
- for (int i = 1; i < 31; i++)
- _kbdClut[i] = 0xF888;
_mouseVisible = false;
sceKernelDcacheWritebackAll();
@@ -605,42 +551,8 @@ void OSystem_PSP::updateScreen() {
sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertMouse);
}
- if (_keyboardVisible) {
- sceGuTexMode(GU_PSM_T8, 0, 0, 0); // 8-bit image
- sceGuClutMode(GU_PSM_4444, 0, 0xFF, 0);
- sceGuClutLoad(32, kbClut); // upload 32*8 entries (256)
- sceGuDisable(GU_ALPHA_TEST);
- sceGuEnable(GU_BLEND);
- sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0);
- switch (_keyboardMode) {
- case 0:
- sceGuTexImage(0, 512, 512, 480, keyboard_letters);
- break;
- case CAPS_LOCK:
- sceGuTexImage(0, 512, 512, 480, keyboard_letters_shift);
- break;
- case SYMBOLS:
- sceGuTexImage(0, 512, 512, 480, keyboard_symbols);
- break;
- case (CAPS_LOCK | SYMBOLS):
- sceGuTexImage(0, 512, 512, 480, keyboard_symbols_shift);
- break;
- }
- sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGBA);
-
- Vertex *vertKB = (Vertex *)sceGuGetMemory(2 * sizeof(Vertex));
- vertKB[0].u = 0.5f;
- vertKB[0].v = 0.5f;
- vertKB[1].u = PSP_SCREEN_WIDTH - 0.5f;
- vertKB[1].v = PSP_SCREEN_HEIGHT - 0.5f;
- vertKB[0].x = 0;
- vertKB[0].y = 0;
- vertKB[0].z = 0;
- vertKB[1].x = PSP_SCREEN_WIDTH;
- vertKB[1].y = PSP_SCREEN_HEIGHT;
- vertKB[1].z = 0;
- sceGuDrawArray(GU_SPRITES, GU_TEXTURE_32BITF|GU_VERTEX_32BITF|GU_TRANSFORM_2D, 2, 0, vertKB);
- sceGuDisable(GU_BLEND);
+ if (_keyboard->isVisible()) {
+ _keyboard->render();
}
sceGuFinish();
@@ -667,7 +579,6 @@ void OSystem_PSP::clearOverlay() {
PSPDebugTrace("clearOverlay\n");
bzero(_overlayBuffer, _overlayWidth * _overlayHeight * sizeof(OverlayColor));
-
sceKernelDcacheWritebackAll();
}
@@ -774,7 +685,7 @@ void OSystem_PSP::setMouseCursor(const byte *buf, uint w, uint h, int hotspotX,
for (unsigned int i = 0; i < h; i++)
memcpy(_mouseBuf + i * MOUSE_SIZE, buf + i * w, w);
-
+
sceKernelDcacheWritebackAll();
}
@@ -784,13 +695,18 @@ void OSystem_PSP::setMouseCursor(const byte *buf, uint w, uint h, int hotspotX,
bool OSystem_PSP::processInput(Common::Event &event) {
s8 analogStepAmountX = 0;
s8 analogStepAmountY = 0;
-/*
- SceCtrlData pad;
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(1);
sceCtrlReadBufferPositive(&pad, 1);
-*/
+
+ bool usedInput, haveEvent;
+
+ haveEvent = _keyboard->processInput(event, pad, usedInput);
+
+ if (usedInput) // Check if the keyboard used up the input
+ return haveEvent;
+
uint32 buttonsChanged = pad.Buttons ^ _prevButtons;
if (buttonsChanged & (PSP_CTRL_CROSS | PSP_CTRL_CIRCLE | PSP_CTRL_LTRIGGER | PSP_CTRL_RTRIGGER | PSP_CTRL_START | PSP_CTRL_SELECT | PSP_CTRL_SQUARE | PSP_CTRL_TRIANGLE)) {
@@ -924,8 +840,6 @@ bool OSystem_PSP::processInput(Common::Event &event) {
}
bool OSystem_PSP::pollEvent(Common::Event &event) {
- float nub_angle = -1;
- int x, y;
// If we're polling for events, we should check for pausing the engine
// Pausing the engine is a necessary fix for games that use the timer for music synchronization
@@ -933,130 +847,9 @@ bool OSystem_PSP::pollEvent(Common::Event &event) {
// get it right now.
PowerMan.pollPauseEngine();
+
+ return processInput(event);
- sceCtrlSetSamplingCycle(0);
- sceCtrlSetSamplingMode(1);
- sceCtrlReadBufferPositive(&pad, 1);
-
- uint32 buttonsChanged = pad.Buttons ^ _prevButtons;
-
- if ((buttonsChanged & PSP_CTRL_SELECT) || (pad.Buttons & PSP_CTRL_SELECT)) {
- if ( !(pad.Buttons & PSP_CTRL_SELECT) )
- _keyboardVisible = !_keyboardVisible;
- _prevButtons = pad.Buttons;
- return false;
- }
-
- if (!_keyboardVisible)
- return processInput(event);
-
- if ( (buttonsChanged & PSP_CTRL_RTRIGGER) && !(pad.Buttons & PSP_CTRL_RTRIGGER))
- _keyboardMode ^= CAPS_LOCK;
-
- if ( (buttonsChanged & PSP_CTRL_LTRIGGER) && !(pad.Buttons & PSP_CTRL_LTRIGGER))
- _keyboardMode ^= SYMBOLS;
-
- if ( (buttonsChanged & PSP_CTRL_LEFT) && !(pad.Buttons & PSP_CTRL_LEFT)) {
- event.kbd.flags = 0;
- event.kbd.ascii = 0;
- event.kbd.keycode = Common::KEYCODE_LEFT;
- _prevButtons = pad.Buttons;
- return true;
- }
-
- if ( (buttonsChanged & PSP_CTRL_RIGHT) && !(pad.Buttons & PSP_CTRL_RIGHT)) {
- event.kbd.flags = 0;
- event.kbd.ascii = 0;
- event.kbd.keycode = Common::KEYCODE_RIGHT;
- _prevButtons = pad.Buttons;
- return true;
- }
-
- if ( (buttonsChanged & PSP_CTRL_UP) && !(pad.Buttons & PSP_CTRL_UP)) {
- event.kbd.flags = 0;
- event.kbd.ascii = 0;
- event.kbd.keycode = Common::KEYCODE_UP;
- _prevButtons = pad.Buttons;
- return true;
- }
-
- if ( (buttonsChanged & PSP_CTRL_DOWN) && !(pad.Buttons & PSP_CTRL_DOWN)) {
- event.kbd.flags = 0;
- event.kbd.ascii = 0;
- event.kbd.keycode = Common::KEYCODE_DOWN;
- _prevButtons = pad.Buttons;
- return true;
- }
-
- // compute nub direction
- x = pad.Lx-128;
- y = pad.Ly-128;
- _kbdClut[_keySelected] = 0xf888;
- if (x*x + y*y > 10000) {
- nub_angle = atan2(y, x);
- _keySelected = (int)(1 + (M_PI + nub_angle) * 30 / (2 * M_PI));
- _keySelected -= 2;
- if (_keySelected < 1)
- _keySelected += 30;
- _kbdClut[_keySelected] = 0xFFFF;
-
- if (buttonsChanged & PSP_CTRL_CROSS) {
- event.type = (pad.Buttons & PSP_CTRL_CROSS) ? Common::EVENT_KEYDOWN : Common::EVENT_KEYUP;
- if (_keySelected > 26) {
- event.kbd.flags = 0;
- switch (_keySelected) {
- case 27:
- event.kbd.ascii = ' ';
- event.kbd.keycode = Common::KEYCODE_SPACE;
- break;
- case 28:
- event.kbd.ascii = 127;
- event.kbd.keycode = Common::KEYCODE_DELETE;
- break;
- case 29:
- event.kbd.ascii = 8;
- event.kbd.keycode = Common::KEYCODE_BACKSPACE;
- break;
- case 30:
- event.kbd.ascii = 13;
- event.kbd.keycode = Common::KEYCODE_RETURN;
- break;
- }
- } else {
- switch ( _keyboardMode) {
- case 0:
- event.kbd.flags = 0;
- event.kbd.ascii = 'a'+_keySelected-1;
- event.kbd.keycode = (Common::KeyCode)(Common::KEYCODE_a + _keySelected-1);
- break;
- case CAPS_LOCK:
- event.kbd.ascii = 'A'+_keySelected-1;
- event.kbd.keycode = (Common::KeyCode)(Common::KEYCODE_a + _keySelected-1);
- event.kbd.flags = Common::KBD_SHIFT;
- break;
- case SYMBOLS:
- if (_keySelected < 21) {
- event.kbd.flags = 0;
- event.kbd.ascii = kbd_ascii[_keySelected-1];
- event.kbd.keycode = kbd_code[ _keySelected-1];
- }
- break;
- case (SYMBOLS|CAPS_LOCK):
- if (_keySelected < 21) {
- event.kbd.flags = 0;
- event.kbd.ascii = kbd_ascii_cl[_keySelected-1];
- event.kbd.keycode = kbd_code_cl[ _keySelected-1];
- }
- break;
- }
- }
- _prevButtons = pad.Buttons;
- return true;
- }
- }
-
- _prevButtons = pad.Buttons;
- return false;
}