diff options
Diffstat (limited to 'backends')
116 files changed, 3007 insertions, 3802 deletions
diff --git a/backends/events/sdl/sdl-events.cpp b/backends/events/sdl/sdl-events.cpp index 96def04e25..df9efe54b1 100644 --- a/backends/events/sdl/sdl-events.cpp +++ b/backends/events/sdl/sdl-events.cpp @@ -213,6 +213,7 @@ bool SdlEventManager::pollSdlEvent(Common::Event &event) { } SDL_Event ev; + ev.type = SDL_NOEVENT; while (SDL_PollEvent(&ev)) { preprocessEvents(&ev); if (dispatchSDLEvent(ev, event)) diff --git a/backends/events/symbiansdl/symbiansdl-events.cpp b/backends/events/symbiansdl/symbiansdl-events.cpp index af57e81ccc..2d144f9ad9 100644 --- a/backends/events/symbiansdl/symbiansdl-events.cpp +++ b/backends/events/symbiansdl/symbiansdl-events.cpp @@ -28,6 +28,7 @@ #include "backends/events/symbiansdl/symbiansdl-events.h" #include "backends/platform/symbian/src/SymbianActions.h" #include "gui/message.h" +#include "common/translation.h" #include <bautils.h> @@ -183,7 +184,7 @@ bool SymbianSdlEventManager::remapKey(SDL_Event &ev, Common::Event &event) { case GUI::ACTION_QUIT: { - GUI::MessageDialog alert("Do you want to quit ?", "Yes", "No"); + GUI::MessageDialog alert(_("Do you want to quit ?"), _("Yes"), _("No")); if (alert.runModal() == GUI::kMessageOK) g_system->quit(); diff --git a/backends/fs/amigaos4/amigaos4-fs.cpp b/backends/fs/amigaos4/amigaos4-fs.cpp index fe6164cb0c..8a57a3cf1c 100644 --- a/backends/fs/amigaos4/amigaos4-fs.cpp +++ b/backends/fs/amigaos4/amigaos4-fs.cpp @@ -368,7 +368,7 @@ bool AmigaOSFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, b } if (ERROR_NO_MORE_ENTRIES != IDOS->IoErr() ) { - debug(6, "An error occured during ExamineDir"); + debug(6, "An error occurred during ExamineDir"); ret = false; } else { ret = true; diff --git a/backends/fs/ds/ds-fs-factory.cpp b/backends/fs/ds/ds-fs-factory.cpp index 0dfa70b716..4919c04174 100644 --- a/backends/fs/ds/ds-fs-factory.cpp +++ b/backends/fs/ds/ds-fs-factory.cpp @@ -27,7 +27,7 @@ #include "backends/fs/ds/ds-fs.h" #include "dsmain.h" //for the isGBAMPAvailable() function -DECLARE_SINGLETON(DSFilesystemFactory); +DECLARE_SINGLETON(DSFilesystemFactory) AbstractFSNode *DSFilesystemFactory::makeRootFileNode() const { if (DS::isGBAMPAvailable()) { diff --git a/backends/fs/ds/ds-fs.cpp b/backends/fs/ds/ds-fs.cpp index 6fc2894925..675084ff56 100644 --- a/backends/fs/ds/ds-fs.cpp +++ b/backends/fs/ds/ds-fs.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -115,7 +118,7 @@ DSFileSystemNode::DSFileSystemNode(const Common::String& path, bool isDir) { // consolePrintf("Found: %d, Dir: %d\n", _isValid, _isDirectory); } -DSFileSystemNode::DSFileSystemNode(const DSFileSystemNode* node) { +DSFileSystemNode::DSFileSystemNode(const DSFileSystemNode *node) { //TODO: not implemented? } @@ -144,7 +147,7 @@ bool DSFileSystemNode::getChildren(AbstractFSList &dirList, ListMode mode, bool _zipFile->changeToRoot(); /* // This is the root dir, so add the RAM folder - DSFileSystemNode* dsfsn = new DSFileSystemNode("ds:/ram"); + DSFileSystemNode *dsfsn = new DSFileSystemNode("ds:/ram"); dsfsn->_isDirectory = true; dirList->push_back(wrap(dsfsn)); */ @@ -162,7 +165,7 @@ bool DSFileSystemNode::getChildren(AbstractFSList &dirList, ListMode mode, bool if ( (_zipFile->isDirectory() && ((mode == Common::FSNode::kListDirectoriesOnly) || (mode == Common::FSNode::kListAll)) ) || (!_zipFile->isDirectory() && ((mode == Common::FSNode::kListFilesOnly) || (mode == Common::FSNode::kListAll)) ) ) { - DSFileSystemNode* dsfsn = new DSFileSystemNode("ds:/" + Common::String(n), _zipFile->isDirectory()); + DSFileSystemNode *dsfsn = new DSFileSystemNode("ds:/" + Common::String(n), _zipFile->isDirectory()); dsfsn->_isDirectory = _zipFile->isDirectory(); dirList.push_back((dsfsn)); } @@ -173,15 +176,15 @@ bool DSFileSystemNode::getChildren(AbstractFSList &dirList, ListMode mode, bool return true; } -AbstractFSNode* DSFileSystemNode::getParent() const { +AbstractFSNode *DSFileSystemNode::getParent() const { // consolePrintf("parent\n"); DSFileSystemNode *p; if (_path != "ds:/") { - char *path = (char *) _path.c_str(); + const char *path = (const char *)_path.c_str(); int lastSlash = 4; - for (int r = 4; r < (int) _path.size(); r++) { + for (uint r = 4; r < _path.size(); r++) { if (path[r] == '\\') { lastSlash = r; } @@ -259,7 +262,7 @@ GBAMPFileSystemNode::GBAMPFileSystemNode(const Common::String& path) { _path = path; } -GBAMPFileSystemNode::GBAMPFileSystemNode(const Common::String& path, bool isDirectory) { +GBAMPFileSystemNode::GBAMPFileSystemNode(const Common::String& path, bool isDir) { //consolePrintf("'%s'",path.c_str()); int lastSlash = 3; @@ -272,11 +275,11 @@ GBAMPFileSystemNode::GBAMPFileSystemNode(const Common::String& path, bool isDire _displayName = Common::String(path.c_str() + lastSlash + 1); _path = path; _isValid = true; - _isDirectory = isDirectory; + _isDirectory = isDir; } -GBAMPFileSystemNode::GBAMPFileSystemNode(const GBAMPFileSystemNode* node) { +GBAMPFileSystemNode::GBAMPFileSystemNode(const GBAMPFileSystemNode *node) { //TODO: not implemented? } @@ -319,7 +322,7 @@ bool GBAMPFileSystemNode::getChildren(AbstractFSList& dirList, ListMode mode, bo if ( ((entryType == TYPE_DIR) && ((mode == Common::FSNode::kListDirectoriesOnly) || (mode == Common::FSNode::kListAll))) || ((entryType == TYPE_FILE) && ((mode == Common::FSNode::kListFilesOnly) || (mode == Common::FSNode::kListAll))) ) { - GBAMPFileSystemNode* dsfsn; + GBAMPFileSystemNode *dsfsn; //consolePrintf("Fname: %s\n", fname); @@ -348,15 +351,15 @@ bool GBAMPFileSystemNode::getChildren(AbstractFSList& dirList, ListMode mode, bo return true; } -AbstractFSNode* GBAMPFileSystemNode::getParent() const { +AbstractFSNode *GBAMPFileSystemNode::getParent() const { // consolePrintf("parent\n"); GBAMPFileSystemNode *p; if (_path != "mp:/") { - char *path = (char *) _path.c_str(); + const char *path = (const char *)_path.c_str(); int lastSlash = 4; - for (int r = 4; r < (int) strlen((char *) path); r++) { + for (uint r = 4; r < strlen(path); r++) { if (path[r] == '/') { lastSlash = r; } @@ -413,18 +416,12 @@ bool DSFileStream::eos() const { } int32 DSFileStream::pos() const { - if (_writeBufferPos > 0) { - // Discard constness. Bad, but I can't see another way. - ((DSFileStream *) (this))->flush(); - } + assert(_writeBufferPos == 0); // This method may only be called when reading! return std_ftell((FILE *)_handle); } int32 DSFileStream::size() const { - if (_writeBufferPos > 0) { - // Discard constness. Bad, but I can't see another way. - ((DSFileStream *) (this))->flush(); - } + assert(_writeBufferPos == 0); // This method may only be called when reading! int32 oldPos = std_ftell((FILE *)_handle); std_fseek((FILE *)_handle, 0, SEEK_END); int32 length = std_ftell((FILE *)_handle); @@ -444,16 +441,15 @@ uint32 DSFileStream::read(void *ptr, uint32 len) { if (_writeBufferPos > 0) { flush(); } - return std_fread((byte *)ptr, 1, len, (FILE *)_handle); + return std_fread(ptr, 1, len, (FILE *)_handle); } uint32 DSFileStream::write(const void *ptr, uint32 len) { if (_writeBufferPos + len < WRITE_BUFFER_SIZE) { memcpy(_writeBuffer + _writeBufferPos, ptr, len); _writeBufferPos += len; - } - else - { + return len; + } else { if (_writeBufferPos > 0) { flush(); } @@ -483,29 +479,31 @@ DSFileStream *DSFileStream::makeFromPath(const Common::String &path, bool writeM // Stdio replacements -#define MAX_FILE_HANDLES 32 +enum { + MAX_FILE_HANDLES = 32 +}; -bool inited = false; -DS::fileHandle handle[MAX_FILE_HANDLES]; +static bool inited = false; +static DS::fileHandle s_handle[MAX_FILE_HANDLES]; -FILE* std_fopen(const char* name, const char* mode) { +FILE *std_fopen(const char *name, const char *mode) { if (!inited) { for (int r = 0; r < MAX_FILE_HANDLES; r++) { - handle[r].used = false; + s_handle[r].used = false; } inited = true; currentDir[0] = '\0'; } - char* realName = (char *) name; + char realName[MAXPATHLEN]; // Remove file system prefix if ((name[0] == 'd') && (name[1] == 's') && (name[2] == ':') && (name[3] == '/')) { - realName += 4; - } - - if ((name[0] == 'm') && (name[1] == 'p') && (name[2] == ':') && (name[3] == '/')) { - realName += 4; + strlcpy(realName, name + 4, MAXPATHLEN); + } else if ((name[0] == 'm') && (name[1] == 'p') && (name[2] == ':') && (name[3] == '/')) { + strlcpy(realName, name + 4, MAXPATHLEN); + } else { + strlcpy(realName, name, MAXPATHLEN); } // consolePrintf("Open file:"); @@ -515,13 +513,14 @@ FILE* std_fopen(const char* name, const char* mode) { FAT_chdir("/"); // Turn all back slashes into forward slashes for gba_nds_fat - char* p = realName; + char *p = realName; while (*p) { - if (*p == '\\') *p = '/'; + if (*p == '\\') + *p = '/'; p++; } - FAT_FILE* result = FAT_fopen(realName, mode); + FAT_FILE *result = FAT_fopen(realName, mode); if (result == 0) { // consolePrintf("Error code %d\n", result); @@ -531,42 +530,21 @@ FILE* std_fopen(const char* name, const char* mode) { } // MT_memoryReport(); - return (FILE *) result; + return (FILE *)result; } // Fail to open file for writing. It's in ROM! // Allocate a file handle int r = 0; - while (handle[r].used) { + while (s_handle[r].used) { r++; assert(r < MAX_FILE_HANDLES); } -#ifdef GBA_SRAM_SAVE - if (strchr(mode, 'w')) { -// consolePrintf("Writing %s\n", realName); - handle[r].sramFile = (DSSaveFile *) DSSaveFileManager::instance()->openSavefile(realName, true); - } else { -// consolePrintf("Reading %s\n", realName); - handle[r].sramFile = (DSSaveFile *) DSSaveFileManager::instance()->openSavefile(realName, false); - } -#endif - - if (handle[r].sramFile) { - handle[r].used = true; - handle[r].pos = 0; - handle[r].data = NULL; - handle[r].size = handle[r].sramFile->getSize(); -// consolePrintf("Found it"); - return &handle[r]; - } - -// consolePrintf("Not in SRAM!"); - - char* data; + char *data; - ZipFile* zip = DSFileSystemNode::getZip(); + ZipFile *zip = DSFileSystemNode::getZip(); if (!zip) { // consolePrintf("No zip yet!"); return NULL; @@ -578,7 +556,7 @@ FILE* std_fopen(const char* name, const char* mode) { if (currentDir[0] != 0) { char nameWithPath[128]; - sprintf(nameWithPath, "%s\%s", currentDir, realName); + sprintf(nameWithPath, "%s\\%s", currentDir, realName); strcpy(realName, nameWithPath); } @@ -589,17 +567,18 @@ FILE* std_fopen(const char* name, const char* mode) { zip->setAllFilesVisible(false); // Allocate a file handle - int r = 0; - while (handle[r].used) r++; + r = 0; + while (s_handle[r].used) + r++; - handle[r].used = true; - handle[r].pos = 0; - handle[r].data = data; - handle[r].size = zip->getFileSize(); + s_handle[r].used = true; + s_handle[r].pos = 0; + s_handle[r].data = data; + s_handle[r].size = zip->getFileSize(); // consolePrintf("Opened file %d: %s (%s) ", r, realName, name); - return &handle[r]; + return &s_handle[r]; } else { zip->setAllFilesVisible(false); // consolePrintf("Not found: %s (%s) ", realName, name); @@ -607,7 +586,7 @@ FILE* std_fopen(const char* name, const char* mode) { } } -void std_fclose(FILE* handle) { +void std_fclose(FILE *handle) { if (DS::isGBAMPAvailable()) { FAT_fclose((FAT_FILE *) handle); @@ -615,19 +594,15 @@ void std_fclose(FILE* handle) { } handle->used = false; - if (handle->sramFile) { - delete handle->sramFile; - handle->sramFile = NULL; - } } -size_t std_fread(const void* ptr, size_t size, size_t numItems, FILE* handle) { +size_t std_fread(void *ptr, size_t size, size_t numItems, FILE *handle) { // consolePrintf("fread %d,%d %d ", size, numItems, ptr); if (DS::isGBAMPAvailable()) { readPastEndOfFile = false; - int bytes = FAT_fread((void *) ptr, size, numItems, (FAT_FILE *) handle); + int bytes = FAT_fread(ptr, size, numItems, (FAT_FILE *) handle); if (!FAT_feof((FAT_FILE *) handle)) { return numItems; } else { @@ -638,36 +613,22 @@ size_t std_fread(const void* ptr, size_t size, size_t numItems, FILE* handle) { return numItems; } - if (handle->sramFile) { - int bytes = 0; - int result = 1; - //consolePrintf("fread size=", size * numItems); - for (int r = 0; (r < (s32) size * (s32) numItems) && (result > 0); r++) { - result = handle->sramFile->read((void *) ( ((char *) (ptr)) + r), 1); - bytes += result; - //consolePrintf("'%d',", ((char *) (ptr))[0]); - } - - handle->pos += bytes; - - return bytes / size; - } - - if ((int)(handle->pos + size * numItems) > handle->size) { + if (handle->pos > handle->size) + numItems = 0; + else if ((int)(handle->pos + size * numItems) > handle->size) numItems = (handle->size - handle->pos) / size; - if (numItems < 0) numItems = 0; - } // consolePrintf("read %d ", size * numItems); - memcpy((void *) ptr, handle->data + handle->pos, size * numItems); + memcpy(ptr, handle->data + handle->pos, size * numItems); handle->pos += size * numItems; return numItems; } -size_t std_fwrite(const void* ptr, size_t size, size_t numItems, FILE* handle) { - if ((handle == stdin)) return 0; +size_t std_fwrite(const void *ptr, size_t size, size_t numItems, FILE *handle) { + if ((handle == stdin)) + return 0; if ((handle == stderr) || (handle == stdout)) { // consolePrintf((char *) ptr); @@ -677,7 +638,7 @@ size_t std_fwrite(const void* ptr, size_t size, size_t numItems, FILE* handle) { //consolePrintf("fwrite size=%d\n", size * numItems); if (DS::isGBAMPAvailable()) { - FAT_fwrite(((char *) (ptr)), size, numItems, (FAT_FILE *) handle); + FAT_fwrite(ptr, size, numItems, (FAT_FILE *) handle); return numItems; int length = size * numItems; @@ -694,36 +655,27 @@ size_t std_fwrite(const void* ptr, size_t size, size_t numItems, FILE* handle) { return numItems; } - if (handle->sramFile) { - handle->sramFile->write(ptr, size); - return size; - } else { - return 0; - } + return 0; } -bool std_feof(FILE* handle) { +bool std_feof(FILE *handle) { // consolePrintf("feof "); if (DS::isGBAMPAvailable()) { return readPastEndOfFile && FAT_feof((FAT_FILE *) handle); } - if (handle->sramFile) { - return handle->sramFile->eos(); - } - // consolePrintf("feof %s", handle->pos >= handle->size? "true": "false"); return handle->pos >= handle->size; } -int std_fflush(FILE* handle) { +int std_fflush(FILE *handle) { //FIXME: not implemented? // consolePrintf("fflush "); return 0; } -long int std_ftell(FILE* handle) { +long int std_ftell(FILE *handle) { if (DS::isGBAMPAvailable()) { return FAT_ftell((FAT_FILE *) handle); } @@ -731,7 +683,7 @@ long int std_ftell(FILE* handle) { return handle->pos; } -int std_fseek(FILE* handle, long int offset, int whence) { +int std_fseek(FILE *handle, long int offset, int whence) { // consolePrintf("fseek %d %d ", offset, whence); if (DS::isGBAMPAvailable()) { @@ -756,14 +708,14 @@ int std_fseek(FILE* handle, long int offset, int whence) { return 0; } -int std_ferror(FILE* handle) { +int std_ferror(FILE *handle) { //FIXME: not implemented? // consolePrintf("ferror "); return readPastEndOfFile; } -void std_clearerr(FILE* handle) { +void std_clearerr(FILE *handle) { //FIXME: not implemented? readPastEndOfFile = false; // consolePrintf("clearerr "); diff --git a/backends/fs/ds/ds-fs.h b/backends/fs/ds/ds-fs.h index c8bf7d6cf2..6961022848 100644 --- a/backends/fs/ds/ds-fs.h +++ b/backends/fs/ds/ds-fs.h @@ -8,27 +8,30 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ #ifndef _DS_FS_H #define _DS_FS_H -//#include <NDS/ARM9/console.h> #include "common/fs.h" +#include "common/stream.h" +#include "backends/fs/abstract-fs.h" + #include "zipreader.h" -#include "ramsave.h" #include "fat/gba_nds_fat.h" -#include "backends/fs/abstract-fs.h" namespace DS { @@ -40,7 +43,7 @@ namespace DS { */ class DSFileSystemNode : public AbstractFSNode { protected: - static ZipFile* _zipFile; + static ZipFile *_zipFile; Common::String _displayName; Common::String _path; @@ -96,7 +99,7 @@ public: * Returns the zip file this node points to. * TODO: check this documentation. */ - static ZipFile* getZip() { return _zipFile; } + static ZipFile *getZip() { return _zipFile; } }; /** @@ -161,16 +164,16 @@ public: struct fileHandle { int pos; bool used; - char* data; + char *data; int size; - - DSSaveFile* sramFile; }; class DSFileStream : public Common::SeekableReadStream, public Common::WriteStream, public Common::NonCopyable { protected: - static const int WRITE_BUFFER_SIZE = 512; + enum { + WRITE_BUFFER_SIZE = 512 + }; /** File handle to the actual file. */ void *_handle; @@ -206,24 +209,24 @@ public: #undef stdout #undef stdin -#define stdout ((DS::fileHandle*) -1) -#define stderr ((DS::fileHandle*) -2) -#define stdin ((DS::fileHandle*) -3) +#define stdout ((DS::fileHandle *) -1) +#define stderr ((DS::fileHandle *) -2) +#define stdin ((DS::fileHandle *) -3) #define FILE DS::fileHandle // Please do not remove any of these prototypes that appear not to be required. -FILE* std_fopen(const char* name, const char* mode); -void std_fclose(FILE* handle); -size_t std_fread(const void* ptr, size_t size, size_t numItems, FILE* handle); -size_t std_fwrite(const void* ptr, size_t size, size_t numItems, FILE* handle); -bool std_feof(FILE* handle); -long int std_ftell(FILE* handle); -int std_fseek(FILE* handle, long int offset, int whence); -void std_clearerr(FILE* handle); -int std_fflush(FILE* handle); -int std_ferror(FILE* handle); - -} //namespace DS +FILE* std_fopen(const char *name, const char *mode); +void std_fclose(FILE *handle); +size_t std_fread(void *ptr, size_t size, size_t numItems, FILE *handle); +size_t std_fwrite(const void *ptr, size_t size, size_t numItems, FILE *handle); +bool std_feof(FILE *handle); +long int std_ftell(FILE *handle); +int std_fseek(FILE *handle, long int offset, int whence); +void std_clearerr(FILE *handle); +int std_fflush(FILE *handle); +int std_ferror(FILE *handle); + +} // End of namespace DS #endif //_DS_FS_H diff --git a/backends/fs/psp/psp-stream.cpp b/backends/fs/psp/psp-stream.cpp index 83ff095aa8..67c73beeaa 100644 --- a/backends/fs/psp/psp-stream.cpp +++ b/backends/fs/psp/psp-stream.cpp @@ -81,10 +81,10 @@ PSPIoStream::PSPIoStream(const Common::String &path, bool writeMode) PSPIoStream::~PSPIoStream() { DEBUG_ENTER_FUNC(); - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) + if (PowerMan.beginCriticalSection()) PSP_DEBUG_PRINT_FUNC("Suspended\n"); - PowerMan.unregisterSuspend(this); // Unregister with powermanager to be suspended + PowerMan.unregisterForSuspend(this); // Unregister with powermanager to be suspended // Must do this before fclose() or resume() will reopen. fclose((FILE *)_handle); // We don't need a critical section. Worst case, the handle gets closed on its own @@ -100,7 +100,7 @@ PSPIoStream::~PSPIoStream() { */ void *PSPIoStream::open() { DEBUG_ENTER_FUNC(); - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) { + if (PowerMan.beginCriticalSection()) { // No need to open. Just return the _handle resume() already opened. PSP_DEBUG_PRINT_FUNC("Suspended\n"); } @@ -118,7 +118,7 @@ void *PSPIoStream::open() { _cache = (char *)memalign(64, CACHE_SIZE); } - PowerMan.registerSuspend(this); // Register with the powermanager to be suspended + PowerMan.registerForSuspend(this); // Register with the powermanager to be suspended PowerMan.endCriticalSection(); @@ -233,7 +233,7 @@ uint32 PSPIoStream::read(void *ptr, uint32 len) { } } - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) + if (PowerMan.beginCriticalSection()) PSP_DEBUG_PRINT_FUNC("Suspended\n"); @@ -309,7 +309,7 @@ inline bool PSPIoStream::isOffsetInCache(uint32 offset) { uint32 PSPIoStream::write(const void *ptr, uint32 len) { DEBUG_ENTER_FUNC(); // Check if we can access the file - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) + if (PowerMan.beginCriticalSection()) PSP_DEBUG_PRINT_FUNC("Suspended\n"); PSP_DEBUG_PRINT_FUNC("filename[%s], len[0x%x]\n", _path.c_str(), len); @@ -346,7 +346,7 @@ uint32 PSPIoStream::write(const void *ptr, uint32 len) { bool PSPIoStream::flush() { DEBUG_ENTER_FUNC(); // Enter critical section - if (PowerMan.beginCriticalSection() == PowerManager::Blocked) + if (PowerMan.beginCriticalSection()) PSP_DEBUG_PRINT_FUNC("Suspended\n"); int ret = fflush((FILE *)_handle); diff --git a/backends/graphics/graphics.h b/backends/graphics/graphics.h index 0ea425c9bc..9eb354aee4 100644 --- a/backends/graphics/graphics.h +++ b/backends/graphics/graphics.h @@ -48,7 +48,7 @@ public: virtual int getGraphicsMode() const = 0; #ifdef USE_RGB_COLOR virtual Graphics::PixelFormat getScreenFormat() const = 0; - virtual Common::List<Graphics::PixelFormat> getSupportedFormats() = 0; + virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const = 0; #endif virtual void initSize(uint width, uint height, const Graphics::PixelFormat *format = NULL) = 0; virtual int getScreenChangeID() const = 0; diff --git a/backends/graphics/opengl/opengl-graphics.h b/backends/graphics/opengl/opengl-graphics.h index f12e4b45d7..17d0b842e9 100644 --- a/backends/graphics/opengl/opengl-graphics.h +++ b/backends/graphics/opengl/opengl-graphics.h @@ -53,7 +53,7 @@ public: virtual int getGraphicsMode() const; #ifdef USE_RGB_COLOR virtual Graphics::PixelFormat getScreenFormat() const; - virtual Common::List<Graphics::PixelFormat> getSupportedFormats() = 0; + virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const = 0; #endif virtual void initSize(uint width, uint height, const Graphics::PixelFormat *format = NULL); virtual int getScreenChangeID() const; diff --git a/backends/graphics/openglsdl/openglsdl-graphics.cpp b/backends/graphics/openglsdl/openglsdl-graphics.cpp index 6207561c07..b12c3af5cd 100644 --- a/backends/graphics/openglsdl/openglsdl-graphics.cpp +++ b/backends/graphics/openglsdl/openglsdl-graphics.cpp @@ -57,7 +57,7 @@ const Graphics::PixelFormat RGBList[] = { Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0), // RGBA4444 }; -Common::List<Graphics::PixelFormat> OpenGLSdlGraphicsManager::getSupportedFormats() { +Common::List<Graphics::PixelFormat> OpenGLSdlGraphicsManager::getSupportedFormats() const { static Common::List<Graphics::PixelFormat> list; static bool inited = false; diff --git a/backends/graphics/openglsdl/openglsdl-graphics.h b/backends/graphics/openglsdl/openglsdl-graphics.h index 0f69793c1b..56aae27ab7 100644 --- a/backends/graphics/openglsdl/openglsdl-graphics.h +++ b/backends/graphics/openglsdl/openglsdl-graphics.h @@ -45,7 +45,7 @@ public: virtual void init(); #ifdef USE_RGB_COLOR - virtual Common::List<Graphics::PixelFormat> getSupportedFormats(); + virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const; #endif virtual void warpMouse(int x, int y); diff --git a/backends/graphics/sdl/sdl-graphics.cpp b/backends/graphics/sdl/sdl-graphics.cpp index a554479756..e8251a779d 100644 --- a/backends/graphics/sdl/sdl-graphics.cpp +++ b/backends/graphics/sdl/sdl-graphics.cpp @@ -29,6 +29,7 @@ #include "common/system.h" #include "common/config-manager.h" #include "common/mutex.h" +#include "common/translation.h" #include "common/util.h" #ifdef USE_RGB_COLOR #include "common/list.h" @@ -41,7 +42,7 @@ #include "backends/events/sdl/sdl-events.h" static const OSystem::GraphicsMode s_supportedGraphicsModes[] = { - {"1x", "Normal (no scaling)", GFX_NORMAL}, + {"1x", _s("Normal (no scaling)"), GFX_NORMAL}, #ifdef USE_SCALERS {"2x", "2x", GFX_DOUBLESIZE}, {"3x", "3x", GFX_TRIPLESIZE}, @@ -97,11 +98,11 @@ AspectRatio::AspectRatio(int w, int h) { } #if !defined(_WIN32_WCE) && !defined(__SYMBIAN32__) && defined(USE_SCALERS) -static const size_t AR_COUNT = 4; -static const char* desiredAspectRatioAsStrings[AR_COUNT] = { "auto", "4/3", "16/9", "16/10" }; -static const AspectRatio desiredAspectRatios[AR_COUNT] = { AspectRatio(0, 0), AspectRatio(4,3), AspectRatio(16,9), AspectRatio(16,10) }; - static AspectRatio getDesiredAspectRatio() { + const size_t AR_COUNT = 4; + const char* desiredAspectRatioAsStrings[AR_COUNT] = { "auto", "4/3", "16/9", "16/10" }; + const AspectRatio desiredAspectRatios[AR_COUNT] = { AspectRatio(0, 0), AspectRatio(4,3), AspectRatio(16,9), AspectRatio(16,10) }; + //TODO : We could parse an arbitrary string, if we code enough proper validation Common::String desiredAspectRatio = ConfMan.get("desired_screen_aspect_ratio"); @@ -359,45 +360,53 @@ OSystem::TransactionError SdlGraphicsManager::endGFXTransaction() { } #ifdef USE_RGB_COLOR -const Graphics::PixelFormat RGBList[] = { +Common::List<Graphics::PixelFormat> SdlGraphicsManager::getSupportedFormats() const { + assert(!_supportedFormats.empty()); + return _supportedFormats; +} + +void SdlGraphicsManager::detectSupportedFormats() { + + // Clear old list + _supportedFormats.clear(); + + // Some tables with standard formats that we always list + // as "supported". If frontend code tries to use one of + // these, we will perform the necessary format + // conversion in the background. Of course this incurs a + // performance hit, but on desktop ports this should not + // matter. We still push the currently active format to + // the front, so if frontend code just uses the first + // available format, it will get one that is "cheap" to + // use. + const Graphics::PixelFormat RGBList[] = { #ifdef ENABLE_32BIT - // RGBA8888, ARGB8888, RGB888 - Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0), - Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24), - Graphics::PixelFormat(3, 8, 8, 8, 0, 16, 8, 0, 0), + // RGBA8888, ARGB8888, RGB888 + Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0), + Graphics::PixelFormat(4, 8, 8, 8, 8, 16, 8, 0, 24), + Graphics::PixelFormat(3, 8, 8, 8, 0, 16, 8, 0, 0), #endif - // RGB565, XRGB1555, RGB555, RGBA4444, ARGB4444 - Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0), - Graphics::PixelFormat(2, 5, 5, 5, 1, 10, 5, 0, 15), - Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0), - Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0), - Graphics::PixelFormat(2, 4, 4, 4, 4, 8, 4, 0, 12) -}; -const Graphics::PixelFormat BGRList[] = { + // RGB565, XRGB1555, RGB555, RGBA4444, ARGB4444 + Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0), + Graphics::PixelFormat(2, 5, 5, 5, 1, 10, 5, 0, 15), + Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0), + Graphics::PixelFormat(2, 4, 4, 4, 4, 12, 8, 4, 0), + Graphics::PixelFormat(2, 4, 4, 4, 4, 8, 4, 0, 12) + }; + const Graphics::PixelFormat BGRList[] = { #ifdef ENABLE_32BIT - // ABGR8888, BGRA8888, BGR888 - Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24), - Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0), - Graphics::PixelFormat(3, 8, 8, 8, 0, 0, 8, 16, 0), + // ABGR8888, BGRA8888, BGR888 + Graphics::PixelFormat(4, 8, 8, 8, 8, 0, 8, 16, 24), + Graphics::PixelFormat(4, 8, 8, 8, 8, 8, 16, 24, 0), + Graphics::PixelFormat(3, 8, 8, 8, 0, 0, 8, 16, 0), #endif - // BGR565, XBGR1555, BGR555, ABGR4444, BGRA4444 - Graphics::PixelFormat(2, 5, 6, 5, 0, 0, 5, 11, 0), - Graphics::PixelFormat(2, 5, 5, 5, 1, 0, 5, 10, 15), - Graphics::PixelFormat(2, 5, 5, 5, 0, 0, 5, 10, 0), - Graphics::PixelFormat(2, 4, 4, 4, 4, 0, 4, 8, 12), - Graphics::PixelFormat(2, 4, 4, 4, 4, 4, 8, 12, 0) -}; - -// TODO: prioritize matching alpha masks -Common::List<Graphics::PixelFormat> SdlGraphicsManager::getSupportedFormats() { - static Common::List<Graphics::PixelFormat> list; - static bool inited = false; - - if (inited) - return list; - - bool BGR = false; - int listLength = ARRAYSIZE(RGBList); + // BGR565, XBGR1555, BGR555, ABGR4444, BGRA4444 + Graphics::PixelFormat(2, 5, 6, 5, 0, 0, 5, 11, 0), + Graphics::PixelFormat(2, 5, 5, 5, 1, 0, 5, 10, 15), + Graphics::PixelFormat(2, 5, 5, 5, 0, 0, 5, 10, 0), + Graphics::PixelFormat(2, 4, 4, 4, 4, 0, 4, 8, 12), + Graphics::PixelFormat(2, 4, 4, 4, 4, 4, 8, 12, 0) + }; Graphics::PixelFormat format = Graphics::PixelFormat::createFormatCLUT8(); if (_hwscreen) { @@ -413,30 +422,30 @@ Common::List<Graphics::PixelFormat> SdlGraphicsManager::getSupportedFormats() { format.aLoss = 8; // Push it first, as the prefered format. - list.push_back(format); + _supportedFormats.push_back(format); + } - if (format.bShift > format.rShift) - BGR = true; + // TODO: prioritize matching alpha masks + int i; - // Mark that we don't need to do this any more. - inited = true; + // Push some RGB formats + for (i = 0; i < ARRAYSIZE(RGBList); i++) { + if (_hwscreen && (RGBList[i].bytesPerPixel > format.bytesPerPixel)) + continue; + if (RGBList[i] != format) + _supportedFormats.push_back(RGBList[i]); } - for (int i = 0; i < listLength; i++) { - if (inited && (RGBList[i].bytesPerPixel > format.bytesPerPixel)) + // Push some BGR formats + for (i = 0; i < ARRAYSIZE(BGRList); i++) { + if (_hwscreen && (BGRList[i].bytesPerPixel > format.bytesPerPixel)) continue; - if (BGR) { - if (BGRList[i] != format) - list.push_back(BGRList[i]); - list.push_back(RGBList[i]); - } else { - if (RGBList[i] != format) - list.push_back(RGBList[i]); - list.push_back(BGRList[i]); - } + if (BGRList[i] != format) + _supportedFormats.push_back(BGRList[i]); } - list.push_back(Graphics::PixelFormat::createFormatCLUT8()); - return list; + + // Finally, we always supposed 8 bit palette graphics + _supportedFormats.push_back(Graphics::PixelFormat::createFormatCLUT8()); } #endif @@ -718,6 +727,10 @@ bool SdlGraphicsManager::loadGFXMode() { _hwscreen = SDL_SetVideoMode(_videoMode.hardwareWidth, _videoMode.hardwareHeight, 16, _videoMode.fullscreen ? (SDL_FULLSCREEN|SDL_SWSURFACE) : SDL_SWSURFACE ); +#ifdef USE_RGB_COLOR + detectSupportedFormats(); +#endif + if (_hwscreen == NULL) { // DON'T use error(), as this tries to bring up the debug // console, which WON'T WORK now that _hwscreen is hosed. @@ -1531,6 +1544,10 @@ void SdlGraphicsManager::setMousePos(int x, int y) { void SdlGraphicsManager::warpMouse(int x, int y) { int y1 = y; + // Don't change mouse position, when mouse is outside of our window (in case of windowed mode) + if (!(SDL_GetAppState( ) & SDL_APPMOUSEFOCUS)) + return; + if (_videoMode.aspectRatioCorrection && !_overlayVisible) y1 = real2Aspect(y); diff --git a/backends/graphics/sdl/sdl-graphics.h b/backends/graphics/sdl/sdl-graphics.h index 4ca92e9d30..0218be55dc 100644 --- a/backends/graphics/sdl/sdl-graphics.h +++ b/backends/graphics/sdl/sdl-graphics.h @@ -87,7 +87,7 @@ public: virtual int getGraphicsMode() const; #ifdef USE_RGB_COLOR virtual Graphics::PixelFormat getScreenFormat() const { return _screenFormat; } - virtual Common::List<Graphics::PixelFormat> getSupportedFormats(); + virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const; #endif virtual void initSize(uint w, uint h, const Graphics::PixelFormat *format = NULL); virtual int getScreenChangeID() const { return _screenChangeCount; } @@ -160,6 +160,13 @@ protected: #ifdef USE_RGB_COLOR Graphics::PixelFormat _screenFormat; Graphics::PixelFormat _cursorFormat; + Common::List<Graphics::PixelFormat> _supportedFormats; + + /** + * Update the list of supported pixel formats. + * This method is invoked by loadGFXMode(). + */ + void detectSupportedFormats(); #endif /** Temporary screen (for scalers) */ diff --git a/backends/keymapper/remap-dialog.cpp b/backends/keymapper/remap-dialog.cpp index fd90b67d60..067d8453a5 100644 --- a/backends/keymapper/remap-dialog.cpp +++ b/backends/keymapper/remap-dialog.cpp @@ -31,6 +31,8 @@ #include "gui/ScrollBarWidget.h" #include "gui/ThemeEval.h" +#include "common/translation.h" + namespace Common { enum { @@ -44,12 +46,12 @@ RemapDialog::RemapDialog() _keymapper = g_system->getEventManager()->getKeymapper(); assert(_keymapper); - _kmPopUpDesc = new GUI::StaticTextWidget(this, "KeyMapper.PopupDesc", "Keymap:"); + _kmPopUpDesc = new GUI::StaticTextWidget(this, "KeyMapper.PopupDesc", _("Keymap:")); _kmPopUp = new GUI::PopUpWidget(this, "KeyMapper.Popup"); _scrollBar = new GUI::ScrollBarWidget(this, 0, 0, 0, 0); - new GUI::ButtonWidget(this, "KeyMapper.Close", "Close", kCloseCmd); + new GUI::ButtonWidget(this, "KeyMapper.Close", _("Close"), 0, kCloseCmd); } RemapDialog::~RemapDialog() { @@ -61,7 +63,7 @@ void RemapDialog::open() { const Stack<Keymapper::MapRecord> &activeKeymaps = _keymapper->getActiveStack(); if (!(activeKeymaps.size() > 0)) { - _kmPopUp->appendEntry(activeKeymaps.top().keymap->getName() + " (Active)"); + _kmPopUp->appendEntry(activeKeymaps.top().keymap->getName() + _(" (Active)")); divider = true; } @@ -95,7 +97,7 @@ void RemapDialog::open() { if (divider) _kmPopUp->appendEntry(""); for (it = _globalKeymaps->begin(); it != _globalKeymaps->end(); ++it) { - _kmPopUp->appendEntry(it->_value->getName() + " (Global)", idx); + _kmPopUp->appendEntry(it->_value->getName() + _(" (Global)"), idx); _keymapTable[idx++] = it->_value; } divider = true; @@ -105,7 +107,7 @@ void RemapDialog::open() { if (divider) _kmPopUp->appendEntry(""); for (it = _gameKeymaps->begin(); it != _gameKeymaps->end(); ++it) { - _kmPopUp->appendEntry(it->_value->getName() + " (Game)", idx); + _kmPopUp->appendEntry(it->_value->getName() + _(" (Game)"), idx); _keymapTable[idx++] = it->_value; } } @@ -168,7 +170,7 @@ void RemapDialog::reflowLayout() { widg.actionText = new GUI::StaticTextWidget(this, 0, 0, 0, 0, "", Graphics::kTextAlignRight); widg.keyButton = - new GUI::ButtonWidget(this, 0, 0, 0, 0, "", kRemapCmd + i); + new GUI::ButtonWidget(this, 0, 0, 0, 0, "", 0, kRemapCmd + i); _keymapWidgets.push_back(widg); } else { widg = _keymapWidgets[i]; diff --git a/backends/midi/alsa.cpp b/backends/midi/alsa.cpp index c38537248c..a82fffdf0d 100644 --- a/backends/midi/alsa.cpp +++ b/backends/midi/alsa.cpp @@ -269,7 +269,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; #define perm_ok(pinfo,bits) ((snd_seq_port_info_get_capability(pinfo) & (bits)) == (bits)) @@ -315,21 +315,12 @@ MusicDevices AlsaMusicPlugin::getDevices() const { return devices; } -Common::Error AlsaMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error AlsaMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_ALSA(); return Common::kNoError; } -MidiDriver *MidiDriver_ALSA_create() { - MidiDriver *mididriver; - - AlsaMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(ALSA) //REGISTER_PLUGIN_DYNAMIC(ALSA, PLUGIN_TYPE_MUSIC, AlsaMusicPlugin); //#else diff --git a/backends/midi/camd.cpp b/backends/midi/camd.cpp index e4ca3569f2..3486532549 100644 --- a/backends/midi/camd.cpp +++ b/backends/midi/camd.cpp @@ -177,7 +177,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices CamdMusicPlugin::getDevices() const { @@ -188,21 +188,12 @@ MusicDevices CamdMusicPlugin::getDevices() const { return devices; } -Common::Error CamdMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error CamdMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_CAMD(); return Common::kNoError; } -MidiDriver *MidiDriver_CAMD_create() { - MidiDriver *mididriver; - - CamdMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(CAMD) //REGISTER_PLUGIN_DYNAMIC(CAMD, PLUGIN_TYPE_MUSIC, CamdMusicPlugin); //#else diff --git a/backends/midi/coreaudio.cpp b/backends/midi/coreaudio.cpp index d52547c997..aa0ad75f0a 100644 --- a/backends/midi/coreaudio.cpp +++ b/backends/midi/coreaudio.cpp @@ -218,7 +218,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices CoreAudioMusicPlugin::getDevices() const { @@ -229,21 +229,12 @@ MusicDevices CoreAudioMusicPlugin::getDevices() const { return devices; } -Common::Error CoreAudioMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error CoreAudioMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_CORE(); return Common::kNoError; } -MidiDriver *MidiDriver_CORE_create() { - MidiDriver *mididriver; - - CoreAudioMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(COREAUDIO) //REGISTER_PLUGIN_DYNAMIC(COREAUDIO, PLUGIN_TYPE_MUSIC, CoreAudioMusicPlugin); //#else diff --git a/backends/midi/coremidi.cpp b/backends/midi/coremidi.cpp index e48b98a807..08f36a8b0f 100644 --- a/backends/midi/coremidi.cpp +++ b/backends/midi/coremidi.cpp @@ -190,7 +190,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices CoreMIDIMusicPlugin::getDevices() const { @@ -201,21 +201,12 @@ MusicDevices CoreMIDIMusicPlugin::getDevices() const { return devices; } -Common::Error CoreMIDIMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error CoreMIDIMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_CoreMIDI(); return Common::kNoError; } -MidiDriver *MidiDriver_CoreMIDI_create() { - MidiDriver *mididriver; - - CoreMIDIMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(COREMIDI) //REGISTER_PLUGIN_DYNAMIC(COREMIDI, PLUGIN_TYPE_MUSIC, CoreMIDIMusicPlugin); //#else diff --git a/backends/midi/dmedia.cpp b/backends/midi/dmedia.cpp index 1ec79d8513..8c006b2cd9 100644 --- a/backends/midi/dmedia.cpp +++ b/backends/midi/dmedia.cpp @@ -199,7 +199,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices DMediaMusicPlugin::getDevices() const { @@ -224,21 +224,12 @@ MusicDevices DMediaMusicPlugin::getDevices() const { return devices; } -Common::Error DMediaMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error DMediaMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_DMEDIA(); return Common::kNoError; } -MidiDriver *MidiDriver_DMEDIA_create() { - MidiDriver *mididriver; - - DMediaMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(DMEDIA) //REGISTER_PLUGIN_DYNAMIC(DMEDIA, PLUGIN_TYPE_MUSIC, DMediaMusicPlugin); //#else diff --git a/backends/midi/seq.cpp b/backends/midi/seq.cpp index 55c8239562..b1815adee5 100644 --- a/backends/midi/seq.cpp +++ b/backends/midi/seq.cpp @@ -28,7 +28,7 @@ * both the QuickTime support and (vkeybd http://www.alsa-project.org/~iwai/alsa.html) */ -#if defined(UNIX) && !defined(__BEOS__) && !defined(__MAEMO__) && !defined(__MINT__) +#if defined(UNIX) && !defined(__BEOS__) && !defined(__MAEMO__) && !defined(__MINT__) && !defined(__ANDROID__) #include "common/util.h" #include "sound/musicplugin.h" @@ -184,7 +184,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices SeqMusicPlugin::getDevices() const { @@ -195,21 +195,12 @@ MusicDevices SeqMusicPlugin::getDevices() const { return devices; } -Common::Error SeqMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error SeqMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_SEQ(); return Common::kNoError; } -MidiDriver *MidiDriver_SEQ_create() { - MidiDriver *mididriver; - - SeqMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(SEQ) //REGISTER_PLUGIN_DYNAMIC(SEQ, PLUGIN_TYPE_MUSIC, SeqMusicPlugin); //#else diff --git a/backends/midi/stmidi.cpp b/backends/midi/stmidi.cpp index f99f8f74dd..b00188dfea 100644 --- a/backends/midi/stmidi.cpp +++ b/backends/midi/stmidi.cpp @@ -127,8 +127,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) - const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices StMidiMusicPlugin::getDevices() const { @@ -139,21 +138,12 @@ MusicDevices StMidiMusicPlugin::getDevices() const { return devices; } -Common::Error StMidiMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error StMidiMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_STMIDI(); return Common::kNoError; } -MidiDriver *MidiDriver_STMIDI_create() { - MidiDriver *mididriver; - - StMidiMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(STMIDI) //REGISTER_PLUGIN_DYNAMIC(STMIDI, PLUGIN_TYPE_MUSIC, StMidiMusicPlugin); //#else diff --git a/backends/midi/timidity.cpp b/backends/midi/timidity.cpp index 1a44e62b16..f507f1e00a 100644 --- a/backends/midi/timidity.cpp +++ b/backends/midi/timidity.cpp @@ -530,7 +530,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices TimidityMusicPlugin::getDevices() const { @@ -539,21 +539,12 @@ MusicDevices TimidityMusicPlugin::getDevices() const { return devices; } -Common::Error TimidityMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error TimidityMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_TIMIDITY(); return Common::kNoError; } -MidiDriver *MidiDriver_TIMIDITY_create() { - MidiDriver *mididriver; - - TimidityMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(TIMIDITY) //REGISTER_PLUGIN_DYNAMIC(TIMIDITY, PLUGIN_TYPE_MUSIC, TimidityMusicPlugin); //#else diff --git a/backends/midi/windows.cpp b/backends/midi/windows.cpp index 036029644e..da44c40978 100644 --- a/backends/midi/windows.cpp +++ b/backends/midi/windows.cpp @@ -24,12 +24,15 @@ #if defined(WIN32) && !defined(_WIN32_WCE) +#define WIN32_LEAN_AND_MEAN #include <windows.h> // winnt.h defines ARRAYSIZE, but we want our own one... #undef ARRAYSIZE #include "sound/musicplugin.h" #include "sound/mpu401.h" +#include "common/config-manager.h" +#include "common/translation.h" #include <mmsystem.h> @@ -46,11 +49,12 @@ private: HANDLE _streamEvent; HMIDIOUT _mo; bool _isOpen; + int _device; void check_error(MMRESULT result); public: - MidiDriver_WIN() : _isOpen(false) { } + MidiDriver_WIN(int deviceIndex) : _isOpen(false), _device(deviceIndex) { } int open(); void close(); void send(uint32 b); @@ -62,7 +66,7 @@ int MidiDriver_WIN::open() { return MERR_ALREADY_OPEN; _streamEvent = CreateEvent(NULL, true, true, NULL); - MMRESULT res = midiOutOpen((HMIDIOUT *)&_mo, MIDI_MAPPER, (DWORD_PTR)_streamEvent, 0, CALLBACK_EVENT); + MMRESULT res = midiOutOpen((HMIDIOUT *)&_mo, _device, (DWORD_PTR)_streamEvent, 0, CALLBACK_EVENT); if (res != MMSYSERR_NOERROR) { check_error(res); CloseHandle(_streamEvent); @@ -150,7 +154,7 @@ void MidiDriver_WIN::check_error(MMRESULT result) { class WindowsMusicPlugin : public MusicPluginObject { public: const char *getName() const { - return "Windows MIDI"; + return _s("Windows MIDI"); } const char *getId() const { @@ -158,32 +162,43 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices WindowsMusicPlugin::getDevices() const { MusicDevices devices; - // TODO: Return a different music type depending on the configuration - // TODO: List the available devices - devices.push_back(MusicDevice(this, "", MT_GM)); + int numDevs = midiOutGetNumDevs(); + MIDIOUTCAPS tmp; + + for (int i = 0; i < numDevs; i++) { + if (midiOutGetDevCaps(i, &tmp, sizeof(MIDIOUTCAPS)) != MMSYSERR_NOERROR) + break; + // There is no way to detect the "MusicType" so I just set it to MT_GM + // The user will have to manually select his MT32 type device and his GM type device. + devices.push_back(MusicDevice(this, tmp.szPname, MT_GM)); + } return devices; } -Common::Error WindowsMusicPlugin::createInstance(MidiDriver **mididriver) const { - *mididriver = new MidiDriver_WIN(); +Common::Error WindowsMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle dev) const { + int devIndex = 0; + bool found = false; + + if (dev) { + MusicDevices i = getDevices(); + for (MusicDevices::iterator d = i.begin(); d != i.end(); d++) { + if (d->getCompleteId().equals(MidiDriver::getDeviceString(dev, MidiDriver::kDeviceId))) { + found = true; + break; + } + devIndex++; + } + } + *mididriver = new MidiDriver_WIN(found ? devIndex : 0); return Common::kNoError; } -MidiDriver *MidiDriver_WIN_create() { - MidiDriver *mididriver; - - WindowsMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(WINDOWS) //REGISTER_PLUGIN_DYNAMIC(WINDOWS, PLUGIN_TYPE_MUSIC, WindowsMusicPlugin); //#else diff --git a/backends/midi/ypa1.cpp b/backends/midi/ypa1.cpp index fe65d02c10..fb114d625c 100644 --- a/backends/midi/ypa1.cpp +++ b/backends/midi/ypa1.cpp @@ -117,7 +117,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices YamahaPa1MusicPlugin::getDevices() const { @@ -128,21 +128,12 @@ MusicDevices YamahaPa1MusicPlugin::getDevices() const { return devices; } -Common::Error YamahaPa1MusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error YamahaPa1MusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_YamahaPa1(); return Common::kNoError; } -MidiDriver *MidiDriver_YamahaPa1_create() { - MidiDriver *mididriver; - - YamahaPa1MusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(YPA1) //REGISTER_PLUGIN_DYNAMIC(YPA1, PLUGIN_TYPE_MUSIC, YamahaPa1MusicPlugin); //#else diff --git a/backends/midi/zodiac.cpp b/backends/midi/zodiac.cpp index b9cb46912a..e848315ca4 100644 --- a/backends/midi/zodiac.cpp +++ b/backends/midi/zodiac.cpp @@ -135,7 +135,7 @@ public: } MusicDevices getDevices() const; - Common::Error createInstance(MidiDriver **mididriver) const; + Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const; }; MusicDevices ZodiacMusicPlugin::getDevices() const { @@ -146,21 +146,12 @@ MusicDevices ZodiacMusicPlugin::getDevices() const { return devices; } -Common::Error ZodiacMusicPlugin::createInstance(MidiDriver **mididriver) const { +Common::Error ZodiacMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const { *mididriver = new MidiDriver_Zodiac(); return Common::kNoError; } -MidiDriver *MidiDriver_Zodiac_create() { - MidiDriver *mididriver; - - ZodiacMusicPlugin p; - p.createInstance(&mididriver); - - return mididriver; -} - //#if PLUGIN_ENABLED_DYNAMIC(ZODIAC) //REGISTER_PLUGIN_DYNAMIC(ZODIAC, PLUGIN_TYPE_MUSIC, ZodiacMusicPlugin); //#else diff --git a/backends/modular-backend.cpp b/backends/modular-backend.cpp index 3a18014b3a..e7d0764c11 100644 --- a/backends/modular-backend.cpp +++ b/backends/modular-backend.cpp @@ -92,13 +92,15 @@ int ModularBackend::getGraphicsMode() const { } #ifdef USE_RGB_COLOR + Graphics::PixelFormat ModularBackend::getScreenFormat() const { return _graphicsManager->getScreenFormat(); } -Common::List<Graphics::PixelFormat> ModularBackend::getSupportedFormats() { +Common::List<Graphics::PixelFormat> ModularBackend::getSupportedFormats() const { return _graphicsManager->getSupportedFormats(); } + #endif void ModularBackend::initSize(uint w, uint h, const Graphics::PixelFormat *format ) { diff --git a/backends/modular-backend.h b/backends/modular-backend.h index a60fccc876..63e13059cb 100644 --- a/backends/modular-backend.h +++ b/backends/modular-backend.h @@ -76,7 +76,7 @@ public: virtual int getGraphicsMode() const; #ifdef USE_RGB_COLOR virtual Graphics::PixelFormat getScreenFormat() const; - virtual Common::List<Graphics::PixelFormat> getSupportedFormats(); + virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const; #endif virtual void initSize(uint width, uint height, const Graphics::PixelFormat *format = NULL); virtual int getScreenChangeID() const; diff --git a/backends/module.mk b/backends/module.mk index 146253248b..801c98135f 100644 --- a/backends/module.mk +++ b/backends/module.mk @@ -29,6 +29,7 @@ MODULE_OBJS := \ graphics/gp2xwizsdl/gp2xwizsdl-graphics.o \ graphics/linuxmotosdl/linuxmotosdl-graphics.o \ graphics/opengl/glerrorcheck.o \ + graphics/opengl/gltexture.o \ graphics/opengl/opengl-graphics.o \ graphics/openglsdl/openglsdl-graphics.o \ graphics/sdl/sdl-graphics.o \ diff --git a/backends/platform/PalmOS/Src/launcher/forms/formSkins.cpp b/backends/platform/PalmOS/Src/launcher/forms/formSkins.cpp index b4c1e222d0..9566a25311 100644 --- a/backends/platform/PalmOS/Src/launcher/forms/formSkins.cpp +++ b/backends/platform/PalmOS/Src/launcher/forms/formSkins.cpp @@ -107,7 +107,7 @@ static void SkinsFormExit(Boolean bSave) { listP = (ListType *)GetObjectPtr(SkinsSkinList); selected = LstGetSelection(listP); - if (bSave && selected == -1) { // may never occured... + if (bSave && selected == -1) { // may never occurred... FrmCustomAlert(FrmWarnAlert, "You didn't select a skin.", 0, 0); return; } @@ -164,7 +164,7 @@ static void SkinsFormBeam() { listP = (ListType *)GetObjectPtr(SkinsSkinList); selected = LstGetSelection(listP); - if (selected == -1) { // may never occured... + if (selected == -1) { // may never occurred... FrmCustomAlert(FrmWarnAlert, "You didn't select a skin.", 0, 0); return; } @@ -187,7 +187,7 @@ static void SkinsFormDelete() { listP = (ListType *)GetObjectPtr(SkinsSkinList); selected = LstGetSelection(listP); - if (selected == -1) { // may never occured... + if (selected == -1) { // may never occurred... FrmCustomAlert(FrmInfoAlert, "You didn't select a skin.", 0, 0); return; } diff --git a/backends/platform/PalmOS/Src/launcher/forms/formmusic.cpp b/backends/platform/PalmOS/Src/launcher/forms/formmusic.cpp index 58eaa5b5fc..48399efa95 100644 --- a/backends/platform/PalmOS/Src/launcher/forms/formmusic.cpp +++ b/backends/platform/PalmOS/Src/launcher/forms/formmusic.cpp @@ -258,7 +258,7 @@ static void MusicFormInit(UInt16 index) { ogameInfoP = (GameInfoType *)MemHandleLock(recordH); if (!ogameInfoP) { - FrmCustomAlert(FrmErrorAlert, "An error occured.",0,0); + FrmCustomAlert(FrmErrorAlert, "An error occurred.",0,0); return; } diff --git a/backends/platform/PalmOS/Src/launcher/launch.cpp b/backends/platform/PalmOS/Src/launcher/launch.cpp index cb2d52b20e..d83a34e94c 100644 --- a/backends/platform/PalmOS/Src/launcher/launch.cpp +++ b/backends/platform/PalmOS/Src/launcher/launch.cpp @@ -468,7 +468,7 @@ Boolean StartScummVM(Int16 engine) { return false; } - // reset mode if screen rotation occured (DIA only) + // reset mode if screen rotation occurred (DIA only) if (!direct && OPTIONS_TST(kOptCollapsible)) { UInt8 mode = PalmScreenSize(0,0, &(gVars->screenFullWidth), &(gVars->screenFullHeight)); OPTIONS_RST(kOptModeLandscape); diff --git a/backends/platform/android/README.build b/backends/platform/android/README.build index fa56bfc180..3d1cf433a7 100644 --- a/backends/platform/android/README.build +++ b/backends/platform/android/README.build @@ -2,41 +2,38 @@ Building the ScummVM Android port ================================= You will need these things to build: -1. Android EGL headers and library -2. Android SDK -3. An arm-android-eabi GCC toolchain +1. Android SDK +2. An arm-oe-linux-androideabi GCC toolchain(*) In the example commands, we are going to build against the Android 1.5 native ABI (but using the Android 1.6 SDK tools). Other version combinations might/should be possible with a bit of tweaking. -In detail: - -1. Android EGL headers and library +(*) Any other sane Android toolchain should be easy to use, but this +is the toolchain prefix that is used by default. You can trivially +find and modify the single location where it appears in ./configure if +you have some other prefix variation. -You can build these from the full Android source, but it is far easier -to just download the 3 Android EGL headers from here: - http://android.git.kernel.org/?p=platform/frameworks/base.git;a=tree;f=opengl/include/EGL;hb=HEAD - (copy them to a directory called "EGL" somewhere) -... and grab libEGL.so off an existing phone/emulator: - adb pull /system/lib/libEGL.so /tmp +In detail: -2. Android SDK +1. Android SDK -Download and install somewhere. +Download the SDK from http://developer.android.com/ and install +somewhere. You will need both the API level 8 (aka Android 2.2) and +API level 3 (aka Android 1.5) platforms. -3. arm-android-eabi GCC toolchain +2. arm-*-linux-androideabi GCC toolchain You have several choices for toolchains: -- Use Google arm-eabi prebuilt toolchain. + - Use Google arm-eabi prebuilt toolchain. This is shipped with both the Android source release and Android NDK. The problem is that "arm-eabi-gcc" can't actually link anything successfully without extra command line flags. To use this with the ScummVM configure/build environment you will need to create a family -of shell wrapper scripts that convert "arm-android-eabi-foo" to +of shell wrapper scripts that convert "arm-oe-linux-androideabi-foo" to "arm-eabi-foo -mandroid". For example, I use this script: @@ -44,17 +41,24 @@ For example, I use this script: exec arm-eabi-${0##*-} -mandroid -DANDROID "$@" ... and create a family of symlinks/hardlinks pointing to it called -arm-android-eabi-gcc, arm-android-eabi-g++, etc. For tools that don't -take a "-mandroid" argument - like arm-eabi-strip - I bypass the shell -wrapper and just create an arm-android-eabi-strip symlink to the tool -directly. +arm-oe-android-linuxeabi-gcc, arm-oe-android-linuxeabi-g++, etc. For +tools that don't take a "-mandroid" argument - like arm-eabi-strip - I +bypass the shell wrapper and just create an arm-oe-android-linuxeabi-strip +symlink to the tool directly. -- Build your own arm-android-eabi toolchain from GCC source. +In practice you will probably need significant linker command line +massaging in order to get the crtbegin/end and libraries all linked in +the right way. It's not hard to do manually, but it is annoying to +script in a general purpose way. -This is lots of fun. I suggest my Android openembedded patches, see: - http://wiki.github.com/anguslees/openembedded-android/ -(You just need to have lots of disk space and type a few commands) -If you get stuck, ask + - Build your own arm-*-linux-androideabi toolchain from GCC source. + +This is lots of fun, but will become significantly easier once gcc-4.6 +is released. In the interim, I suggest using my precompiled Android +openembedded-based toolchain: + wget http://commondatastorage.googleapis.com/anr/sdk/android-2.2-i686-linux-armv5te-linux-androideabi-toolchain-android.tar.bz2 + sudo tar jxf android-2.2-i686-linux-armv5te-linux-androideabi-toolchain-android.tar.bz2 -C / + . /usr/local/android/arm/environment-setup Alternatively, do a websearch - there are several other cross-compile toolchains around. @@ -63,18 +67,25 @@ toolchains around. Building ScummVM ================ +Apply the theme engine patch: + + patch -p1 < backends/platform/android/scummvm-android-themeengine.patch + +(Optionally) compress scummmodern.zip: +(ScummVM usually ships it uncompressed, but Android can read it more +efficiently if it is compressed *before* adding it to the apk) + + ( cd gui/themes/scummmodern && zip -f ../scummmodern.zip ) + +Then build ScummVM: + export ANDROID_SDK=<root of Android SDK> PATH=$ANDROID_SDK/platforms/android-1.6/tools:$ANDROID_SDK/tools:$PATH - # You also want to ensure your arm-android-eabi toolchain is in your $PATH + # You also want to ensure your arm-oe-linux-androideabi toolchain is in $PATH export ANDROID_TOP=<root of built Android source> - EGL_INC="-I<location of EGL/ header directory>" - EGL_LIBS="-L<location of libEGL.so>" - - CPPFLAGS="$EGL_INC" \ - LDFLAGS="-g $EGL_LIBS" \ ./configure --backend=android --host=android --enable-zlib #and any other flags make scummvm.apk diff --git a/backends/platform/android/android.cpp b/backends/platform/android/android.cpp index a6258df554..f6af0fcff5 100644 --- a/backends/platform/android/android.cpp +++ b/backends/platform/android/android.cpp @@ -31,10 +31,6 @@ #if defined(ANDROID_BACKEND) -#define ANDROID_VERSION_GE(major,minor) \ - (ANDROID_MAJOR_VERSION > (major) || \ - (ANDROID_MAJOR_VERSION == (major) && ANDROID_MINOR_VERSION >= (minor))) - #include <jni.h> #include <string.h> @@ -45,7 +41,6 @@ #include <GLES/gl.h> #include <GLES/glext.h> -#include <EGL/egl.h> #include <android/log.h> #include "common/archive.h" @@ -78,6 +73,14 @@ #undef JNIEXPORT #define JNIEXPORT __attribute__ ((visibility("default"))) +// This replaces the bionic libc assert message with something that +// actually prints the assertion failure before aborting. +extern "C" +void __assert(const char *file, int line, const char *expr) { + __android_log_assert(expr, LOG_TAG, "%s:%d: Assertion failure: %s", + file, line, expr); +} + static JavaVM *cached_jvm; static jfieldID FID_Event_type; static jfieldID FID_Event_synthetic; @@ -162,20 +165,19 @@ private: jmethodID MID_getPluginDirectories; jmethodID MID_setupScummVMSurface; jmethodID MID_destroyScummVMSurface; + jmethodID MID_swapBuffers; int _screen_changeid; - EGLDisplay _egl_display; - EGLSurface _egl_surface; - EGLint _egl_surface_width; - EGLint _egl_surface_height; + int _egl_surface_width; + int _egl_surface_height; bool _force_redraw; // Game layer GLESPaletteTexture* _game_texture; int _shake_offset; + Common::Rect _focus_rect; bool _full_screen_dirty; - Common::Array<Common::Rect> _dirty_rects; // Overlay layer GLES4444Texture* _overlay_texture; @@ -195,6 +197,7 @@ private: pthread_t _timer_thread; static void* timerThreadFunc(void* arg); + bool _enable_zoning; bool _virtkeybd_on; Common::SaveFileManager *_savefile; @@ -217,6 +220,11 @@ public: static OSystem_Android* fromJavaObject(JNIEnv* env, jobject obj); virtual void initBackend(); void addPluginDirectories(Common::FSList &dirs) const; + void enableZoning(bool enable) { _enable_zoning = enable; } + void setSurfaceSize(int width, int height) { + _egl_surface_width = width; + _egl_surface_height = height; + } virtual bool hasFeature(Feature f); virtual void setFeatureState(Feature f, bool enable); @@ -297,8 +305,6 @@ public: OSystem_Android::OSystem_Android(jobject am) : _back_ptr(0), - _egl_display(EGL_NO_DISPLAY), - _egl_surface(EGL_NO_SURFACE), _screen_changeid(0), _force_redraw(false), _game_texture(NULL), @@ -307,6 +313,7 @@ OSystem_Android::OSystem_Android(jobject am) _use_mouse_palette(false), _show_mouse(false), _show_overlay(false), + _enable_zoning(false), _savefile(0), _mixer(0), _timer(0), @@ -362,6 +369,7 @@ bool OSystem_Android::initJavaHooks(JNIEnv* env, jobject self) { FIND_METHOD(getPluginDirectories, "()[Ljava/lang/String;"); FIND_METHOD(setupScummVMSurface, "()V"); FIND_METHOD(destroyScummVMSurface, "()V"); + FIND_METHOD(swapBuffers, "()Z"); #undef FIND_METHOD @@ -574,6 +582,7 @@ int OSystem_Android::getGraphicsMode() const { } void OSystem_Android::setupScummVMSurface() { + ENTER("setupScummVMSurface"); JNIEnv* env = JNU_GetEnv(); env->CallVoidMethod(_back_ptr, MID_setupScummVMSurface); if (env->ExceptionCheck()) @@ -581,37 +590,8 @@ void OSystem_Android::setupScummVMSurface() { // EGL set up with a new surface. Initialise OpenGLES context. - _egl_display = eglGetCurrentDisplay(); - _egl_surface = eglGetCurrentSurface(EGL_DRAW); - - static bool log_version = true; - if (log_version) { - __android_log_print(ANDROID_LOG_INFO, LOG_TAG, - "Using EGL %s (%s); GL %s/%s (%s)", - eglQueryString(_egl_display, EGL_VERSION), - eglQueryString(_egl_display, EGL_VENDOR), - glGetString(GL_VERSION), - glGetString(GL_RENDERER), - glGetString(GL_VENDOR)); - log_version = false; // only log this once - } - GLESTexture::initGLExtensions(); - if (!eglQuerySurface(_egl_display, _egl_surface, - EGL_WIDTH, &_egl_surface_width) || - !eglQuerySurface(_egl_display, _egl_surface, - EGL_HEIGHT, &_egl_surface_height)) { - JNU_ThrowByName(env, "java/lang/RuntimeException", - "Error fetching EGL surface width/height"); - return; - } - __android_log_print(ANDROID_LOG_INFO, LOG_TAG, - "New surface is %dx%d", - _egl_surface_width, _egl_surface_height); - - CHECK_GL_ERROR(); - // Turn off anything that looks like 3D ;) glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); @@ -645,20 +625,18 @@ void OSystem_Android::setupScummVMSurface() { _mouse_texture->reinitGL(); glViewport(0, 0, _egl_surface_width, _egl_surface_height); + glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrthof(0, _egl_surface_width, _egl_surface_height, 0, -1, 1); - glMatrixMode(GL_MODELVIEW); glLoadIdentity(); + clearFocusRectangle(); CHECK_GL_ERROR(); - - _force_redraw = true; } void OSystem_Android::destroyScummVMSurface() { - _egl_surface = EGL_NO_SURFACE; JNIEnv* env = JNU_GetEnv(); env->CallVoidMethod(_back_ptr, MID_destroyScummVMSurface); // Can't use OpenGLES functions after this @@ -676,7 +654,7 @@ void OSystem_Android::initSize(uint width, uint height, _overlay_texture->allocBuffer(overlay_width, overlay_height); // Don't know mouse size yet - it gets reallocated in - // setMouseCursor. We need the palette allocated before + // setMouseCursor. We need the palette allocated before // setMouseCursor however, so just take a guess at the desired // size (it's small). _mouse_texture->allocBuffer(20, 20); @@ -691,7 +669,7 @@ int16 OSystem_Android::getWidth() { } void OSystem_Android::setPalette(const byte* colors, uint start, uint num) { - ENTER("setPalette(%p, %u, %u)", colors, start, num); + ENTER("setPalette(%p, %u, %u)", colors, start, num); if (!_use_mouse_palette) _setCursorPalette(colors, start, num); @@ -739,8 +717,11 @@ void OSystem_Android::updateScreen() { glPushMatrix(); - if (_shake_offset != 0) { - // This is the only case where _game_texture doesn't + if (_shake_offset != 0 || + (!_focus_rect.isEmpty() && + !Common::Rect(_game_texture->width(), + _game_texture->height()).contains(_focus_rect))) { + // These are the only cases where _game_texture doesn't // cover the entire screen. glClearColorx(0, 0, 0, 1 << 16); glClear(GL_COLOR_BUFFER_BIT); @@ -749,15 +730,29 @@ void OSystem_Android::updateScreen() { glTranslatex(0, -_shake_offset << 16, 0); } - _game_texture->drawTexture(0, 0, - _egl_surface_width, _egl_surface_height); + if (_focus_rect.isEmpty()) { + _game_texture->drawTexture(0, 0, + _egl_surface_width, _egl_surface_height); + } else { + glPushMatrix(); + glScalex(xdiv(_egl_surface_width, _focus_rect.width()), + xdiv(_egl_surface_height, _focus_rect.height()), + 1 << 16); + glTranslatex(-_focus_rect.left << 16, -_focus_rect.top << 16, 0); + glScalex(xdiv(_game_texture->width(), _egl_surface_width), + xdiv(_game_texture->height(), _egl_surface_height), + 1 << 16); + _game_texture->drawTexture(0, 0, + _egl_surface_width, _egl_surface_height); + glPopMatrix(); + } CHECK_GL_ERROR(); if (_show_overlay) { _overlay_texture->drawTexture(0, 0, - _egl_surface_width, - _egl_surface_height); + _egl_surface_width, + _egl_surface_height); CHECK_GL_ERROR(); } @@ -765,8 +760,8 @@ void OSystem_Android::updateScreen() { glPushMatrix(); glTranslatex(-_mouse_hotspot.x << 16, - -_mouse_hotspot.y << 16, - 0); + -_mouse_hotspot.y << 16, + 0); // Scale up ScummVM -> OpenGL (pixel) coordinates int texwidth, texheight; @@ -778,8 +773,8 @@ void OSystem_Android::updateScreen() { texheight = getHeight(); } glScalex(xdiv(_egl_surface_width, texwidth), - xdiv(_egl_surface_height, texheight), - 1 << 16); + xdiv(_egl_surface_height, texheight), + 1 << 16); // Note the extra half texel to position the mouse in // the middle of the x,y square: @@ -801,14 +796,11 @@ void OSystem_Android::updateScreen() { CHECK_GL_ERROR(); - if (!eglSwapBuffers(_egl_display, _egl_surface)) { - EGLint error = eglGetError(); - warning("eglSwapBuffers exited with error 0x%x", error); - // Some errors mean we need to reinit GL - if (error == EGL_CONTEXT_LOST) { - destroyScummVMSurface(); - setupScummVMSurface(); - } + JNIEnv* env = JNU_GetEnv(); + if (!env->CallBooleanMethod(_back_ptr, MID_swapBuffers)) { + // Context lost -> need to reinit GL + destroyScummVMSurface(); + setupScummVMSurface(); } } @@ -841,26 +833,18 @@ void OSystem_Android::fillScreen(uint32 col) { void OSystem_Android::setFocusRectangle(const Common::Rect& rect) { ENTER("setFocusRectangle(%d,%d,%d,%d)", rect.left, rect.top, rect.right, rect.bottom); -#if 0 - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrthof(rect.left, rect.right, rect.top, rect.bottom, 0, 1); - glMatrixMode(GL_MODELVIEW); - - _force_redraw = true; -#endif + if (_enable_zoning) { + _focus_rect = rect; + _force_redraw = true; + } } void OSystem_Android::clearFocusRectangle() { ENTER("clearFocusRectangle()"); -#if 0 - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrthof(0, _egl_surface_width, _egl_surface_height, 0, -1, 1); - glMatrixMode(GL_MODELVIEW); - - _force_redraw = true; -#endif + if (_enable_zoning) { + _focus_rect = Common::Rect(); + _force_redraw = true; + } } void OSystem_Android::showOverlay() { @@ -1338,6 +1322,17 @@ void AndroidPluginProvider::addCustomDirectories(Common::FSList &dirs) const { } #endif +static void ScummVM_enableZoning(JNIEnv* env, jobject self, jboolean enable) { + OSystem_Android* cpp_obj = OSystem_Android::fromJavaObject(env, self); + cpp_obj->enableZoning(enable); +} + +static void ScummVM_setSurfaceSize(JNIEnv* env, jobject self, + jint width, jint height) { + OSystem_Android* cpp_obj = OSystem_Android::fromJavaObject(env, self); + cpp_obj->setSurfaceSize(width, height); +} + const static JNINativeMethod gMethods[] = { { "create", "(Landroid/content/res/AssetManager;)V", (void*)ScummVM_create }, @@ -1352,6 +1347,10 @@ const static JNINativeMethod gMethods[] = { (void*)ScummVM_setConfManInt }, { "setConfMan", "(Ljava/lang/String;Ljava/lang/String;)V", (void*)ScummVM_setConfManString }, + { "enableZoning", "(Z)V", + (void*)ScummVM_enableZoning }, + { "setSurfaceSize", "(II)V", + (void*)ScummVM_setSurfaceSize }, }; JNIEXPORT jint JNICALL diff --git a/backends/platform/android/android.mk b/backends/platform/android/android.mk index 0bc8fa265e..95e848e0d9 100644 --- a/backends/platform/android/android.mk +++ b/backends/platform/android/android.mk @@ -4,7 +4,6 @@ AAPT = aapt DX = dx APKBUILDER = apkbuilder ADB = adb -e -ANDROID_JAR = $(ANDROID_SDK)/platforms/android-1.6/android.jar JAVAC ?= javac JAVACFLAGS = -source 1.5 -target 1.5 @@ -12,6 +11,14 @@ JAVACFLAGS = -source 1.5 -target 1.5 #LDFLAGS += -Wl,--gc-sections #CXXFLAGS += -ffunction-sections -fdata-sections -fvisibility=hidden -fvisibility-inlines-hidden +resources.ap_: $(srcdir)/dists/android/AndroidManifest.xml $(RESOURCES) $(ASSETS) $(ANDROID_JAR8) $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) + $(INSTALL) -d build.tmp/assets/ + $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) build.tmp/assets/ + $(AAPT) package -f -M $< -S $(srcdir)/dists/android/res -A build.tmp/assets -I $(ANDROID_JAR8) -F $@ + +build.tmp/%/resources.ap_: build.tmp/%/AndroidManifest.xml build.stage/%/res/values/strings.xml build.stage/%/res/drawable/scummvm.png $(ANDROID_JAR8) + $(AAPT) package -f -M $< -S build.stage/$*/res -I $(ANDROID_JAR8) -F $@ + scummvm.apk: build.tmp/libscummvm.so resources.ap_ classes.dex # Package installer won't delete old libscummvm.so on upgrade so # replace it with a zero size file diff --git a/backends/platform/android/module.mk b/backends/platform/android/module.mk index fdb0ed2ac4..c7b98b996d 100644 --- a/backends/platform/android/module.mk +++ b/backends/platform/android/module.mk @@ -39,14 +39,22 @@ PLUGIN_RESOURCES = \ #ANDROID_VERSIONCODE = 6 Specified in dists/android/AndroidManifest.xml.in ANDROID_PLUGIN_VERSIONCODE = 6 +# This is a bit silly. I want to compile against the 1.6 android.jar, +# to make the compiler check that I don't use something that requires +# a newer Android. However, in order to use android:installLocation, +# we need to give aapt a version >=8 android.jar - even though the +# result will work ok on 1.5+. +ANDROID_JAR = $(ANDROID_SDK)/platforms/android-1.5/android.jar +ANDROID_JAR8 = $(ANDROID_SDK)/platforms/android-8/android.jar + # This library contains scummvm proper build.tmp/libscummvm.so: $(OBJS) @$(MKDIR) -p $(@D) - $(CXX) $(PLUGIN_LDFLAGS) -shared $(LDFLAGS) -Wl,-soname,$(@F) -Wl,--no-undefined -o $@ $(PRE_OBJS_FLAGS) $(OBJS) $(POST_OBJS_FLAGS) $(LIBS) + $(QUIET_LINK)$(CXX) -shared $(LDFLAGS) -Wl,-Bsymbolic -Wl,-soname,$(@F) -Wl,--no-undefined -o $@ $(PRE_OBJS_FLAGS) $(OBJS) $(POST_OBJS_FLAGS) $(LIBS) -backends/platform/android/org/inodes/gus/scummvm/R.java backends/platform/android/org/inodes/gus/scummvm/Manifest.java: $(srcdir)/dists/android/AndroidManifest.xml $(filter %.xml,$(RESOURCES)) $(ANDROID_JAR) - $(AAPT) package -m -J backends/platform/android -M $< -S $(srcdir)/dists/android/res -I $(ANDROID_JAR) +backends/platform/android/org/inodes/gus/scummvm/R.java backends/platform/android/org/inodes/gus/scummvm/Manifest.java: $(srcdir)/dists/android/AndroidManifest.xml $(filter %.xml,$(RESOURCES)) $(ANDROID_JAR8) + $(AAPT) package -m -J backends/platform/android -M $< -S $(srcdir)/dists/android/res -I $(ANDROID_JAR8) build.tmp/classes/%.class: $(srcdir)/backends/platform/android/%.java $(srcdir)/backends/platform/android/org/inodes/gus/scummvm/R.java @$(MKDIR) -p $(@D) @@ -63,14 +71,6 @@ build.tmp/plugins/classes.dex: $(JAVA_PLUGIN_SRC:backends/platform/android/%.jav @$(MKDIR) -p $(@D) $(DX) --dex --output=$@ build.tmp/classes.plugin -resources.ap_: $(srcdir)/dists/android/AndroidManifest.xml $(RESOURCES) $(ASSETS) $(ANDROID_JAR) $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) - $(INSTALL) -d build.tmp/assets/ - $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(DIST_FILES_ENGINEDATA) build.tmp/assets/ - $(AAPT) package -f -M $< -S $(srcdir)/dists/android/res -A build.tmp/assets -I $(ANDROID_JAR) -F $@ - -build.tmp/%/resources.ap_: build.tmp/%/AndroidManifest.xml build.stage/%/res/values/strings.xml build.stage/%/res/drawable/scummvm.png $(ANDROID_JAR) - $(AAPT) package -f -M $< -S build.stage/$*/res -I $(ANDROID_JAR) -F $@ - build.tmp/%/AndroidManifest.xml build.stage/%/res/values/strings.xml: dists/android/mkmanifest.pl configure dists/android/AndroidManifest.xml dists/android/mkmanifest.pl --id=$* --configure=configure \ --version-name=$(VERSION) \ diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java index f4dca0e7e5..d39aa363ef 100644 --- a/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java +++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVM.java @@ -12,7 +12,10 @@ import android.util.Log; import android.view.Surface; import android.view.SurfaceHolder; +import javax.microedition.khronos.opengles.GL; +import javax.microedition.khronos.opengles.GL10; import javax.microedition.khronos.egl.EGL10; +import javax.microedition.khronos.egl.EGL11; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLContext; import javax.microedition.khronos.egl.EGLDisplay; @@ -30,11 +33,11 @@ import java.util.concurrent.Semaphore; public class ScummVM implements SurfaceHolder.Callback { private final static String LOG_TAG = "ScummVM.java"; - private final int AUDIO_FRAME_SIZE = 2 * 2; // bytes. 16bit audio * stereo + private final int AUDIO_FRAME_SIZE = 2 * 2; // bytes. 16bit audio * stereo public static class AudioSetupException extends Exception {} private long nativeScummVM; // native code hangs itself here - boolean scummVMRunning = false; + boolean scummVMRunning = false; private native void create(AssetManager am); @@ -54,49 +57,49 @@ public class ScummVM implements SurfaceHolder.Callback { destroy(); } - // Surface creation: - // GUI thread: create surface, release lock - // ScummVM thread: acquire lock (block), read surface - // - // Surface deletion: - // GUI thread: post event, acquire lock (block), return - // ScummVM thread: read event, free surface, release lock - // - // In other words, ScummVM thread does this: - // acquire lock - // setup surface - // when SCREEN_CHANGED arrives: - // destroy surface - // release lock - // back to acquire lock - static final int configSpec[] = { + // Surface creation: + // GUI thread: create surface, release lock + // ScummVM thread: acquire lock (block), read surface + // + // Surface deletion: + // GUI thread: post event, acquire lock (block), return + // ScummVM thread: read event, free surface, release lock + // + // In other words, ScummVM thread does this: + // acquire lock + // setup surface + // when SCREEN_CHANGED arrives: + // destroy surface + // release lock + // back to acquire lock + static final int configSpec[] = { EGL10.EGL_RED_SIZE, 5, EGL10.EGL_GREEN_SIZE, 5, EGL10.EGL_BLUE_SIZE, 5, EGL10.EGL_DEPTH_SIZE, 0, EGL10.EGL_SURFACE_TYPE, EGL10.EGL_WINDOW_BIT, EGL10.EGL_NONE, - }; - EGL10 egl; - EGLDisplay eglDisplay = EGL10.EGL_NO_DISPLAY; - EGLConfig eglConfig; - EGLContext eglContext = EGL10.EGL_NO_CONTEXT; - EGLSurface eglSurface = EGL10.EGL_NO_SURFACE; - Semaphore surfaceLock = new Semaphore(0, true); - SurfaceHolder nativeSurface; - - public void surfaceCreated(SurfaceHolder holder) { + }; + EGL10 egl; + EGLDisplay eglDisplay = EGL10.EGL_NO_DISPLAY; + EGLConfig eglConfig; + EGLContext eglContext = EGL10.EGL_NO_CONTEXT; + EGLSurface eglSurface = EGL10.EGL_NO_SURFACE; + Semaphore surfaceLock = new Semaphore(0, true); + SurfaceHolder nativeSurface; + + public void surfaceCreated(SurfaceHolder holder) { nativeSurface = holder; surfaceLock.release(); - } + } - public void surfaceChanged(SurfaceHolder holder, int format, + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // Disabled while I debug GL problems //pushEvent(new Event(Event.EVENT_SCREEN_CHANGED)); - } + } - public void surfaceDestroyed(SurfaceHolder holder) { + public void surfaceDestroyed(SurfaceHolder holder) { pushEvent(new Event(Event.EVENT_SCREEN_CHANGED)); try { surfaceLock.acquire(); @@ -104,10 +107,10 @@ public class ScummVM implements SurfaceHolder.Callback { Log.e(this.toString(), "Interrupted while waiting for surface lock", e); } - } + } - // Called by ScummVM thread (from initBackend) - private void createScummVMGLContext() { + // Called by ScummVM thread (from initBackend) + private void createScummVMGLContext() { egl = (EGL10)EGLContext.getEGL(); eglDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); int[] version = new int[2]; @@ -126,10 +129,11 @@ public class ScummVM implements SurfaceHolder.Callback { eglContext = egl.eglCreateContext(eglDisplay, eglConfig, EGL10.EGL_NO_CONTEXT, null); - } + } - // Called by ScummVM thread - protected void setupScummVMSurface() { + // Called by ScummVM thread + static private boolean _log_version = true; + protected void setupScummVMSurface() { try { surfaceLock.acquire(); } catch (InterruptedException e) { @@ -140,10 +144,30 @@ public class ScummVM implements SurfaceHolder.Callback { eglSurface = egl.eglCreateWindowSurface(eglDisplay, eglConfig, nativeSurface, null); egl.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext); - } - // Called by ScummVM thread - protected void destroyScummVMSurface() { + GL10 gl = (GL10)eglContext.getGL(); + + if (_log_version) { + Log.i(LOG_TAG, String.format("Using EGL %s (%s); GL %s/%s (%s)", + egl.eglQueryString(eglDisplay, EGL10.EGL_VERSION), + egl.eglQueryString(eglDisplay, EGL10.EGL_VENDOR), + gl.glGetString(GL10.GL_VERSION), + gl.glGetString(GL10.GL_RENDERER), + gl.glGetString(GL10.GL_VENDOR))); + _log_version = false; // only log this once + } + + int[] value = new int[1]; + egl.eglQuerySurface(eglDisplay, eglSurface, EGL10.EGL_WIDTH, value); + int width = value[0]; + egl.eglQuerySurface(eglDisplay, eglSurface, EGL10.EGL_HEIGHT, value); + int height = value[0]; + Log.i(LOG_TAG, String.format("New surface is %dx%d", width, height)); + setSurfaceSize(width, height); + } + + // Called by ScummVM thread + protected void destroyScummVMSurface() { if (eglSurface != null) { egl.eglMakeCurrent(eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); @@ -152,16 +176,28 @@ public class ScummVM implements SurfaceHolder.Callback { } surfaceLock.release(); - } + } - public void setSurface(SurfaceHolder holder) { + public void setSurface(SurfaceHolder holder) { holder.addCallback(this); - } + } + + final public boolean swapBuffers() { + if (!egl.eglSwapBuffers(eglDisplay, eglSurface)) { + int error = egl.eglGetError(); + Log.w(LOG_TAG, String.format("eglSwapBuffers exited with error 0x%x", error)); + if (error == EGL11.EGL_CONTEXT_LOST) + return false; + } + return true; + } // Set scummvm config options final public native static void loadConfigFile(String path); final public native static void setConfMan(String key, int value); final public native static void setConfMan(String key, String value); + final public native void enableZoning(boolean enable); + final public native void setSurfaceSize(int width, int height); // Feed an event to ScummVM. Safe to call from other threads. final public native void pushEvent(Event e); @@ -179,10 +215,10 @@ public class ScummVM implements SurfaceHolder.Callback { protected void showVirtualKeyboard(boolean enable) {} protected String[] getSysArchives() { return new String[0]; } protected String[] getPluginDirectories() { return new String[0]; } - protected void initBackend() throws AudioSetupException { + protected void initBackend() throws AudioSetupException { createScummVMGLContext(); initAudio(); - } + } private static class AudioThread extends Thread { final private int buf_size; @@ -239,7 +275,7 @@ public class ScummVM implements SurfaceHolder.Callback { break; } else if (ret != len) { Log.w(LOG_TAG, String.format( - "Short audio write. Wrote %dB, not %dB", + "Short audio write. Wrote %dB, not %dB", ret, buf.length)); // Buffer is full, so yield cpu for a while Thread.sleep(100); diff --git a/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java b/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java index fb3cd6348f..b37b2b8a52 100644 --- a/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java +++ b/backends/platform/android/org/inodes/gus/scummvm/ScummVMActivity.java @@ -1,7 +1,7 @@ package org.inodes.gus.scummvm; -import android.app.AlertDialog; import android.app.Activity; +import android.app.AlertDialog; import android.content.DialogInterface; import android.content.res.Configuration; import android.media.AudioManager; @@ -9,13 +9,14 @@ import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; +import android.util.DisplayMetrics; import android.util.Log; -import android.view.inputmethod.InputMethodManager; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.SurfaceView; import android.view.View; import android.view.ViewConfiguration; +import android.view.inputmethod.InputMethodManager; import android.widget.Toast; import java.io.IOException; @@ -31,8 +32,27 @@ public class ScummVMActivity extends Activity { private class MyScummVM extends ScummVM { private boolean scummvmRunning = false; + private boolean usingSmallScreen() { + // Multiple screen sizes came in with Android 1.6. Have + // to use reflection in order to continue supporting 1.5 + // devices :( + DisplayMetrics metrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(metrics); + try { + // This 'density' term is very confusing. + int DENSITY_LOW = metrics.getClass().getField("DENSITY_LOW").getInt(null); + int densityDpi = metrics.getClass().getField("densityDpi").getInt(metrics); + return densityDpi <= DENSITY_LOW; + } catch (Exception e) { + return false; + } + } + public MyScummVM() { super(ScummVMActivity.this); + + // Enable ScummVM zoning on 'small' screens. + enableZoning(usingSmallScreen()); } @Override diff --git a/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java b/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java index efa3e1d2ef..7280aac7d4 100644 --- a/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java +++ b/backends/platform/android/org/inodes/gus/scummvm/Unpacker.java @@ -34,6 +34,7 @@ import java.util.zip.ZipFile; import java.util.zip.ZipEntry; public class Unpacker extends Activity { + private final static boolean PLUGINS_ENABLED = true; private final static String META_NEXT_ACTIVITY = "org.inodes.gus.unpacker.nextActivity"; private ProgressBar mProgress; @@ -79,7 +80,6 @@ public class Unpacker extends Activity { if (cn != null) { final Intent origIntent = getIntent(); Intent intent = new Intent(); - intent.setPackage(origIntent.getPackage()); intent.setComponent(cn); if (origIntent.getExtras() != null) intent.putExtras(origIntent.getExtras()); @@ -294,7 +294,7 @@ public class Unpacker extends Activity { Intent intent = new Intent(ScummVMApplication.ACTION_PLUGIN_QUERY); List<ResolveInfo> plugins = getPackageManager() .queryBroadcastReceivers(intent, 0); - if (plugins.isEmpty()) { + if (PLUGINS_ENABLED && plugins.isEmpty()) { // No plugins installed AlertDialog.Builder alert = new AlertDialog.Builder(this) .setTitle(R.string.no_plugins_title) diff --git a/backends/platform/android/video.cpp b/backends/platform/android/video.cpp new file mode 100644 index 0000000000..d4c002fbd0 --- /dev/null +++ b/backends/platform/android/video.cpp @@ -0,0 +1,334 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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; either version 2 + * of the License, or (at your option) any later version. + + * 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 for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/null/null.cpp $ + * $Id: null.cpp 34912 2008-11-06 15:02:50Z fingolfin $ + * + */ + +#include "base/main.h" +#include "graphics/surface.h" + +#include <GLES/gl.h> +#include <GLES/glext.h> + +#include <android/log.h> + +#include "common/rect.h" +#include "common/array.h" +#include "common/util.h" +#include "common/tokenizer.h" + +#include "backends/platform/android/video.h" + +#undef LOG_TAG +#define LOG_TAG "ScummVM-video" + +#if 0 +#define ENTER(args...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, args) +#else +#define ENTER(args...) /**/ +#endif + +#if 0 +#define CHECK_GL_ERROR() checkGlError(__FILE__, __LINE__) +static const char* getGlErrStr(GLenum error) { + switch (error) { + case GL_NO_ERROR: return "GL_NO_ERROR"; + case GL_INVALID_ENUM: return "GL_INVALID_ENUM"; + case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION"; + case GL_STACK_OVERFLOW: return "GL_STACK_OVERFLOW"; + case GL_STACK_UNDERFLOW: return "GL_STACK_UNDERFLOW"; + case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY"; + } + + static char buf[40]; + snprintf(buf, sizeof(buf), "(Unknown GL error code 0x%x)", error); + return buf; +} +static void checkGlError(const char* file, int line) { + GLenum error = glGetError(); + if (error != GL_NO_ERROR) + warning("%s:%d: GL error: %s", file, line, getGlErrStr(error)); +} +#else +#define CHECK_GL_ERROR() do {} while (false) +#endif + +// Supported GL extensions +static bool npot_supported = false; +#ifdef GL_OES_draw_texture +static bool draw_tex_supported = false; +#endif + +static inline GLfixed xdiv(int numerator, int denominator) { + assert(numerator < (1<<16)); + return (numerator << 16) / denominator; +} + +template <class T> +static T nextHigher2(T k) { + if (k == 0) + return 1; + --k; + for (uint i = 1; i < sizeof(T)*CHAR_BIT; i <<= 1) + k = k | k >> i; + return k + 1; +} + +void GLESTexture::initGLExtensions() { + const char* ext_string = + reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)); + __android_log_print(ANDROID_LOG_INFO, LOG_TAG, + "Extensions: %s", ext_string); + Common::StringTokenizer tokenizer(ext_string, " "); + while (!tokenizer.empty()) { + Common::String token = tokenizer.nextToken(); + if (token == "GL_ARB_texture_non_power_of_two") + npot_supported = true; +#ifdef GL_OES_draw_texture + if (token == "GL_OES_draw_texture") + draw_tex_supported = true; +#endif + } +} + +GLESTexture::GLESTexture() : + _texture_width(0), + _texture_height(0), + _all_dirty(true) +{ + glGenTextures(1, &_texture_name); + // This all gets reset later in allocBuffer: + _surface.w = 0; + _surface.h = 0; + _surface.pitch = _texture_width; + _surface.pixels = NULL; + _surface.bytesPerPixel = 0; +} + +GLESTexture::~GLESTexture() { + debug("Destroying texture %u", _texture_name); + glDeleteTextures(1, &_texture_name); +} + +void GLESTexture::reinitGL() { + glGenTextures(1, &_texture_name); + setDirty(); +} + +void GLESTexture::allocBuffer(GLuint w, GLuint h) { + CHECK_GL_ERROR(); + int bpp = bytesPerPixel(); + _surface.w = w; + _surface.h = h; + _surface.bytesPerPixel = bpp; + + if (w <= _texture_width && h <= _texture_height) + // Already allocated a sufficiently large buffer + return; + + if (npot_supported) { + _texture_width = _surface.w; + _texture_height = _surface.h; + } else { + _texture_width = nextHigher2(_surface.w); + _texture_height = nextHigher2(_surface.h); + } + _surface.pitch = _texture_width * bpp; + + // Allocate room for the texture now, but pixel data gets uploaded + // later (perhaps with multiple TexSubImage2D operations). + CHECK_GL_ERROR(); + glBindTexture(GL_TEXTURE_2D, _texture_name); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + CHECK_GL_ERROR(); + glTexImage2D(GL_TEXTURE_2D, 0, glFormat(), + _texture_width, _texture_height, + 0, glFormat(), glType(), NULL); + CHECK_GL_ERROR(); +} + +void GLESTexture::updateBuffer(GLuint x, GLuint y, GLuint w, GLuint h, + const void* buf, int pitch) { + ENTER("updateBuffer(%u, %u, %u, %u, %p, %d)", x, y, w, h, buf, pitch); + glBindTexture(GL_TEXTURE_2D, _texture_name); + + setDirtyRect(Common::Rect(x, y, x+w, y+h)); + + if (static_cast<int>(w) * bytesPerPixel() == pitch) { + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, + glFormat(), glType(), buf); + } else { + // GLES removed the ability to specify pitch, so we + // have to do this row by row. + const byte* src = static_cast<const byte*>(buf); + do { + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, + w, 1, glFormat(), glType(), src); + ++y; + src += pitch; + } while (--h); + } +} + +void GLESTexture::fillBuffer(byte x) { + byte tmpbuf[_surface.h * _surface.w * bytesPerPixel()]; + memset(tmpbuf, 0, _surface.h * _surface.w * bytesPerPixel()); + glBindTexture(GL_TEXTURE_2D, _texture_name); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _surface.w, _surface.h, + glFormat(), glType(), tmpbuf); + setDirty(); +} + +void GLESTexture::drawTexture(GLshort x, GLshort y, GLshort w, GLshort h) { + glBindTexture(GL_TEXTURE_2D, _texture_name); + +#ifdef GL_OES_draw_texture + // Great extension, but only works under specific conditions. + // Still a work-in-progress - disabled for now. + if (false && draw_tex_supported && paletteSize() == 0) { + //glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + const GLint crop[4] = {0, _surface.h, _surface.w, -_surface.h}; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); + glDrawTexiOES(x, y, 0, w, h); + } else +#endif + { + const GLfixed tex_width = xdiv(_surface.w, _texture_width); + const GLfixed tex_height = xdiv(_surface.h, _texture_height); + const GLfixed texcoords[] = { + 0, 0, + tex_width, 0, + 0, tex_height, + tex_width, tex_height, + }; + glTexCoordPointer(2, GL_FIXED, 0, texcoords); + + const GLshort vertices[] = { + x, y, + x+w, y, + x, y+h, + x+w, y+h, + }; + glVertexPointer(2, GL_SHORT, 0, vertices); + + assert(ARRAYSIZE(vertices) == ARRAYSIZE(texcoords)); + glDrawArrays(GL_TRIANGLE_STRIP, 0, ARRAYSIZE(vertices)/2); + } + + _all_dirty = false; + _dirty_rect = Common::Rect(); +} + +GLESPaletteTexture::GLESPaletteTexture() : + GLESTexture(), + _texture(NULL) +{ +} + +GLESPaletteTexture::~GLESPaletteTexture() { + delete[] _texture; +} + +void GLESPaletteTexture::allocBuffer(GLuint w, GLuint h) { + CHECK_GL_ERROR(); + int bpp = bytesPerPixel(); + _surface.w = w; + _surface.h = h; + _surface.bytesPerPixel = bpp; + + if (w <= _texture_width && h <= _texture_height) + // Already allocated a sufficiently large buffer + return; + + if (npot_supported) { + _texture_width = _surface.w; + _texture_height = _surface.h; + } else { + _texture_width = nextHigher2(_surface.w); + _texture_height = nextHigher2(_surface.h); + } + _surface.pitch = _texture_width * bpp; + + // Texture gets uploaded later (from drawTexture()) + + byte* new_buffer = new byte[paletteSize() + + _texture_width * _texture_height * bytesPerPixel()]; + if (_texture) { + memcpy(new_buffer, _texture, paletteSize()); // preserve palette + delete[] _texture; + } + _texture = new_buffer; + _surface.pixels = _texture + paletteSize(); +} + +void GLESPaletteTexture::fillBuffer(byte x) { + assert(_surface.pixels); + memset(_surface.pixels, x, _surface.pitch * _surface.h); + setDirty(); +} + +void GLESPaletteTexture::updateBuffer(GLuint x, GLuint y, + GLuint w, GLuint h, + const void* buf, int pitch) { + _all_dirty = true; + + const byte* src = static_cast<const byte*>(buf); + byte* dst = static_cast<byte*>(_surface.getBasePtr(x, y)); + do { + memcpy(dst, src, w * bytesPerPixel()); + dst += _surface.pitch; + src += pitch; + } while (--h); +} + +void GLESPaletteTexture::uploadTexture() const { + const size_t texture_size = + paletteSize() + _texture_width * _texture_height * bytesPerPixel(); + glCompressedTexImage2D(GL_TEXTURE_2D, 0, glType(), + _texture_width, _texture_height, + 0, texture_size, _texture); + CHECK_GL_ERROR(); +} + +void GLESPaletteTexture::drawTexture(GLshort x, GLshort y, GLshort w, GLshort h) { + if (_all_dirty) { + glBindTexture(GL_TEXTURE_2D, _texture_name); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + CHECK_GL_ERROR(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + CHECK_GL_ERROR(); + uploadTexture(); + _all_dirty = false; + } + + GLESTexture::drawTexture(x, y, w, h); +} diff --git a/backends/platform/android/video.h b/backends/platform/android/video.h new file mode 100644 index 0000000000..ee707e4cb5 --- /dev/null +++ b/backends/platform/android/video.h @@ -0,0 +1,140 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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; either version 2 + * of the License, or (at your option) any later version. + + * 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 for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/null/null.cpp $ + * $Id: null.cpp 34912 2008-11-06 15:02:50Z fingolfin $ + * + */ + +#if defined(ANDROID) + +#include <GLES/gl.h> + +#include "graphics/surface.h" + +#include "common/rect.h" +#include "common/array.h" + +class GLESTexture { +public: + static void initGLExtensions(); + + GLESTexture(); + virtual ~GLESTexture(); + virtual void reinitGL(); + virtual void allocBuffer(GLuint width, GLuint height); + const Graphics::Surface* surface_const() const { return &_surface; } + GLuint width() const { return _surface.w; } + GLuint height() const { return _surface.h; } + GLuint texture_name() const { return _texture_name; } + bool dirty() const { return _all_dirty || !_dirty_rect.isEmpty(); } + virtual void updateBuffer(GLuint x, GLuint y, GLuint width, GLuint height, + const void* buf, int pitch); + virtual void fillBuffer(byte x); + virtual void drawTexture() { + drawTexture(0, 0, _surface.w, _surface.h); + } + virtual void drawTexture(GLshort x, GLshort y, GLshort w, GLshort h); + +protected: + virtual byte bytesPerPixel() const = 0; + virtual GLenum glFormat() const = 0; + virtual GLenum glType() const = 0; + virtual size_t paletteSize() const { return 0; }; + void setDirty() { + _all_dirty = true; + _dirty_rect = Common::Rect(); + } + void setDirtyRect(const Common::Rect& r) { + if (!_all_dirty) { + if (_dirty_rect.isEmpty()) + _dirty_rect = r; + else + _dirty_rect.extend(r); + } + } + GLuint _texture_name; + Graphics::Surface _surface; + GLuint _texture_width; + GLuint _texture_height; + bool _all_dirty; + Common::Rect _dirty_rect; // Covers dirty area +}; + +// RGBA4444 texture +class GLES4444Texture : public GLESTexture { +protected: + virtual byte bytesPerPixel() const { return 2; } + virtual GLenum glFormat() const { return GL_RGBA; } + virtual GLenum glType() const { return GL_UNSIGNED_SHORT_4_4_4_4; } +}; + +// RGB565 texture +class GLES565Texture : public GLESTexture { +protected: + virtual byte bytesPerPixel() const { return 2; } + virtual GLenum glFormat() const { return GL_RGB; } + virtual GLenum glType() const { return GL_UNSIGNED_SHORT_5_6_5; } +}; + +// RGB888 256-entry paletted texture +class GLESPaletteTexture : public GLESTexture { +public: + GLESPaletteTexture(); + virtual ~GLESPaletteTexture(); + virtual void allocBuffer(GLuint width, GLuint height); + virtual void updateBuffer(GLuint x, GLuint y, GLuint width, GLuint height, + const void* buf, int pitch); + Graphics::Surface* surface() { + setDirty(); + return &_surface; + } + void* pixels() { + setDirty(); + return _surface.pixels; + } + const byte* palette_const() const { return _texture; }; + byte* palette() { + setDirty(); + return _texture; + }; + virtual void drawTexture() { + drawTexture(0, 0, _surface.w, _surface.h); + } + virtual void drawTexture(GLshort x, GLshort y, GLshort w, GLshort h); + virtual void fillBuffer(byte x); +protected: + virtual byte bytesPerPixel() const { return 1; } + virtual GLenum glFormat() const { return GL_RGB; } + virtual GLenum glType() const { return GL_PALETTE8_RGB8_OES; } + virtual size_t paletteSize() const { return 256 * 3; }; + virtual void uploadTexture() const; + byte* _texture; +}; + +// RGBA8888 256-entry paletted texture +class GLESPaletteATexture : public GLESPaletteTexture { +protected: + virtual GLenum glFormat() const { return GL_RGBA; } + virtual GLenum glType() const { return GL_PALETTE8_RGBA8_OES; } + virtual size_t paletteSize() const { return 256 * 4; }; +}; + +#endif diff --git a/backends/platform/dc/dc.h b/backends/platform/dc/dc.h index 8a122ebb27..e87a0a8c90 100644 --- a/backends/platform/dc/dc.h +++ b/backends/platform/dc/dc.h @@ -86,7 +86,7 @@ class OSystem_Dreamcast : private DCHardware, public BaseBackend, public Filesys Graphics::PixelFormat getScreenFormat() const; // Returns a list of all pixel formats supported by the backend. - Common::List<Graphics::PixelFormat> getSupportedFormats(); + Common::List<Graphics::PixelFormat> getSupportedFormats() const; // Set the size of the video bitmap. // Typically, 320x200 diff --git a/backends/platform/dc/display.cpp b/backends/platform/dc/display.cpp index 35fc94b3cc..53dbff333d 100644 --- a/backends/platform/dc/display.cpp +++ b/backends/platform/dc/display.cpp @@ -198,7 +198,7 @@ Graphics::PixelFormat OSystem_Dreamcast::getScreenFormat() const return screenFormats[_screenFormat]; } -Common::List<Graphics::PixelFormat> OSystem_Dreamcast::getSupportedFormats() +Common::List<Graphics::PixelFormat> OSystem_Dreamcast::getSupportedFormats() const { Common::List<Graphics::PixelFormat> list; unsigned i; diff --git a/backends/platform/ds/arm7/source/main.cpp b/backends/platform/ds/arm7/source/main.cpp index a4cde02ba6..bcaaf8e936 100644 --- a/backends/platform/ds/arm7/source/main.cpp +++ b/backends/platform/ds/arm7/source/main.cpp @@ -8,17 +8,19 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * - * $Header: /cvsroot/scummvm/scummvm/backends/fs/fs.cpp,v 1.3.2.1 2004/12/18 02:33:52 fingolfin Exp $ */ ////////////////////////////////////////////////////////////////////// @@ -58,10 +60,10 @@ s32 TOUCH_HEIGHT = TOUCH_CAL_Y2 - TOUCH_CAL_Y1; s32 TOUCH_OFFSET_X = ( ((SCREEN_WIDTH -60) * TOUCH_CAL_X1) / TOUCH_WIDTH ) - 28; s32 TOUCH_OFFSET_Y = ( ((SCREEN_HEIGHT-60) * TOUCH_CAL_Y1) / TOUCH_HEIGHT ) - 28; -vu8* soundData; +vu8 *soundData; -vu8* soundBuffer; -vu8* arm9Buffer; +vu8 *soundBuffer; +vu8 *arm9Buffer; bool soundFilled[4]; int playingSection; @@ -81,7 +83,7 @@ int adpcmBufferNum = 0; ////////////////////////////////////////////////////////////////////// /* -void startSound(int sampleRate, const void* data, uint32 bytes, u8 channel=0, u8 vol=0x7F, u8 pan=63, u8 format=0) { +void startSound(int sampleRate, const void *data, uint32 bytes, u8 channel=0, u8 vol=0x7F, u8 pan=63, u8 format=0) { SCHANNEL_TIMER(channel) = SOUND_FREQ(sampleRate); SCHANNEL_SOURCE(channel) = (uint32)data; SCHANNEL_LENGTH(channel) = bytes; @@ -106,7 +108,7 @@ s8 getFreeSoundChannel() { return -1; } -void startSound(int sampleRate, const void* data, uint32 bytes, u8 channel=0, u8 vol=0x7F, u8 pan=63, u8 format=0) { +void startSound(int sampleRate, const void *data, uint32 bytes, u8 channel=0, u8 vol=0x7F, u8 pan=63, u8 format=0) { // REG_IME = IME_DISABLE; channel = getFreeSoundChannel(); @@ -177,7 +179,7 @@ void startSound(int sampleRate, const void* data, uint32 bytes, u8 channel=0, u8 - soundData = (vu8* ) data; + soundData = (vu8 *) data; SCHANNEL_CR(channel) = flags; SCHANNEL_CR(channel + 2) = flags; @@ -386,7 +388,7 @@ void InterruptTimer1() { //if ((!soundFilled[r]) && (!IPC->fillNeeded[playingSection])) { memcpy((void *) (soundBuffer + (r * 1024)), (void *) (arm9Buffer + (r * 1024)), 1024); - vu16* p = (vu16 *) (soundBuffer); + vu16 *p = (vu16 *) (soundBuffer); //for (int t = 0; t < 2048; t++) { // *(p + t) = (t & 1)? 0xF000: 0x0000; //} diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index 7f03f4c310..079e23aec0 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -113,9 +113,6 @@ ifdef DS_BUILD_A DEFINES = -DDS_SCUMM_BUILD -DDS_BUILD_A -DUSE_ARM_GFX_ASM -DUSE_ARM_COSTUME_ASM LOGO = logoa.bmp ENABLE_SCUMM = STATIC_PLUGIN - DEFINES += -DENABLE_SCUMM=STATIC_PLUGIN - MODULES += engines/scumm - USE_ARM_GFX_ASM = 1 BUILD=scummvm-A endif @@ -202,7 +199,6 @@ endif #endif ARM7BIN := -7 $(CURDIR)/../../arm7/arm7.bin -ICON := -b ../../../logo.bmp "ScummVM;By Neil Millstone;" CC = arm-eabi-gcc CXX = arm-eabi-g++ @@ -248,9 +244,6 @@ endif DEFINES += -DREDUCE_MEMORY_USAGE -# Removed, as these are done in portdefs.h -# -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE - LDFLAGS = -specs=ds_arm9.specs -mthumb-interwork -mno-fpu -Wl,-Map,map.txt -Wl,--gc-sections ifdef WRAP_MALLOC @@ -260,7 +253,7 @@ endif INCLUDES= -I$(portdir)/$(BUILD) -I$(srcdir) -I$(srcdir)/engines \ -I$(portdir)/data -I$(portdir)/../commoninclude \ - -I$(portdir)/source -I$(portdir)/source/mad -I$(portdir)/source/libcartreset \ + -I$(portdir)/source -I$(portdir)/source/mad \ -I$(libndsdir)/include -include $(srcdir)/common/scummsys.h @@ -272,12 +265,7 @@ ifdef USE_DEBUGGER LIBS += -ldsdebugger -ldswifi9 endif -#-Lscumm -lscumm -Lbase -lbase -Lcommon -lcommon -Lgraphics -lgraphics -Lgui -lgui -Lsound -lsound EXECUTABLE = scummvm.elf -PLUGIN_PREFIX = -PLUGIN_SUFFIX = .plg -PLUGIN_EXTRA_DEPS = plugin.x plugin.syms scummvm.elf -PLUGIN_LDFLAGS = -nostartfiles -Wl,-q,-Tplugin.x,--just-symbols,scummvm.elf,--retain-symbols-file,plugin.syms -L$(ronindir)/lib MKDIR = mkdir -p RM = rm -f RM_REC = rm -rf @@ -287,73 +275,69 @@ OBJCOPY = arm-eabi-objcopy AS = arm-eabi-as HAVE_GCC3 = true -ifdef DYNAMIC_MODULES -DEFINES += -DDYNAMIC_MODULES -PRE_OBJS_FLAGS = -Wl,--whole-archive -POST_OBJS_FLAGS = -Wl,--no-whole-archive -endif - -PORT_OBJS := $(portdir)/source/blitters_arm.o $(portdir)/source/cdaudio.o $(portdir)/source/dsmain.o \ - $(portdir)/../../../fs/ds/ds-fs.o $(portdir)/source/gbampsave.o $(portdir)/source/scummhelp.o\ - $(portdir)/source/osystem_ds.o $(portdir)/source/portdefs.o $(portdir)/source/ramsave.o\ - $(portdir)/source/touchkeyboard.o $(portdir)/source/zipreader.o\ - $(portdir)/source/dsoptions.o $(portdir)/source/keys.o $(portdir)/source/wordcompletion.o\ - $(portdir)/source/interrupt.o +PORT_OBJS := \ + $(portdir)/source/blitters_arm.o \ + $(portdir)/source/cdaudio.o \ + $(portdir)/source/dsmain.o \ + $(portdir)/../../../fs/ds/ds-fs.o \ + $(portdir)/source/gbampsave.o \ + $(portdir)/source/scummhelp.o \ + $(portdir)/source/osystem_ds.o \ + $(portdir)/source/touchkeyboard.o \ + $(portdir)/source/zipreader.o \ + $(portdir)/source/dsoptions.o \ + $(portdir)/source/keys.o \ + $(portdir)/source/wordcompletion.o \ + $(portdir)/source/interrupt.o ifdef USE_PROFILER PORT_OBJS += $(portdir)/source/profiler/cyg-profile.o endif -DATA_OBJS := $(portdir)/data/icons.o $(portdir)/data/keyboard.o $(portdir)/data/keyboard_pal.o $(portdir)/data/default_font.o $(portdir)/data/8x8font_tga.o - -COMPRESSOR_OBJS := -#$(portdir)/source/compressor/lz.o +DATA_OBJS := + $(portdir)/data/icons.o \ + $(portdir)/data/keyboard.o \ + $(portdir)/data/keyboard_pal.o \ + $(portdir)/data/default_font.o \ + $(portdir)/data/8x8font_tga.o + +FAT_OBJS := + $(portdir)/source/fat/disc_io.o \ + $(portdir)/source/fat/gba_nds_fat.o \ + $(portdir)/source/fat/io_fcsr.o \ + $(portdir)/source/fat/io_m3cf.o \ + $(portdir)/source/fat/io_mpcf.o \ + $(portdir)/source/fat/io_sccf.o \ + $(portdir)/source/fat/io_m3sd.o \ + $(portdir)/source/fat/io_nmmc.o \ + $(portdir)/source/fat/io_scsd.o \ + $(portdir)/source/fat/io_scsd_asm.o \ + $(portdir)/source/fat/io_njsd.o \ + $(portdir)/source/fat/io_mmcf.o \ + $(portdir)/source/fat/io_sd_common.o \ + $(portdir)/source/fat/io_m3_common.o \ + $(portdir)/source/fat/io_dldi.o \ + $(portdir)/source/fat/m3sd.o -FAT_OBJS := $(portdir)/source/fat/disc_io.o $(portdir)/source/fat/gba_nds_fat.o\ - $(portdir)/source/fat/io_fcsr.o $(portdir)/source/fat/io_m3cf.o\ - $(portdir)/source/fat/io_mpcf.o $(portdir)/source/fat/io_sccf.o\ - $(portdir)/source/fat/io_m3sd.o\ - $(portdir)/source/fat/io_nmmc.o $(portdir)/source/fat/io_scsd.o \ - $(portdir)/source/fat/io_scsd_asm.o \ - $(portdir)/source/fat/io_njsd.o \ - $(portdir)/source/fat/io_mmcf.o \ - $(portdir)/source/fat/io_sd_common.o \ - $(portdir)/source/fat/io_m3_common.o \ - $(portdir)/source/fat/io_dldi.o \ - $(portdir)/source/fat/m3sd.o - - -# $(portdir)/source/fat/io_cf_common.o $(portdir)/source/fat/io_m3_common.o\ -# $(portdir)/source/fat/io_sd_common.o $(portdir)/source/fat/io_scsd_s.o \ -# $(portdir)/source/fat/io_sc_common.o $(portdir)/source/fat/io_sd_common.o - -LIBCARTRESET_OBJS := -#$(portdir)/source/libcartreset/cartreset.o # Files in this list will be optimisied for speed, otherwise they will be optimised for space -OPTLIST := actor.cpp ds_main.cpp osystem_ds.cpp blitters.cpp mame.cpp rate.cpp isomap.cpp image.cpp gfx.cpp sprite.cpp actor_path.cpp actor_walk.cpp script.cpp +OPTLIST := actor.cpp dsmain.cpp osystem_ds.cpp blitters.cpp mame.cpp rate.cpp isomap.cpp image.cpp gfx.cpp sprite.cpp actor_path.cpp actor_walk.cpp script.cpp #OPTLIST := # Compiler options for files which should be optimised for speed ifdef DS_BUILD_E -# Another attempt to save some RAM in ITE -OPT_SPEED := -O3 -mthumb + # Another attempt to save some RAM in ITE + OPT_SPEED := -O3 -mthumb else -#OPT_SPEED := -O3 - -OPT_SPEED := -Os -mthumb - + OPT_SPEED := -O3 endif # Compiler options for files which should be optimised for space OPT_SIZE := -Os -mthumb -#-mthumb -fno-gcse -fno-schedule-insns2 - - -OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) $(FAT_OBJS) +OBJS := $(DATA_OBJS) $(PORT_OBJS) $(FAT_OBJS) @@ -361,7 +345,7 @@ MODULE_DIRS += . ndsall: @[ -d $(BUILD) ] || mkdir -p $(BUILD) - make -C ./$(BUILD) -f ../makefile scummvm.nds + make -C ./$(BUILD) -f ../makefile scummvm.nds scummvm.ds.gba include $(srcdir)/Makefile.common @@ -372,25 +356,12 @@ clean: $(RM) $(OBJS) $(EXECUTABLE) rm -fr $(BUILD) -plugin_dist : - find . -name '*.plg' | while read p; do \ - sh-elf-strip -g -o "`basename \"$$p\" | tr '[:lower:]' '[:upper:]'`" "$$p"; \ - done - dist : SCUMMVM.BIN plugins plugin_dist #--------------------------------------------------------------------------------- # canned command sequence for binary data #--------------------------------------------------------------------------------- -#define bin2o -# bin2s $< | $(AS) -mthumb -mthumb-interwork -o $(@) -# echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_raw_end[];" > `(echo $(<F) | tr . _)`.h -# echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_raw[];" >> `(echo $(<F) | tr . _)`.h -# echo "extern const u32" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_raw_size";" >> `(echo $(<F) | tr . _)`.h -#endef - - define bin2o bin2s $< | $(AS) -mthumb -mthumb-interwork -o $(@) echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(<F) | tr . _)`.h @@ -399,34 +370,10 @@ define bin2o endef -#define bin2o -# @echo $(*) -# cp $(<) $(*).tmp -# $(OBJCOPY) -I binary -O elf32-littlearm -B arm \ -# --rename-section .data=.rodata \ -# --redefine-sym _binary_$(subst .,_,$(subst /,_,$(*)))_tmp_start=$(notdir $*)\ -# --redefine-sym _binary_$(subst .,_,$(subst /,_,$(*)))_tmp_end=$(notdir $*)_end\ -# $(*).tmp $(@) -# echo "extern const u8" $(notdir $*)"[] __attribute__ ((aligned (4)));" > $(*).h -# echo "extern const u32" $(notdir $(*))_size[]";" >> $(*).h -# -# echo $(*).h -# rm $(*).tmp -#endef - - ############## # Replacement rule for the one in makefile.common ############## %.o: %.cpp -# echo !!!!!!!!!!!! $(notdir $<) -# ifeq ( $(notdir $<), $(findstring $(notdir $<), $(OPTLIST)) ) -# OPTFLAG=-O3 -# else -# OPTFLAG=-Os -# endif -# export OPTFLAG = ; -# echo !!!!!!!! $(OPTFLAG) $(MKDIR) $(*D)/$(DEPDIR) $(CXX) -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP $(if $(findstring $(notdir $<), $(OPTLIST)), $(OPT_SPEED), $(OPT_SIZE)) $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o @@ -434,12 +381,6 @@ endef #--------------------------------------------------------------------------------- #--------------------------------------------------------------------------------- -%.o : %.pcx -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - -#--------------------------------------------------------------------------------- %.o : %.bin #--------------------------------------------------------------------------------- @echo $(notdir $<) @@ -458,30 +399,16 @@ endef @$(bin2o) #--------------------------------------------------------------------------------- -%.o : %.map -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - -#--------------------------------------------------------------------------------- -%.o : %.mdl -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - -#--------------------------------------------------------------------------------- %.nds: %.bin - @echo ndstool -c $@ -9 scummvm.bin $(ARM7BIN) -b ../../$(LOGO) "$(shell basename $@);ScummVM $(VERSION);DS Port" - ndstool -c $@ -9 scummvm.bin $(ARM7BIN) -b ../../$(LOGO) "$(shell basename $@);ScummVM $(VERSION);DS Port" - dsbuild $@ -l ../ndsloader.bin + ndstool -c $@ -9 $< $(ARM7BIN) -b ../../$(LOGO) "$(@F);ScummVM $(VERSION);DS Port" - padbin 16 $(basename $@).ds.gba +%.ds.gba: %.nds + dsbuild $< -o $@ -l $(portdir)/ndsloader.bin + padbin 16 $@ #--------------------------------------------------------------------------------- -# FIXME: The following rule hardcodes the input & output filename -- shouldn't it use $< and $@ instead? %.bin: %.elf - $(OBJCOPY) -S scummvm.elf scummvm-stripped.elf - $(OBJCOPY) -O binary scummvm-stripped.elf scummvm.bin + $(OBJCOPY) -S -O binary $< $@ #%.o: %.s # $(MKDIR) $(*D)/$(DEPDIR) diff --git a/backends/platform/ds/arm9/source/blitters.cpp b/backends/platform/ds/arm9/source/blitters.cpp index 07c6b3fee1..5d29672ef6 100644 --- a/backends/platform/ds/arm9/source/blitters.cpp +++ b/backends/platform/ds/arm9/source/blitters.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -27,13 +30,13 @@ namespace DS { -void asmDrawStripToScreen(int height, int width, byte const* text, byte const* src, byte* dst, +void asmDrawStripToScreen(int height, int width, byte const *text, byte const *src, byte *dst, int vsPitch, int vmScreenWidth, int textSurfacePitch) { - - if (height <= 0) height = 1; - if (width < 4) return; - + if (height <= 0) + height = 1; + if (width < 4) + return; width &= ~4; // src = (const byte *) (((int) (src)) & (~4)); @@ -111,7 +114,7 @@ void asmDrawStripToScreen(int height, int width, byte const* text, byte const* s -void asmCopy8Col(byte* dst, int dstPitch, const byte* src, int height) { +void asmCopy8Col(byte *dst, int dstPitch, const byte *src, int height) { asm("ands r0, %3, #1\n" "addne %3, %3, #1\n" "bne roll2\n" @@ -141,22 +144,19 @@ void asmCopy8Col(byte* dst, int dstPitch, const byte* src, int height) { static bool isDivBy5Ready = false; static u32 DIV_BY_5[160]; -void ComputeDivBy5TableIFN() -{ +void ComputeDivBy5TableIFN() { if (isDivBy5Ready) return; isDivBy5Ready = true; - for (int i=0; i<160; ++i) - { + for (int i = 0; i < 160; ++i) { DIV_BY_5[i] = (2*i+5)/10; } } #ifdef PERFECT_5_TO_4_RESCALING static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3, u16 s4, - u16* dest) -{ + u16 *dest) { u32 bs0 = s0 & 0x1F; u32 bs1 = s1 & 0x1F; u32 bs2 = s2 & 0x1F; @@ -230,8 +230,7 @@ static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3 } #else static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3, u16 s4, - u16* dest) -{ + u16 *dest) { static const u32 MASK = 0x03E07C1F; u32 argbargbs0 = u32(s0) | (u32(s0) << 16); @@ -279,8 +278,7 @@ static inline void RescaleBlock_5x1555_To_4x1555( u16 s0, u16 s1, u16 s2, u16 s3 #endif static inline void RescaleBlock_5x8888_To_4x1555( u32 s0, u32 s1, u32 s2, u32 s3, u32 s4, - u16* dest) -{ + u16 *dest) { u32 d0 = 4*s0 + s1; u32 d1 = 2*s1 + s1 + 2*s2; @@ -317,12 +315,10 @@ static inline void RescaleBlock_5x8888_To_4x1555( u32 s0, u32 s1, u32 s2, u32 s3 // Can't work in place #ifdef PERFECT_5_TO_4_RESCALING -static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16* dest, const u8* src, const u32* palette) -{ +static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16 *dest, const u8 *src, const u32 *palette) { ComputeDivBy5TableIFN(); - for (size_t i=0; i<64; ++i) - { + for (size_t i = 0; i < 64; ++i) { u32 s0 = palette[src[5*i+0]]; u32 s1 = palette[src[5*i+1]]; u32 s2 = palette[src[5*i+2]]; @@ -333,10 +329,8 @@ static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16* dest, const } } #else -static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16* dest, const u8* src, const u16* palette) -{ - for (size_t i=0; i<64; ++i) - { +static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16 *dest, const u8 *src, const u16 *palette) { + for (size_t i = 0; i < 64; ++i) { u16 s0 = palette[src[5*i+0]]; u16 s1 = palette[src[5*i+1]]; u16 s2 = palette[src[5*i+2]]; @@ -350,12 +344,10 @@ static inline void Rescale_320xPAL8Scanline_To_256x1555Scanline(u16* dest, const // Can work in place, because it's a contraction -static inline void Rescale_320x1555Scanline_To_256x1555Scanline(u16* dest, const u16* src) -{ +static inline void Rescale_320x1555Scanline_To_256x1555Scanline(u16 *dest, const u16 *src) { ComputeDivBy5TableIFN(); - for (size_t i=0; i<64; ++i) - { + for (size_t i = 0; i < 64; ++i) { u16 s0 = src[5*i+0]; u16 s1 = src[5*i+1]; u16 s2 = src[5*i+2]; @@ -367,13 +359,11 @@ static inline void Rescale_320x1555Scanline_To_256x1555Scanline(u16* dest, const } #ifdef PERFECT_5_TO_4_RESCALING -void Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStride, int srcStride, const u16* palette) -{ +void Rescale_320x256xPAL8_To_256x256x1555(u16 *dest, const u8 *src, int destStride, int srcStride, const u16 *palette) { u32 fastRam[768]; // Palette lookup -> 0_888 - for (size_t i=0; i<256; ++i) - { + for (size_t i = 0; i < 256; ++i) { u32 col = palette[i]; u32 result = col & 0x0000001F; result |= (col << 3) & 0x00001F00; @@ -382,31 +372,26 @@ void Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStri fastRam[i] = result; } - for (size_t i=0; i<200; ++i) - { + for (size_t i = 0; i < 200; ++i) { Rescale_320xPAL8Scanline_To_256x1555Scanline(dest + i*destStride, src + i *srcStride, fastRam); } } #else -void Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStride, int srcStride, const u16* palette) -{ +void Rescale_320x256xPAL8_To_256x256x1555(u16 *dest, const u8 *src, int destStride, int srcStride, const u16 *palette) { u16 fastRam[256]; - for (size_t i=0; i<128; ++i) + for (size_t i = 0; i < 128; ++i) ((u32*)fastRam)[i] = ((const u32*)palette)[i]; - for (size_t i=0; i<200; ++i) - { + for (size_t i = 0; i < 200; ++i) { Rescale_320xPAL8Scanline_To_256x1555Scanline(dest + i*destStride, src + i *srcStride, fastRam); } } #endif -void Rescale_320x256x1555_To_256x256x1555(u16* dest, const u16* src, int destStride, int srcStride) -{ - for (size_t i=0; i<200; ++i) - { +void Rescale_320x256x1555_To_256x256x1555(u16 *dest, const u16 *src, int destStride, int srcStride) { + for (size_t i = 0; i < 200; ++i) { Rescale_320x1555Scanline_To_256x1555Scanline(dest + i*destStride, src + i *srcStride); } } -} +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/blitters.h b/backends/platform/ds/arm9/source/blitters.h index 5f541d1bd6..88506a4405 100644 --- a/backends/platform/ds/arm9/source/blitters.h +++ b/backends/platform/ds/arm9/source/blitters.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -29,23 +32,23 @@ namespace DS { -void asmDrawStripToScreen(int height, int width, byte const* text, byte const* src, byte* dst, +void asmDrawStripToScreen(int height, int width, byte const *text, byte const *src, byte *dst, int vsPitch, int vmScreenWidth, int textSurfacePitch); -void asmCopy8Col(byte* dst, int dstPitch, const byte* src, int height); -void Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStride, int srcStride, const u16* palette); -void Rescale_320x256x1555_To_256x256x1555(u16* dest, const u16* src, int destStride, int srcStride); +void asmCopy8Col(byte *dst, int dstPitch, const byte *src, int height); +void Rescale_320x256xPAL8_To_256x256x1555(u16 *dest, const u8 *src, int destStride, int srcStride, const u16 *palette); +void Rescale_320x256x1555_To_256x256x1555(u16 *dest, const u16 *src, int destStride, int srcStride); -} +} // End of namespace DS #else extern "C" { -void ITCM_CODE asmDrawStripToScreen(int height, int width, byte const* text, byte const* src, byte* dst, +void ITCM_CODE asmDrawStripToScreen(int height, int width, byte const *text, byte const *src, byte *dst, int vsPitch, int vmScreenWidth, int textSurfacePitch); -void ITCM_CODE asmCopy8Col(byte* dst, int dstPitch, const byte* src, int height); -void ITCM_CODE Rescale_320x256xPAL8_To_256x256x1555(u16* dest, const u8* src, int destStride, int srcStride, const u16* palette, u32 numLines); -void ITCM_CODE Rescale_320x256x1555_To_256x256x1555(u16* dest, const u16* src, int destStride, int srcStride); +void ITCM_CODE asmCopy8Col(byte *dst, int dstPitch, const byte *src, int height); +void ITCM_CODE Rescale_320x256xPAL8_To_256x256x1555(u16 *dest, const u8 *src, int destStride, int srcStride, const u16 *palette, u32 numLines); +void ITCM_CODE Rescale_320x256x1555_To_256x256x1555(u16 *dest, const u16 *src, int destStride, int srcStride); } diff --git a/backends/platform/ds/arm9/source/cdaudio.cpp b/backends/platform/ds/arm9/source/cdaudio.cpp index 7756286117..5860dea4f2 100644 --- a/backends/platform/ds/arm9/source/cdaudio.cpp +++ b/backends/platform/ds/arm9/source/cdaudio.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -71,25 +74,25 @@ struct decoderFormat { unsigned char sample[1024]; } __attribute__ ((packed)); -bool active = false; -WaveHeader waveHeader; -Header blockHeader; -FILE* file; -int fillPos; -bool isPlayingFlag = false; +static bool s_active = false; +static WaveHeader waveHeader; +static Header blockHeader; +static FILE *s_file; +static int fillPos; +static bool isPlayingFlag = false; -s16* audioBuffer; -u32 sampleNum; -s16* decompressionBuffer; -int numLoops; -int blockCount; -int dataChunkStart; -int blocksLeft; -bool trackStartsAt2 = false; +static s16 *audioBuffer; +static u32 sampleNum; +static s16 *decompressionBuffer; +static int s_numLoops; +static int blockCount; +static int dataChunkStart; +static int blocksLeft; +static bool trackStartsAt2 = false; // These are from Microsoft's document on DVI ADPCM -const int stepTab[ 89 ] = { +static const int stepTab[ 89 ] = { 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, @@ -103,7 +106,7 @@ const int stepTab[ 89 ] = { 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767 }; -const int indexTab[ 16 ] = { -1, -1, -1, -1, 2, 4, 6, 8, +static const int indexTab[ 16 ] = { -1, -1, -1, -1, 2, 4, 6, 8, -1, -1, -1, -1, 2, 4, 6, 8 }; void playNextBlock(); @@ -115,11 +118,11 @@ void allocBuffers() { } void setActive(bool active) { - DS::CD::active = active; + s_active = active; } bool getActive() { - return active; + return s_active; } void playTrack(int track, int numLoops, int startFrame, int duration) { @@ -145,21 +148,21 @@ void playTrack(int track, int numLoops, int startFrame, int duration) { sprintf(str, "track%d.wav", track); fname = path + str; - file = DS::std_fopen(fname.c_str(), "rb"); + s_file = DS::std_fopen(fname.c_str(), "rb"); - if (!file) { + if (!s_file) { sprintf(str, "track%02d.wav", track); fname = path + str; - file = DS::std_fopen(fname.c_str(), "rb"); + s_file = DS::std_fopen(fname.c_str(), "rb"); } - if (!file) { + if (!s_file) { consolePrintf("Failed to open %s!\n", path.c_str()); return; } - DS::std_fread((const void *) &waveHeader, sizeof(waveHeader), 1, file); + DS::std_fread(&waveHeader, sizeof(waveHeader), 1, s_file); consolePrintf("File: %s\n", fname.c_str()); @@ -171,7 +174,7 @@ void playTrack(int track, int numLoops, int startFrame, int duration) { if ((waveHeader.fmtFormatTag != 17) && (waveHeader.fmtFormatTag != 20)) { consolePrintf("Wave file is in the wrong format! You must use IMA-ADPCM 4-bit mono.\n"); - DS::std_fclose(file); + DS::std_fclose(s_file); return; } @@ -183,14 +186,14 @@ void playTrack(int track, int numLoops, int startFrame, int duration) { // Skip chunks until we reach the data chunk chunkHeader chunk; - DS::std_fread((const void *) &chunk, sizeof(chunkHeader), 1, file); + DS::std_fread(&chunk, sizeof(chunkHeader), 1, s_file); while (!((chunk.name[0] == 'd') && (chunk.name[1] == 'a') && (chunk.name[2] == 't') && (chunk.name[3] == 'a'))) { - DS::std_fseek(file, chunk.size, SEEK_CUR); - DS::std_fread((const void *) &chunk, sizeof(chunkHeader), 1, file); + DS::std_fseek(s_file, chunk.size, SEEK_CUR); + DS::std_fread(&chunk, sizeof(chunkHeader), 1, s_file); } - dataChunkStart = DS::std_ftell(file); + dataChunkStart = DS::std_ftell(s_file); static bool started = false; @@ -234,14 +237,14 @@ void playTrack(int track, int numLoops, int startFrame, int duration) { // No need to seek if we're starting from the beginning if (block != 0) { - DS::std_fseek(file, dataChunkStart + block * waveHeader.fmtBlockAlign, SEEK_SET); + DS::std_fseek(s_file, dataChunkStart + block * waveHeader.fmtBlockAlign, SEEK_SET); // consolePrintf("Startframe: %d msec: %d (%d,%d)\n", startFrame, tenthssec, samples, block); } //decompressBlock(); playNextBlock(); - DS::CD::numLoops = numLoops; + s_numLoops = numLoops; } void update() { @@ -263,20 +266,20 @@ void decompressBlock() { do { - DS::std_fread((const void *) &blockHeader, sizeof(blockHeader), 1, file); + DS::std_fread(&blockHeader, sizeof(blockHeader), 1, s_file); - DS::std_fread(&block[0], waveHeader.fmtBlockAlign - sizeof(blockHeader), 1, file); + DS::std_fread(&block[0], waveHeader.fmtBlockAlign - sizeof(blockHeader), 1, s_file); - if (DS::std_feof(file) ) { + if (DS::std_feof(s_file)) { // Reached end of file, so loop - if ((numLoops == -1) || (numLoops > 1)) { + if ((s_numLoops == -1) || (s_numLoops > 1)) { // Seek file to first packet - if (numLoops != -1) { - numLoops--; + if (s_numLoops != -1) { + s_numLoops--; } - DS::std_fseek(file, dataChunkStart, SEEK_SET); + DS::std_fseek(s_file, dataChunkStart, SEEK_SET); loop = true; } else { // Fill decompression buffer with zeros to prevent glitching @@ -325,45 +328,30 @@ void decompressBlock() { int offset = 0; switch (7 - (r & 0x0007)) { - case 0: { - offset = (word & 0xF0000000) >> 28; - break; - } - - case 1: { - offset = (word & 0x0F000000) >> 24; - break; - } - - case 2: { - offset = (word & 0x00F00000) >> 20; - break; - } - - case 3: { - offset = (word & 0x000F0000) >> 16; - break; - } - - case 4: { - offset = (word & 0x0000F000) >> 12; - break; - } - - case 5: { - offset = (word & 0x00000F00) >> 8; - break; - } - - case 6: { - offset = (word & 0x000000F0) >> 4; - break; - } - - case 7: { - offset = (word & 0x0000000F); - break; - } + case 0: + offset = (word & 0xF0000000) >> 28; + break; + case 1: + offset = (word & 0x0F000000) >> 24; + break; + case 2: + offset = (word & 0x00F00000) >> 20; + break; + case 3: + offset = (word & 0x000F0000) >> 16; + break; + case 4: + offset = (word & 0x0000F000) >> 12; + break; + case 5: + offset = (word & 0x00000F00) >> 8; + break; + case 6: + offset = (word & 0x000000F0) >> 4; + break; + case 7: + offset = (word & 0x0000000F); + break; } int diff = 0; @@ -406,7 +394,8 @@ void decompressBlock() { } void playNextBlock() { - if (!isPlayingFlag) return; + if (!isPlayingFlag) + return; int lastBlockId = -1; while (IPC->adpcm.semaphore); // Wait for buffer to become free if needed @@ -442,9 +431,6 @@ void playNextBlock() { // DC_FlushAll(); } - - - } @@ -460,9 +446,10 @@ void playNextBlock() { } void stopTrack() { - if (!isPlayingFlag) return; + if (!isPlayingFlag) + return; - DS::std_fclose(file); + DS::std_fclose(s_file); isPlayingFlag = false; @@ -470,7 +457,7 @@ void stopTrack() { audioBuffer[r] = 0; } - for (int r= 0; r < waveHeader.fmtExtra; r++) { + for (int r = 0; r < waveHeader.fmtExtra; r++) { decompressionBuffer[r] = 0; } // DS::stopSound(1); @@ -495,8 +482,8 @@ bool trackExists(int num) { } consolePrintf("Looking for %s...", path.c_str()); - FILE* file; - if ((file = DS::std_fopen(path.c_str(), "r"))) { + FILE *file = DS::std_fopen(path.c_str(), "r"); + if (file) { consolePrintf("Success!\n"); setActive(true); DS::std_fclose(file); @@ -548,4 +535,4 @@ bool isPlaying() { } } -} +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/cdaudio.h b/backends/platform/ds/arm9/source/cdaudio.h index aac303dd5e..6e53ef7bd2 100644 --- a/backends/platform/ds/arm9/source/cdaudio.h +++ b/backends/platform/ds/arm9/source/cdaudio.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -35,6 +38,6 @@ bool isPlaying(); void update(); } -} +} // End of namespace DS #endif diff --git a/backends/platform/ds/arm9/source/compressor/lz.cpp b/backends/platform/ds/arm9/source/compressor/lz.cpp deleted file mode 100644 index 47a36646c6..0000000000 --- a/backends/platform/ds/arm9/source/compressor/lz.cpp +++ /dev/null @@ -1,539 +0,0 @@ -/************************************************************************* -* Name: lz.c -* Author: Marcus Geelnard -* Description: LZ77 coder/decoder implementation. -* Reentrant: Yes -* $Id$ -* -* The LZ77 compression scheme is a substitutional compression scheme -* proposed by Abraham Lempel and Jakob Ziv in 1977. It is very simple in -* its design, and uses no fancy bit level compression. -* -* This is my first attempt at an implementation of a LZ77 code/decoder. -* -* The principle of the LZ77 compression algorithm is to store repeated -* occurrences of strings as references to previous occurrences of the same -* string. The point is that the reference consumes less space than the -* string itself, provided that the string is long enough (in this -* implementation, the string has to be at least 4 bytes long, since the -* minimum coded reference is 3 bytes long). Also note that the term -* "string" refers to any kind of byte sequence (it does not have to be -* an ASCII string, for instance). -* -* The coder uses a brute force approach to finding string matches in the -* history buffer (or "sliding window", if you wish), which is very, very -* slow. I recon the complexity is somewhere between O(n^2) and O(n^3), -* depending on the input data. -* -* There is also a faster implementation that uses a large working buffer -* in which a "jump table" is stored, which is used to quickly find -* possible string matches (see the source code for LZ_CompressFast() for -* more information). The faster method is an order of magnitude faster, -* and also does a full string search in the entire input buffer (it does -* not use a sliding window). -* -* The upside is that decompression is very fast, and the compression ratio -* is often very good. -* -* The reference to a string is coded as a (length,offset) pair, where the -* length indicates the length of the string, and the offset gives the -* offset from the current data position. To distinguish between string -* references and literal strings (uncompressed bytes), a string reference -* is preceded by a marker byte, which is chosen as the least common byte -* symbol in the input data stream (this marker byte is stored in the -* output stream as the first byte). -* -* Occurrences of the marker byte in the stream are encoded as the marker -* byte followed by a zero byte, which means that occurrences of the marker -* byte have to be coded with two bytes. -* -* The lengths and offsets are coded in a variable length fashion, allowing -* values of any magnitude (up to 4294967295 in this implementation). -* -* With this compression scheme, the worst case compression result is -* (257/256)*insize + 1. -* -*------------------------------------------------------------------------- -* Copyright (c) 2003-2004 Marcus Geelnard -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would -* be appreciated but is not required. -* -* 2. Altered source versions must be plainly marked as such, and must not -* be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any source -* distribution. -* -* Marcus Geelnard -* marcus.geelnard at home.se -*************************************************************************/ - - -/************************************************************************* -* Constants used for LZ77 coding -*************************************************************************/ - -/* Maximum offset (can be any size < 2^32). Lower values gives faster - compression, while higher values gives better compression. - NOTE: LZ_CompressFast does not use this constant. */ -#define LZ_MAX_OFFSET 512 - - - -/************************************************************************* -* INTERNAL FUNCTIONS * -*************************************************************************/ - - -/************************************************************************* -* _LZ_StringCompare() - Return maximum length string match. -*************************************************************************/ - -inline static unsigned int _LZ_StringCompare( unsigned char * str1, - unsigned char * str2, unsigned int minlen, unsigned int maxlen ) -{ - unsigned int len; - - for ( len = minlen; (len < maxlen) && (str1[len] == str2[len]); ++ len ); - - return len; -} - - -/************************************************************************* -* _LZ_WriteVarSize() - Write unsigned integer with variable number of -* bytes depending on value. -*************************************************************************/ - -inline static int _LZ_WriteVarSize( unsigned int x, unsigned char * buf ) -{ - unsigned int y; - int num_bytes, i, b; - - /* Determine number of bytes needed to store the number x */ - y = x >> 3; - for ( num_bytes = 5; num_bytes >= 2; -- num_bytes ) - { - if ( y & 0xfe000000 ) break; - y <<= 7; - } - - /* Write all bytes, seven bits in each, with 8:th bit set for all */ - /* but the last byte. */ - for ( i = num_bytes-1; i >= 0; -- i ) - { - b = (x >> (i*7)) & 0x0000007f; - if ( i > 0 ) - { - b |= 0x00000080; - } - *buf ++ = (unsigned char) b; - } - - /* Return number of bytes written */ - return num_bytes; -} - - -/************************************************************************* -* _LZ_ReadVarSize() - Read unsigned integer with variable number of -* bytes depending on value. -*************************************************************************/ - -inline static int _LZ_ReadVarSize( unsigned int * x, unsigned char * buf ) -{ - unsigned int y, b, num_bytes; - - /* Read complete value (stop when byte contains zero in 8:th bit) */ - y = 0; - num_bytes = 0; - do - { - b = (unsigned int) (*buf ++); - y = (y << 7) | (b & 0x0000007f); - ++ num_bytes; - } - while ( b & 0x00000080 ); - - /* Store value in x */ - *x = y; - - /* Return number of bytes read */ - return num_bytes; -} - - - -/************************************************************************* -* PUBLIC FUNCTIONS * -*************************************************************************/ - - -/************************************************************************* -* LZ_Compress() - Compress a block of data using an LZ77 coder. -* in - Input (uncompressed) buffer. -* out - Output (compressed) buffer. This buffer must be 0.4% larger -* than the input buffer, plus one byte. -* insize - Number of input bytes. -* The function returns the size of the compressed data. -*************************************************************************/ - -int LZ_Compress( unsigned char *in, unsigned char *out, - unsigned int insize ) -{ - unsigned char marker, symbol; - unsigned int inpos, outpos, bytesleft, i; - unsigned int maxoffset, offset, bestoffset; - unsigned int maxlength, length, bestlength; - unsigned int histogram[ 256 ]; - unsigned char *ptr1, *ptr2; - - /* Do we have anything to compress? */ - if ( insize < 1 ) - { - return 0; - } - - /* Create histogram */ - for ( i = 0; i < 256; ++ i ) - { - histogram[ i ] = 0; - } - for ( i = 0; i < insize; ++ i ) - { - ++ histogram[ in[ i ] ]; - } - - /* Find the least common byte, and use it as the code marker */ - marker = 0; - for ( i = 1; i < 256; ++ i ) - { - if ( histogram[ i ] < histogram[ marker ] ) - { - marker = i; - } - } - - /* Remember the repetition marker for the decoder */ - out[ 0 ] = marker; - - /* Start of compression */ - inpos = 0; - outpos = 1; - - /* Main compression loop */ - bytesleft = insize; - do - { - /* Determine most distant position */ - if ( inpos > LZ_MAX_OFFSET ) maxoffset = LZ_MAX_OFFSET; - else maxoffset = inpos; - - /* Get pointer to current position */ - ptr1 = &in[ inpos ]; - - /* Search history window for maximum length string match */ - bestlength = 3; - bestoffset = 0; - for ( offset = 3; offset <= maxoffset; ++ offset ) - { - /* Get pointer to candidate string */ - ptr2 = &ptr1[ -offset ]; - - /* Quickly determine if this is a candidate (for speed) */ - if ( (ptr1[ 0 ] == ptr2[ 0 ]) && - (ptr1[ bestlength ] == ptr2[ bestlength ]) ) - { - /* Determine maximum length for this offset */ - maxlength = (bytesleft < offset ? bytesleft : offset); - - /* Count maximum length match at this offset */ - length = _LZ_StringCompare( ptr1, ptr2, 0, maxlength ); - - /* Better match than any previous match? */ - if ( length > bestlength ) - { - bestlength = length; - bestoffset = offset; - } - } - } - - /* Was there a good enough match? */ - if ( (bestlength >= 8) || - ((bestlength == 4) && (bestoffset <= 0x0000007f)) || - ((bestlength == 5) && (bestoffset <= 0x00003fff)) || - ((bestlength == 6) && (bestoffset <= 0x001fffff)) || - ((bestlength == 7) && (bestoffset <= 0x0fffffff)) ) - { - out[ outpos ++ ] = (unsigned char) marker; - outpos += _LZ_WriteVarSize( bestlength, &out[ outpos ] ); - outpos += _LZ_WriteVarSize( bestoffset, &out[ outpos ] ); - inpos += bestlength; - bytesleft -= bestlength; - } - else - { - /* Output single byte (or two bytes if marker byte) */ - symbol = in[ inpos ++ ]; - out[ outpos ++ ] = symbol; - if ( symbol == marker ) - { - out[ outpos ++ ] = 0; - } - -- bytesleft; - } - } - while ( bytesleft > 3 ); - - /* Dump remaining bytes, if any */ - while ( inpos < insize ) - { - if ( in[ inpos ] == marker ) - { - out[ outpos ++ ] = marker; - out[ outpos ++ ] = 0; - } - else - { - out[ outpos ++ ] = in[ inpos ]; - } - ++ inpos; - } - - return outpos; -} - - -/************************************************************************* -* LZ_CompressFast() - Compress a block of data using an LZ77 coder. -* in - Input (uncompressed) buffer. -* out - Output (compressed) buffer. This buffer must be 0.4% larger -* than the input buffer, plus one byte. -* insize - Number of input bytes. -* work - Pointer to a temporary buffer (internal working buffer), which -* must be able to hold (insize+65536) unsigned integers. -* The function returns the size of the compressed data. -*************************************************************************/ - -int LZ_CompressFast( unsigned char *in, unsigned char *out, - unsigned int insize, unsigned int *work ) -{ - unsigned char marker, symbol; - unsigned int inpos, outpos, bytesleft, i, index, symbols; - unsigned int offset, bestoffset; - unsigned int maxlength, length, bestlength; - unsigned int histogram[ 256 ], *lastindex, *jumptable; - unsigned char *ptr1, *ptr2; - - /* Do we have anything to compress? */ - if ( insize < 1 ) - { - return 0; - } - - /* Assign arrays to the working area */ - lastindex = work; - jumptable = &work[ 65536 ]; - - /* Build a "jump table". Here is how the jump table works: - jumptable[i] points to the nearest previous occurrence of the same - symbol pair as in[i]:in[i+1], so in[i] == in[jumptable[i]] and - in[i+1] == in[jumptable[i]+1]. Following the jump table gives a - dramatic boost for the string search'n'match loop compared to doing - a brute force search. */ - for ( i = 0; i < 65536; ++ i ) - { - lastindex[ i ] = 0xffffffff; - } - for ( i = 0; i < insize-1; ++ i ) - { - symbols = (((unsigned int)in[i]) << 8) | ((unsigned int)in[i+1]); - index = lastindex[ symbols ]; - lastindex[ symbols ] = i; - jumptable[ i ] = index; - } - jumptable[ insize-1 ] = 0xffffffff; - - /* Create histogram */ - for ( i = 0; i < 256; ++ i ) - { - histogram[ i ] = 0; - } - for ( i = 0; i < insize; ++ i ) - { - ++ histogram[ in[ i ] ]; - } - - /* Find the least common byte, and use it as the code marker */ - marker = 0; - for ( i = 1; i < 256; ++ i ) - { - if ( histogram[ i ] < histogram[ marker ] ) - { - marker = i; - } - } - - /* Remember the repetition marker for the decoder */ - out[ 0 ] = marker; - - /* Start of compression */ - inpos = 0; - outpos = 1; - - /* Main compression loop */ - bytesleft = insize; - do - { - /* Get pointer to current position */ - ptr1 = &in[ inpos ]; - - /* Search history window for maximum length string match */ - bestlength = 3; - bestoffset = 0; - index = jumptable[ inpos ]; - while ( index != 0xffffffff ) - { - /* Get pointer to candidate string */ - ptr2 = &in[ index ]; - - /* Quickly determine if this is a candidate (for speed) */ - if ( ptr2[ bestlength ] == ptr1[ bestlength ] ) - { - /* Determine maximum length for this offset */ - offset = inpos - index; - maxlength = (bytesleft < offset ? bytesleft : offset); - - /* Count maximum length match at this offset */ - length = _LZ_StringCompare( ptr1, ptr2, 2, maxlength ); - - /* Better match than any previous match? */ - if ( length > bestlength ) - { - bestlength = length; - bestoffset = offset; - } - } - - /* Get next possible index from jump table */ - index = jumptable[ index ]; - } - - /* Was there a good enough match? */ - if ( (bestlength >= 8) || - ((bestlength == 4) && (bestoffset <= 0x0000007f)) || - ((bestlength == 5) && (bestoffset <= 0x00003fff)) || - ((bestlength == 6) && (bestoffset <= 0x001fffff)) || - ((bestlength == 7) && (bestoffset <= 0x0fffffff)) ) - { - out[ outpos ++ ] = (unsigned char) marker; - outpos += _LZ_WriteVarSize( bestlength, &out[ outpos ] ); - outpos += _LZ_WriteVarSize( bestoffset, &out[ outpos ] ); - inpos += bestlength; - bytesleft -= bestlength; - } - else - { - /* Output single byte (or two bytes if marker byte) */ - symbol = in[ inpos ++ ]; - out[ outpos ++ ] = symbol; - if ( symbol == marker ) - { - out[ outpos ++ ] = 0; - } - -- bytesleft; - } - } - while ( bytesleft > 3 ); - - /* Dump remaining bytes, if any */ - while ( inpos < insize ) - { - if ( in[ inpos ] == marker ) - { - out[ outpos ++ ] = marker; - out[ outpos ++ ] = 0; - } - else - { - out[ outpos ++ ] = in[ inpos ]; - } - ++ inpos; - } - - return outpos; -} - - -/************************************************************************* -* LZ_Uncompress() - Uncompress a block of data using an LZ77 decoder. -* in - Input (compressed) buffer. -* out - Output (uncompressed) buffer. This buffer must be large -* enough to hold the uncompressed data. -* insize - Number of input bytes. -*************************************************************************/ - -void LZ_Uncompress( unsigned char *in, unsigned char *out, - unsigned int insize ) -{ - unsigned char marker, symbol; - unsigned int i, inpos, outpos, length, offset; - - /* Do we have anything to compress? */ - if ( insize < 1 ) - { - return; - } - - /* Get marker symbol from input stream */ - marker = in[ 0 ]; - inpos = 1; - - /* Main decompression loop */ - outpos = 0; - do - { - symbol = in[ inpos ++ ]; - if ( symbol == marker ) - { - /* We had a marker byte */ - if ( in[ inpos ] == 0 ) - { - /* It was a single occurrence of the marker byte */ - out[ outpos ++ ] = marker; - ++ inpos; - } - else - { - /* Extract true length and offset */ - inpos += _LZ_ReadVarSize( &length, &in[ inpos ] ); - inpos += _LZ_ReadVarSize( &offset, &in[ inpos ] ); - - /* Copy corresponding data from history window */ - for ( i = 0; i < length; ++ i ) - { - out[ outpos ] = out[ outpos - offset ]; - ++ outpos; - } - } - } - else - { - /* No marker, plain copy */ - out[ outpos ++ ] = symbol; - } - } - while ( inpos < insize ); -} diff --git a/backends/platform/ds/arm9/source/compressor/lz.h b/backends/platform/ds/arm9/source/compressor/lz.h deleted file mode 100644 index e7ea1567ca..0000000000 --- a/backends/platform/ds/arm9/source/compressor/lz.h +++ /dev/null @@ -1,50 +0,0 @@ -/************************************************************************* -* Name: lz.h -* Author: Marcus Geelnard -* Description: LZ77 coder/decoder interface. -* Reentrant: Yes -* $Id$ -*------------------------------------------------------------------------- -* Copyright (c) 2003-2004 Marcus Geelnard -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would -* be appreciated but is not required. -* -* 2. Altered source versions must be plainly marked as such, and must not -* be misrepresented as being the original software. -* -* 3. This notice may not be removed or altered from any source -* distribution. -* -* Marcus Geelnard -* marcus.geelnard at home.se -*************************************************************************/ - -#ifndef _lz_h_ -#define _lz_h_ - - - -/************************************************************************* -* Function prototypes -*************************************************************************/ - -int LZ_Compress( unsigned char *in, unsigned char *out, - unsigned int insize ); -int LZ_CompressFast( unsigned char *in, unsigned char *out, - unsigned int insize, unsigned int *work ); -void LZ_Uncompress( unsigned char *in, unsigned char *out, - unsigned int insize ); - - -#endif /* _lz_h_ */ diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index 5a63e5f08f..95bfdfe40a 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -70,8 +73,6 @@ -//#define USE_LIBCARTRESET - #include <nds.h> #include <nds/registers_alt.h> #include <nds/arm9/exceptions.h> @@ -80,8 +81,10 @@ //#include <ARM9/console.h> //basic print funcionality #include <stdlib.h> +#include <string.h> + +#include "NDS/scummvm_ipc.h" #include "dsmain.h" -#include "string.h" #include "osystem_ds.h" #include "icons_raw.h" #include "fat/gba_nds_fat.h" @@ -95,19 +98,19 @@ #ifdef USE_DEBUGGER #include "user_debugger.h" #endif -#include "ramsave.h" #include "blitters.h" -#include "cartreset_nolibfat.h" #include "keys.h" #ifdef USE_PROFILER #include "profiler/cyg-profile.h" #endif +#include "engine.h" + #include "backends/fs/ds/ds-fs.h" #include "base/version.h" -#include "engine.h" +#include "common/util.h" extern "C" void OurIntrMain(void); -extern "C" u32 getExceptionAddress( u32 opcodeAddress, u32 thumbState); +extern "C" u32 getExceptionAddress(u32 opcodeAddress, u32 thumbState); extern const char __itcm_start[]; static const char *registerNames[] = @@ -116,22 +119,20 @@ static const char *registerNames[] = #ifdef WRAP_MALLOC -extern "C" void* __real_malloc(size_t size); +extern "C" void *__real_malloc(size_t size); -int total = 0; +static int s_total_malloc = 0; -void* operator new (size_t size) -{ +void *operator new (size_t size) { register unsigned int reg asm("lr"); volatile unsigned int poo = reg; - void* res = __real_malloc(size); - total += size; + void *res = __real_malloc(size); + s_total_malloc += size; - if (!res) - { + if (!res) { // *((u8 *) NULL) = 0; - consolePrintf("Failed alloc (new) %d (%d)\n", size, total); + consolePrintf("Failed alloc (new) %d (%d)\n", size, s_total_malloc); return NULL; } @@ -139,7 +140,7 @@ void* operator new (size_t size) } -extern "C" void* __wrap_malloc(size_t size) { +extern "C" void *__wrap_malloc(size_t size) { /* u32 addr; asm("mov %0, lr" @@ -151,23 +152,22 @@ extern "C" void* __wrap_malloc(size_t size) { volatile unsigned int poo = reg; - if (size == 0) - { + if (size == 0) { static int zeroSize = 0; consolePrintf("0 size malloc (%d)", zeroSize++); } - void* res = __real_malloc(size); + void *res = __real_malloc(size); if (res) { if (size > 50 * 1024) { consolePrintf("Allocated %d (%x)\n", size, poo); } - total += size; + s_total_malloc += size; return res; } else { // *((u8 *) NULL) = 0; - consolePrintf("Failed alloc %d (%d)\n", size, total); + consolePrintf("Failed alloc %d (%d)\n", size, s_total_malloc); return NULL; } } @@ -193,112 +193,109 @@ enum MouseMode { #define SCUMM_GAME_HEIGHT 142 #define SCUMM_GAME_WIDTH 227 -int textureID; -u16* texture; - -int frameCount; -int currentTimeMillis; +static int frameCount; +static int currentTimeMillis; // Timer Callback -int callbackInterval; -int callbackTimer; -OSystem_DS::TimerProc callback; +static int callbackInterval; +static int callbackTimer; +static OSystem_DS::TimerProc callback; // Scaled -bool scaledMode; -int scX; -int scY; +static bool scaledMode; +static int scX; +static int scY; -int subScX; -int subScY; -int subScTargetX; -int subScTargetY; -int subScreenWidth = SCUMM_GAME_WIDTH; -int subScreenHeight = SCUMM_GAME_HEIGHT; -int subScreenScale = 256; +static int subScX; +static int subScY; +static int subScTargetX; +static int subScTargetY; +static int subScreenWidth = SCUMM_GAME_WIDTH; +static int subScreenHeight = SCUMM_GAME_HEIGHT; +static int subScreenScale = 256; // Sound -int bufferSize; -s16* soundBuffer; -int bufferFrame; -int bufferRate; -int bufferSamples; -bool soundHiPart; -int soundFrequency; +static int bufferSize; +static s16 *soundBuffer; +static int bufferFrame; +static int bufferRate; +static int bufferSamples; +static bool soundHiPart; +static int soundFrequency; // Events -int lastEventFrame; -bool indyFightState; -bool indyFightRight; +static int lastEventFrame; +static bool indyFightState; +static bool indyFightRight; -OSystem_DS::SoundProc soundCallback; -void* soundParam; -int lastCallbackFrame; -bool bufferFirstHalf; -bool bufferSecondHalf; +static OSystem_DS::SoundProc soundCallback; +static int lastCallbackFrame; +static bool bufferFirstHalf; +static bool bufferSecondHalf; // Saved buffers -bool highBuffer; -bool displayModeIs8Bit = false; +static bool highBuffer; +static bool displayModeIs8Bit = false; // Game id -u8 gameID; +static u8 gameID; -bool snapToBorder = false; -bool consoleEnable = false; -bool gameScreenSwap = false; +static bool snapToBorder = false; +static bool consoleEnable = false; +static bool gameScreenSwap = false; bool isCpuScalerEnabled(); //#define HEAVY_LOGGING -MouseMode mouseMode = MOUSE_LEFT; +static MouseMode mouseMode = MOUSE_LEFT; -int storedMouseX = 0; -int storedMouseY = 0; +static int storedMouseX = 0; +static int storedMouseY = 0; // Sprites -SpriteEntry sprites[128]; -SpriteEntry spritesMain[128]; -int tweak; +static SpriteEntry sprites[128]; +static SpriteEntry spritesMain[128]; +static int tweak; // Shake -int shakePos = 0; +static int s_shakePos = 0; // Keyboard -bool keyboardEnable = false; -bool leftHandedMode = false; -bool keyboardIcon = false; +static bool keyboardEnable = false; +static bool leftHandedMode = false; +static bool keyboardIcon = false; // Touch -int touchScX, touchScY, touchX, touchY; -int mouseHotspotX, mouseHotspotY; -bool cursorEnable = false; -bool mouseCursorVisible = true; -bool rightButtonDown = false; -bool touchPadStyle = false; -int touchPadSensitivity = 8; -bool tapScreenClicks = true; - -int tapCount = 0; -int tapTimeout = 0; -int tapComplete = 0; +static int touchScX, touchScY, touchX, touchY; +static int mouseHotspotX, mouseHotspotY; +static bool cursorEnable = false; +static bool mouseCursorVisible = true; +static bool leftButtonDown = false; +static bool rightButtonDown = false; +static bool touchPadStyle = false; +static int touchPadSensitivity = 8; +static bool tapScreenClicks = true; + +static int tapCount = 0; +static int tapTimeout = 0; +static int tapComplete = 0; // Dragging -int dragStartX, dragStartY; -bool dragging = false; -int dragScX, dragScY; +static int dragStartX, dragStartY; +static bool dragging = false; +static int dragScX, dragScY; // Interface styles -char gameName[32]; +static char gameName[32]; // 8-bit surface size -int gameWidth = 320; -int gameHeight = 200; +static int gameWidth = 320; +static int gameHeight = 200; // Scale -bool twoHundredPercentFixedScale = false; -bool cpuScalerEnable = false; +static bool twoHundredPercentFixedScale = false; +static bool cpuScalerEnable = false; // 100 256 // 150 192 @@ -309,14 +306,14 @@ bool cpuScalerEnable = false; #ifdef USE_PROFILER -int hBlankCount = 0; +static int hBlankCount = 0; #endif -u8* scalerBackBuffer = NULL; +static u8 *scalerBackBuffer = NULL; #define NUM_SUPPORTED_GAMES 21 -gameListType gameList[NUM_SUPPORTED_GAMES] = { +static const gameListType gameList[NUM_SUPPORTED_GAMES] = { // Unknown game - use normal SCUMM controls {"unknown", CONT_SCUMM_ORIGINAL}, @@ -345,31 +342,29 @@ gameListType gameList[NUM_SUPPORTED_GAMES] = { {"parallaction", CONT_NIPPON}, }; -gameListType* currentGame = NULL; +static const gameListType *s_currentGame = NULL; // Stylus -#define ABS(x) ((x)>0?(x):-(x)) - -bool penDown = FALSE; -bool penHeld = FALSE; -bool penReleased = FALSE; -bool penDownLastFrame = FALSE; -s32 penX = 0, penY = 0; -s32 penDownX = 0, penDownY = 0; -int keysDownSaved = 0; -int keysReleasedSaved = 0; -int keysChangedSaved = 0; +static bool penDown = FALSE; +static bool penHeld = FALSE; +static bool penReleased = FALSE; +static bool penDownLastFrame = FALSE; +static s32 penX = 0, penY = 0; +static s32 penDownX = 0, penDownY = 0; +static int keysDownSaved = 0; +static int keysReleasedSaved = 0; +static int keysChangedSaved = 0; -bool penDownSaved = FALSE; -bool penReleasedSaved = FALSE; -int penDownFrames = 0; -int touchXOffset = 0; -int touchYOffset = 0; +static bool penDownSaved = FALSE; +static bool penReleasedSaved = FALSE; +static int penDownFrames = 0; +static int touchXOffset = 0; +static int touchYOffset = 0; -int triggeredIcon = 0; -int triggeredIconTimeout = 0; +static int triggeredIcon = 0; +static int triggeredIconTimeout = 0; -u16 savedPalEntry255 = RGB15(31, 31, 31); +static u16 savedPalEntry255 = RGB15(31, 31, 31); extern "C" int scummvm_main(int argc, char *argv[]); @@ -382,8 +377,11 @@ void setIcon(int num, int x, int y, int imageNum, int flags, bool enable); void setIconMain(int num, int x, int y, int imageNum, int flags, bool enable); void uploadSpriteGfx(); -TransferSound soundControl; +static TransferSound soundControl; +static bool isScrollingWithDPad() { + return (getKeysHeld() & (KEY_L | KEY_R)) != 0; +} bool isCpuScalerEnabled() { return cpuScalerEnable || !displayModeIs8Bit; @@ -430,12 +428,12 @@ void setTopScreenZoom(int percentage) { // return (ConfMan.hasKey("cpu_scaler", "ds") && ConfMan.getBool("cpu_scaler", "ds")); controlType getControlType() { - return currentGame->control; + return s_currentGame->control; } //plays an 8 bit mono sample at 11025Hz -void playSound(const void* data, u32 length, bool loop, bool adpcm, int rate) { +void playSound(const void *data, u32 length, bool loop, bool adpcm, int rate) { if (!IPC->soundData) { soundControl.count = 0; @@ -551,21 +549,8 @@ int getSoundFrequency() { return soundFrequency; } -void setControls(char* gameName) { - - for (int r = 0; r < NUM_SUPPORTED_GAMES; r++) { - if (!stricmp(gameName, gameList[r].gameId)) { - currentGame = &gameList[r]; - consolePrintf("Current game set to: %s\n", gameName); - return; - } - } - - consolePrintf("Failed to set current game to: %s\n", gameName); -} - void exitGame() { - currentGame = NULL; + s_currentGame = NULL; } void initGame() { @@ -580,17 +565,17 @@ void initGame() { setOptions(); //strcpy(gameName, ConfMan.getActiveDomain().c_str()); - if (currentGame == NULL) { + if (s_currentGame == NULL) { strcpy(gameName, ConfMan.get("gameid").c_str()); // consolePrintf("\n\n\n\nCurrent game: '%s' %d\n", gameName, gameName[0]); - currentGame = &gameList[0]; // Default game + s_currentGame = &gameList[0]; // Default game for (int r = 0; r < NUM_SUPPORTED_GAMES; r++) { if (!stricmp(gameName, gameList[r].gameId)) { - currentGame = &gameList[r]; - // consolePrintf("Game list num: %d\n", currentGame); + s_currentGame = &gameList[r]; + // consolePrintf("Game list num: %d\n", s_currentGame); } } } @@ -785,7 +770,7 @@ void checkSleepMode() { } void setShowCursor(bool enable) { - if ((currentGame) && (currentGame->control == CONT_SCUMM_SAMNMAX)) { + if ((s_currentGame) && (s_currentGame->control == CONT_SCUMM_SAMNMAX)) { if (cursorEnable) { sprites[1].attribute[0] = ATTR0_BMP | 150; } else { @@ -801,7 +786,7 @@ void setMouseCursorVisible(bool enable) { mouseCursorVisible = enable; } -void setCursorIcon(const u8* icon, uint w, uint h, byte keycolor, int hotspotX, int hotspotY) { +void setCursorIcon(const u8 *icon, uint w, uint h, byte keycolor, int hotspotX, int hotspotY) { int off; @@ -833,7 +818,7 @@ void setCursorIcon(const u8* icon, uint w, uint h, byte keycolor, int hotspotX, } } - if (currentGame->control != CONT_SCUMM_SAMNMAX) + if (s_currentGame->control != CONT_SCUMM_SAMNMAX) return; uint16 border = RGB15(24,24,24) | 0x8000; @@ -982,7 +967,7 @@ void displayMode16BitFlipBuffer() { consolePrintf("Flip %s...", displayModeIs8Bit ? "8bpp" : "16bpp"); #endif if (!displayModeIs8Bit) { - u16* back = get16BitBackBuffer(); + u16 *back = get16BitBackBuffer(); // highBuffer = !highBuffer; // BG3_CR = BG_BMP16_512x256 | BG_BMP_RAM(highBuffer? 1: 0); @@ -1001,8 +986,8 @@ void displayMode16BitFlipBuffer() { TIMER1_CR = TIMER_ENABLE | TIMER_DIV_1024; u16 t0 = TIMER1_DATA; #endif - const u8* back = (const u8*)get8BitBackBuffer(); - u16* base = BG_GFX + 0x10000; + const u8 *back = (const u8*)get8BitBackBuffer(); + u16 *base = BG_GFX + 0x10000; Rescale_320x256xPAL8_To_256x256x1555( base, back, @@ -1031,17 +1016,18 @@ void displayMode16BitFlipBuffer() { } void setShakePos(int shakePos) { - shakePos = shakePos; + s_shakePos = shakePos; } -u16* get16BitBackBuffer() { +u16 *get16BitBackBuffer() { return BG_GFX + 0x20000; } s32 get8BitBackBufferStride() { - // When the CPU scaler is enabled, the back buffer is in system RAM and is 320 pixels wide - // When the CPU scaler is disabled, the back buffer is in video memory and therefore must have a 512 pixel stride + // When the CPU scaler is enabled, the back buffer is in system RAM and is + // 320 pixels wide. When the CPU scaler is disabled, the back buffer is in + // video memory and therefore must have a 512 pixel stride. if (isCpuScalerEnabled()){ return 320; @@ -1050,11 +1036,11 @@ s32 get8BitBackBufferStride() { } } -u16* getScalerBuffer() { +u16 *getScalerBuffer() { return (u16 *) scalerBackBuffer; } -u16* get8BitBackBuffer() { +u16 *get8BitBackBuffer() { if (isCpuScalerEnabled()) return (u16 *) scalerBackBuffer; else @@ -1124,7 +1110,7 @@ void soundUpdate() { void memoryReport() { int r = 0; - int* p; + int *p; do { p = (int *) malloc(r * 8192); free(p); @@ -1132,7 +1118,7 @@ void memoryReport() { } while ((p) && (r < 512)); int t = -1; - void* block[1024]; + void *block[1024]; do { t++; block[t] = (int *) malloc(4096); @@ -1147,7 +1133,7 @@ void memoryReport() { void addIndyFightingKeys() { - OSystem_DS* system = OSystem_DS::instance(); + OSystem_DS *system = OSystem_DS::instance(); Common::Event event; event.type = Common::EVENT_KEYDOWN; @@ -1247,7 +1233,7 @@ void addIndyFightingKeys() { void setKeyboardEnable(bool en) { if (en == keyboardEnable) return; keyboardEnable = en; - u16* backupBank = (u16 *) 0x6040000; + u16 *backupBank = (u16 *) 0x6040000; if (keyboardEnable) { @@ -1283,7 +1269,7 @@ void setKeyboardEnable(bool en) { if (displayModeIs8Bit) { // Copy the sub screen VRAM from the top screen - they should always be // the same. - u16* buffer = get8BitBackBuffer(); + u16 *buffer = get8BitBackBuffer(); s32 stride = get8BitBackBufferStride(); for (int y = 0; y < gameHeight; y++) { @@ -1319,8 +1305,7 @@ bool getIsDisplayMode8Bit() { return displayModeIs8Bit; } -void doScreenTapMode(OSystem_DS* system) -{ +void doScreenTapMode(OSystem_DS *system) { Common::Event event; static bool left = false, right = false; @@ -1353,7 +1338,7 @@ void doScreenTapMode(OSystem_DS* system) right = true; } - if (!(getKeysHeld() & (KEY_L | KEY_R))) { + if (!isScrollingWithDPad()) { if (getKeysDown() & KEY_LEFT) { event.type = Common::EVENT_LBUTTONDOWN; @@ -1386,21 +1371,17 @@ void doScreenTapMode(OSystem_DS* system) system->addEvent(event); } -void doButtonSelectMode(OSystem_DS* system) -{ +void doButtonSelectMode(OSystem_DS *system) { Common::Event event; - if ((!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R))) { + if (!isScrollingWithDPad()) { event.type = Common::EVENT_MOUSEMOVE; event.mouse = Common::Point(getPenX(), getPenY()); system->addEvent(event); //consolePrintf("x=%d y=%d \n", getPenX(), getPenY()); } - static bool leftButtonDown = false; - static bool rightButtonDown = false; - if (getPenReleased() && (leftButtonDown || rightButtonDown)) { if (leftButtonDown) { event.type = Common::EVENT_LBUTTONUP; @@ -1417,7 +1398,7 @@ void doButtonSelectMode(OSystem_DS* system) if ((mouseMode != MOUSE_HOVER) || (!displayModeIs8Bit)) { - if (getPenDown() && (!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R))) { + if (getPenDown() && !isScrollingWithDPad()) { if (mouseMode == MOUSE_LEFT) { event.type = Common::EVENT_LBUTTONDOWN; leftButtonDown = true; @@ -1459,7 +1440,7 @@ void doButtonSelectMode(OSystem_DS* system) } } - if (!((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) && (!getIndyFightState()) && (!getKeyboardEnable())) { + if (!isScrollingWithDPad() && !getIndyFightState() && !getKeyboardEnable()) { if (!getPenHeld() || (mouseMode != MOUSE_HOVER)) { if (getKeysDown() & KEY_LEFT) { @@ -1467,7 +1448,6 @@ void doButtonSelectMode(OSystem_DS* system) } if (rightButtonDown) { - Common::Event event; event.mouse = Common::Point(getPenX(), getPenY()); event.type = Common::EVENT_RBUTTONUP; system->addEvent(event); @@ -1476,14 +1456,13 @@ void doButtonSelectMode(OSystem_DS* system) if (getKeysDown() & KEY_RIGHT) { - if ((currentGame->control != CONT_SCUMM_SAMNMAX) && (currentGame->control != CONT_FUTURE_WARS) && (currentGame->control != CONT_GOBLINS)) { + if ((s_currentGame->control != CONT_SCUMM_SAMNMAX) && (s_currentGame->control != CONT_FUTURE_WARS) && (s_currentGame->control != CONT_GOBLINS)) { mouseMode = MOUSE_RIGHT; } else { // If we're playing sam and max, click and release the right mouse // button to change verb - Common::Event event; - if (currentGame->control == CONT_FUTURE_WARS) { + if (s_currentGame->control == CONT_FUTURE_WARS) { event.mouse = Common::Point(320 - 128, 200 - 128); event.type = Common::EVENT_MOUSEMOVE; system->addEvent(event); @@ -1515,7 +1494,7 @@ void addEventsToQueue() { #ifdef HEAVY_LOGGING consolePrintf("addEventsToQueue\n"); #endif - OSystem_DS* system = OSystem_DS::instance(); + OSystem_DS *system = OSystem_DS::instance(); Common::Event event; #ifdef USE_PROFILER @@ -1557,8 +1536,8 @@ void addEventsToQueue() { if (!indyFightState) { - if ((!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R)) && (getKeysDown() & KEY_B)) { - if (currentGame->control == CONT_AGI) { + if (!isScrollingWithDPad() && (getKeysDown() & KEY_B)) { + if (s_currentGame->control == CONT_AGI) { event.kbd.keycode = Common::KEYCODE_RETURN; event.kbd.ascii = 13; event.kbd.flags = 0; @@ -1596,8 +1575,7 @@ void addEventsToQueue() { bool release = getKeysReleased() & (KEY_LEFT | KEY_RIGHT | KEY_UP | KEY_DOWN); bool shoulders = getKeysHeld() & (KEY_L | KEY_R); - if ( (down && (!shoulders)) || release) - { + if ( (down && (!shoulders)) || release) { if (getKeysChanged() & KEY_LEFT) { event.kbd.keycode = Common::KEYCODE_LEFT; @@ -1630,7 +1608,7 @@ void addEventsToQueue() { } - if (!((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) && (!getIndyFightState()) && (!getKeyboardEnable())) { + if (!isScrollingWithDPad() && !getIndyFightState() && !getKeyboardEnable()) { if ((getKeysDown() & KEY_A) && (!indyFightState)) { gameScreenSwap = !gameScreenSwap; @@ -1669,14 +1647,12 @@ void addEventsToQueue() { } } - if (!getIndyFightState() && !((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) && (getKeysDown() & KEY_X)) { + if (!getIndyFightState() && !isScrollingWithDPad() && (getKeysDown() & KEY_X)) { setKeyboardEnable(!keyboardEnable); } updateStatus(); - Common::Event event; - if ((tapScreenClicks) && (getIsDisplayMode8Bit())) { if ((!keyboardEnable) || (!isInsideKeyboard(penDownX, penDownY))) { @@ -1693,13 +1669,10 @@ void addEventsToQueue() { if (!keyboardEnable) { - - if (((!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R)) || (indyFightState)) && (displayModeIs8Bit)) { + if ((isScrollingWithDPad() || (indyFightState)) && (displayModeIs8Bit)) { // Controls specific to the control method - - - if (currentGame->control == CONT_SKY) { + if (s_currentGame->control == CONT_SKY) { // Extra controls for Beneath a Steel Sky if ((getKeysDown() & KEY_DOWN)) { penY = 0; @@ -1707,9 +1680,8 @@ void addEventsToQueue() { } } - if (currentGame->control == CONT_AGI) { + if (s_currentGame->control == CONT_AGI) { // Extra controls for Leisure Suit Larry and KQ4 - if ((getKeysHeld() & KEY_UP) && (getKeysHeld() & KEY_START) /*&& (!strcmp(gameName, "LLLLL"))*/) { consolePrintf("Cheat key!\n"); @@ -1722,16 +1694,11 @@ void addEventsToQueue() { event.type = Common::EVENT_KEYUP; system->addEvent(event); } - } - - - if (currentGame->control == CONT_SIMON) { + if (s_currentGame->control == CONT_SIMON) { // Extra controls for Simon the Sorcerer if ((getKeysDown() & KEY_DOWN)) { - Common::Event event; - event.type = Common::EVENT_KEYDOWN; event.kbd.keycode = Common::KEYCODE_F10; // F10 or # - show hotspots event.kbd.ascii = Common::ASCII_F10; @@ -1744,13 +1711,9 @@ void addEventsToQueue() { } } - - - if (currentGame->control == CONT_SCUMM_ORIGINAL) { + if (s_currentGame->control == CONT_SCUMM_ORIGINAL) { // Extra controls for Scumm v1-5 games if ((getKeysDown() & KEY_DOWN)) { - Common::Event event; - event.type = Common::EVENT_KEYDOWN; event.kbd.keycode = Common::KEYCODE_PERIOD; // Full stop - skips current dialogue line event.kbd.ascii = '.'; @@ -1806,14 +1769,14 @@ void addEventsToQueue() { if ((getKeysChanged() & KEY_START)) { event.kbd.flags = 0; event.type = getKeyEvent(KEY_START); - if (currentGame->control == CONT_FUTURE_WARS) { + if (s_currentGame->control == CONT_FUTURE_WARS) { event.kbd.keycode = Common::KEYCODE_F10; event.kbd.ascii = Common::ASCII_F10; - } else if (currentGame->control == CONT_GOBLINS) { + } else if (s_currentGame->control == CONT_GOBLINS) { event.kbd.keycode = Common::KEYCODE_F1; event.kbd.ascii = Common::ASCII_F1; // consolePrintf("!!!!!F1!!!!!"); - } else if (currentGame->control == CONT_AGI) { + } else if (s_currentGame->control == CONT_AGI) { event.kbd.keycode = Common::KEYCODE_ESCAPE; event.kbd.ascii = 27; } else { @@ -1830,9 +1793,7 @@ void addEventsToQueue() { } consumeKeys(); - consumePenEvents(); - } } @@ -1862,23 +1823,19 @@ void updateStatus() { if (displayModeIs8Bit) { if (!tapScreenClicks) { switch (mouseMode) { - case MOUSE_LEFT: { - offs = 1; - break; - } - case MOUSE_RIGHT: { - offs = 2; - break; - } - case MOUSE_HOVER: { - offs = 0; - break; - } - default: { - // Nothing! - offs = 0; - break; - } + case MOUSE_LEFT: + offs = 1; + break; + case MOUSE_RIGHT: + offs = 2; + break; + case MOUSE_HOVER: + offs = 0; + break; + default: + // Nothing! + offs = 0; + break; } setIcon(0, 208, 150, offs, 0, true); @@ -1962,15 +1919,12 @@ void setMainScreenScale(int x, int y) { SUB_BG3_YDX = 0; SUB_BG3_YDY = y; } else*/ { - if (isCpuScalerEnabled() && (x==320)) - { + if (isCpuScalerEnabled() && (x==320)) { BG3_XDX = 256; BG3_XDY = 0; BG3_YDX = 0; BG3_YDY = y; - } - else - { + } else { BG3_XDX = x; BG3_XDY = 0; BG3_YDX = 0; @@ -2057,11 +2011,9 @@ void VBlankHandler(void) { soundUpdate(); - - - if ((!gameScreenSwap) && (!(getKeysHeld() & KEY_L) && !(getKeysHeld() & KEY_R))) { - if (currentGame) { - if (currentGame->control != CONT_SCUMM_SAMNMAX) { + if ((!gameScreenSwap) && !isScrollingWithDPad()) { + if (s_currentGame) { + if (s_currentGame->control != CONT_SCUMM_SAMNMAX) { if (getPenHeld() && (getPenY() < SCUMM_GAME_HEIGHT)) { setTopScreenTarget(getPenX(), getPenY()); } @@ -2101,7 +2053,7 @@ void VBlankHandler(void) { callbackTimer -= FRAME_TIME; } - if ((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) { + if (isScrollingWithDPad()) { if ((!dragging) && (getPenHeld()) && (penDownFrames > 5)) { dragging = true; @@ -2144,7 +2096,7 @@ void VBlankHandler(void) { SUB_BG3_CX = subScX + 64; } - SUB_BG3_CY = subScY + (shakePos << 8);*/ + SUB_BG3_CY = subScY + (s_shakePos << 8);*/ /*SUB_BG3_XDX = (int) (subScreenWidth / 256.0f * 256); SUB_BG3_XDY = 0; @@ -2155,7 +2107,7 @@ void VBlankHandler(void) { bool zooming = false; - if ((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) { + if (isScrollingWithDPad()) { if ((getKeysHeld() & KEY_A) && (subScreenScale < ratio)) { subScreenScale += 1; zooming = true; @@ -2232,7 +2184,7 @@ void VBlankHandler(void) { if (displayModeIs8Bit) { - if ((getKeysHeld() & KEY_L) || (getKeysHeld() & KEY_R)) { + if (isScrollingWithDPad()) { int offsX = 0, offsY = 0; @@ -2284,7 +2236,7 @@ void VBlankHandler(void) { setZoomedScreenScale(subScreenWidth, ((subScreenHeight * (256 << 8)) / 192) >> 8); - setMainScreenScroll(scX << 8, (scY << 8) + (shakePos << 8)); + setMainScreenScroll(scX << 8, (scY << 8) + (s_shakePos << 8)); setMainScreenScale(256, 256); // 1:1 scale } else { @@ -2300,7 +2252,7 @@ void VBlankHandler(void) { setZoomedScreenScroll(subScX, subScY, (subScreenWidth != 256) && (subScreenWidth != 128)); setZoomedScreenScale(subScreenWidth, ((subScreenHeight * (256 << 8)) / 192) >> 8); - setMainScreenScroll(64, (scY << 8) + (shakePos << 8)); + setMainScreenScroll(64, (scY << 8) + (s_shakePos << 8)); setMainScreenScale(320, 256); // 1:1 scale } @@ -2388,7 +2340,7 @@ void uploadSpriteGfx() { vramSetBankE(VRAM_E_MAIN_SPRITE); // Convert texture from 24bit 888 to 16bit 1555, remembering to set top bit! - u8* srcTex = (u8 *) ::icons_raw; + const u8 *srcTex = (const u8 *) ::icons_raw; for (int r = 32 * 256 ; r >= 0; r--) { SPRITE_GFX_SUB[r] = 0x8000 | (srcTex[r * 3] >> 3) | ((srcTex[r * 3 + 1] >> 3) << 5) | ((srcTex[r * 3 + 2] >> 3) << 10); SPRITE_GFX[r] = 0x8000 | (srcTex[r * 3] >> 3) | ((srcTex[r * 3 + 1] >> 3) << 5) | ((srcTex[r * 3 + 2] >> 3) << 10); @@ -2634,9 +2586,6 @@ void penUpdate() { } } - else - { - } } else { penDown = true; @@ -2822,31 +2771,6 @@ GLvector getPenPos() { return v; } -#ifdef GBA_SRAM_SAVE - -void formatSramOption() { - consolePrintf("The following files are present in save RAM:\n"); - DSSaveFileManager::instance()->listFiles(); - - consolePrintf("\nAre you sure you want to\n"); - consolePrintf("DELETE all files?\n"); - consolePrintf("A = Yes, X = No\n"); - - while (true) { - if (keysHeld() & KEY_A) { - DSSaveFileManager::instance()->formatSram(); - consolePrintf("SRAM cleared!\n"); - return; - } - - if (keysHeld() & KEY_X) { - consolePrintf("Whew, that was close!\n"); - return; - } - } -} -#endif - void setIndyFightState(bool st) { indyFightState = st; indyFightRight = true; @@ -2856,20 +2780,18 @@ bool getIndyFightState() { return indyFightState; } -gameListType* getCurrentGame() { - return currentGame; -} - /////////////////// // Fast Ram /////////////////// #define FAST_RAM_SIZE (24000) -u8* fastRamPointer; +#define ITCM_DATA __attribute__((section(".itcm"))) + +u8 *fastRamPointer; u8 fastRamData[FAST_RAM_SIZE] ITCM_DATA; -void* fastRamAlloc(int size) { - void* result = (void *) fastRamPointer; +void *fastRamAlloc(int size) { + void *result = (void *) fastRamPointer; fastRamPointer += size; if(fastRamPointer > fastRamData + FAST_RAM_SIZE) { consolePrintf("FastRam (ITCM) allocation failed!\n"); @@ -2926,68 +2848,13 @@ void initDebugger() { // Ensure the function is processed with C linkage -extern "C" void debug_print_stub(char* string); +extern "C" void debug_print_stub(char *string); void debug_print_stub(char *string) { consolePrintf(string); } #endif -#ifdef USE_LIBCARTRESET - -struct cardTranslate { - int cartResetId; - int svmId; - char dldiId[5]; -}; - -cardTranslate cardReaderTable[] = { - {DEVICE_TYPE_M3SD, DEVICE_M3SD, "M3SD"}, - {DEVICE_TYPE_M3CF, DEVICE_M3CF, "M3CF"}, - {DEVICE_TYPE_MPCF, DEVICE_MPCF, "MPCF"}, - {DEVICE_TYPE_SCCF, DEVICE_SCCF, "SCCF"}, - {DEVICE_TYPE_SCSD, DEVICE_SCSD, "SCSD"}, - {DEVICE_TYPE_SCSD, DEVICE_SCSD, "SCLT"}, - {DEVICE_TYPE_NMMC, DEVICE_NMMC, "NMMC"}, -}; - -void reboot() { - int deviceType = -1; - - - if (disc_getDeviceId() == DEVICE_DLDI) { - - char id[6]; - disc_getDldiId(id); - - consolePrintf("DLDI Device ID: %s\n", id); - - for (int r = 0; r < ARRAYSIZE(cardReaderTable); r++) { - if (!stricmp(id, cardReaderTable[r].dldiId)) { - deviceType = cardReaderTable[r].cartResetId; - } - } - } else { - for (int r = 0; r < ARRAYSIZE(cardReaderTable); r++) { - if (disc_getDeviceId() == cardReaderTable[r].svmId) { - deviceType = cardReaderTable[r].cartResetId; - } - } - } - - - consolePrintf("Device number: %x\n", deviceType); - - if (deviceType == -1) { - IPC->reset = true; // Send message to ARM7 to turn power off - } else { - cartSetMenuMode(deviceType); - passmeloopEnter(); - } - - while (true); // Stop the program continuing beyond this point -} -#endif void powerOff() { while (keysHeld() != 0) { // Wait for all keys to be released. @@ -3002,12 +2869,10 @@ void powerOff() { while (true); } else { -#ifdef USE_LIBCARTRESET - reboot(); -#else IPC->reset = true; // Send message to ARM7 to turn power off - while (true); // Stop the program continuing beyond this point -#endif + while (true) { + // Stop the program from continuing beyond this point + } } } @@ -3028,7 +2893,7 @@ void dsExceptionHandler() { int offset = 8; - if ( currentMode == 0x17 ) { + if (currentMode == 0x17) { consolePrintf("\x1b[10Cdata abort!\n\n"); codeAddress = exceptionRegisters[15] - offset; if ( (codeAddress > 0x02000000 && codeAddress < 0x02400000) || @@ -3051,16 +2916,19 @@ void dsExceptionHandler() { int i; - for ( i=0; i < 8; i++ ) { + for (i = 0; i < 8; i++) { consolePrintf(" %s: %08X %s: %08X\n", registerNames[i], exceptionRegisters[i], registerNames[i+8],exceptionRegisters[i+8]); } - while(1); + + while(1) + ; // endles loop + u32 *stack = (u32 *)exceptionRegisters[13]; - for ( i=0; i<10; i++ ) { + for (i = 0; i < 10; i++) { consolePrintf("%08X %08X %08X\n", stack[i*3], stack[i*3+1], stack[(i*3)+2] ); } @@ -3286,7 +3154,7 @@ int main(void) { */ // Create a file system node to force search for a zip file in GBA rom space - DSFileSystemNode* node = new DSFileSystemNode(); + DSFileSystemNode *node = new DSFileSystemNode(); if (!node->getZip() || (!node->getZip()->isReady())) { // If not found, init CF/SD driver initGBAMP(mode); @@ -3311,12 +3179,6 @@ int main(void) { g_system = new OSystem_DS(); assert(g_system); -#ifdef GBA_SRAM_SAVE - if ((keysHeld() & KEY_L) && (keysHeld() & KEY_R)) { - formatSramOption(); - } -#endif - IPC->adpcm.semaphore = false; // printf("'%s'", Common::ConfigManager::kTransientDomain.c_str()); @@ -3344,6 +3206,11 @@ int main(void) { const char *argv[] = {"/scummvmds", "--config=scummvmj.ini"}; #elif defined(DS_BUILD_K) const char *argv[] = {"/scummvmds", "--config=scummvmk.ini"}; +#else + // Use the default config file if no build was specified. This currently + // only happens with builds made using the regular ScummVM build system (as + // opposed to the nds specific build system). + const char *argv[] = {"/scummvmds"}; #endif @@ -3356,7 +3223,8 @@ int main(void) { return 0; } -} +} // End of namespace DS + int main() { DS::main(); @@ -3377,7 +3245,6 @@ extern "C" void consolePrintf(char * format, ...) __attribute__ ((no_instrument_ extern "C" void consolePrintf(const char * format, ...) { - char buffer[256]; va_list args; va_start(args, format); viprintf(format, args); diff --git a/backends/platform/ds/arm9/source/dsmain.h b/backends/platform/ds/arm9/source/dsmain.h index beda592ba2..bd627fa620 100644 --- a/backends/platform/ds/arm9/source/dsmain.h +++ b/backends/platform/ds/arm9/source/dsmain.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -25,7 +28,6 @@ #include <nds.h> #include "osystem_ds.h" -#include "NDS/scummvm_ipc.h" namespace DS { @@ -38,7 +40,7 @@ enum controlType { CONT_FUTURE_WARS, CONT_AGI, CONT_GOBLINS, - CONT_NIPPON, + CONT_NIPPON }; struct gameListType { @@ -68,9 +70,6 @@ int leftHandedSwap(int keys); void setGameScreenSwap(bool enable); void setSensitivity(int sensitivity); -// Controls options -void setControls(char* gameName); - // Video void displayMode8Bit(); // Switch to 8-bit mode5 void displayMode16Bit(); // Switch to 16-bit mode5 @@ -79,8 +78,8 @@ void displayMode16Bit(); // Switch to 16-bit mode5 void displayMode16BitFlipBuffer(); // Get address of current back buffer -u16* get16BitBackBuffer(); -u16* get8BitBackBuffer(); +u16 * get16BitBackBuffer(); +u16 * get8BitBackBuffer(); s32 get8BitBackBufferStride(); u16* getScalerBuffer(); @@ -99,7 +98,7 @@ void doTimerCallback(); // Call callback function if required void doSoundCallback(); void startSound(int freq, int buffer); // Start sound hardware // Call function if sound buffers need more data -void playSound(const void* data, u32 length, bool loop, bool adpcm = false, int rate = 22050); // Start a sound +void playSound(const void *data, u32 length, bool loop, bool adpcm = false, int rate = 22050); // Start a sound void stopSound(int channel); int getSoundFrequency(); @@ -109,7 +108,7 @@ void VBlankHandler(); // Sam and Max Stuff void setGameID(int id); -void setCursorIcon(const u8* icon, uint w, uint h, byte keycolor, int hotspotX, int hotspotY); +void setCursorIcon(const u8 *icon, uint w, uint h, byte keycolor, int hotspotX, int hotspotY); void setShowCursor(bool enable); void setMouseCursorVisible(bool visible); @@ -155,10 +154,10 @@ void fastRamReset(); void* fastRamAlloc(int size); void exitGame(); -gameListType* getCurrentGame(); -} +} // End of namespace DS + int cygprofile_getHBlanks(); diff --git a/backends/platform/ds/arm9/source/dsoptions.cpp b/backends/platform/ds/arm9/source/dsoptions.cpp index 9937e81e61..cc89c41017 100644 --- a/backends/platform/ds/arm9/source/dsoptions.cpp +++ b/backends/platform/ds/arm9/source/dsoptions.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -31,6 +34,8 @@ #include "touchkeyboard.h" #include "gui/PopUpWidget.h" +#include "common/translation.h" + #define ALLOW_CPU_SCALER namespace DS { @@ -51,27 +56,27 @@ static int confGetInt(Common::String key, int defaultVal) { DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { - new GUI::ButtonWidget(this, 10, 170, 72, 16, "Close", GUI::kCloseCmd, 'C'); - new GUI::ButtonWidget(this, 320 - 10 - 130, 170, 120, 16, "ScummVM Main Menu", 0x40000000, 'M'); + new GUI::ButtonWidget(this, 10, 170, 72, 16, _("~C~lose"), 0, GUI::kCloseCmd); + new GUI::ButtonWidget(this, 320 - 10 - 130, 170, 120, 16, _("ScummVM Main Menu"), 0, 0x40000000, 'M'); _tab = new GUI::TabWidget(this, 10, 5, 300, 230 - 20 - 40 - 20); _tab->addTab("Controls"); - _leftHandedCheckbox = new GUI::CheckboxWidget(_tab, 5, 5, 130, 20, "Left handed mode", 0, 'L'); - _indyFightCheckbox = new GUI::CheckboxWidget(_tab, 5, 20, 140, 20, "Indy fight controls", 0, 'I'); - _showCursorCheckbox = new GUI::CheckboxWidget(_tab, 150, 5, 130, 20, "Show mouse cursor", 0, 'T'); - _snapToBorderCheckbox = new GUI::CheckboxWidget(_tab, 150, 20, 130, 20, "Snap to edges", 0, 'T'); + _leftHandedCheckbox = new GUI::CheckboxWidget(_tab, 5, 5, 130, 20, _("~L~eft handed mode")); + _indyFightCheckbox = new GUI::CheckboxWidget(_tab, 5, 20, 140, 20, _("~I~ndy fight controls")); + _showCursorCheckbox = new GUI::CheckboxWidget(_tab, 150, 5, 130, 20, _("Show mouse cursor"), 0, 0, 'T'); + _snapToBorderCheckbox = new GUI::CheckboxWidget(_tab, 150, 20, 130, 20, _("Snap to edges"), 0, 0, 'T'); - new GUI::StaticTextWidget(_tab, 20, 35, 100, 15, "Touch X Offset", Graphics::kTextAlignLeft); - _touchX = new GUI::SliderWidget(_tab, 130, 35, 130, 12, 1); + new GUI::StaticTextWidget(_tab, 20, 35, 100, 15, _("Touch X Offset"), Graphics::kTextAlignLeft); + _touchX = new GUI::SliderWidget(_tab, 130, 35, 130, 12, "TODO: Add tooltip", 1); _touchX->setMinValue(-8); _touchX->setMaxValue(+8); _touchX->setValue(0); _touchX->setFlags(GUI::WIDGET_CLEARBG); - new GUI::StaticTextWidget(_tab, 20, 50, 100, 15, "Touch Y Offset", Graphics::kTextAlignLeft); - _touchY = new GUI::SliderWidget(_tab, 130, 50, 130, 12, 2); + new GUI::StaticTextWidget(_tab, 20, 50, 100, 15, _("Touch Y Offset"), Graphics::kTextAlignLeft); + _touchY = new GUI::SliderWidget(_tab, 130, 50, 130, 12, "TODO: Add tooltip", 2); _touchY->setMinValue(-8); _touchY->setMaxValue(+8); _touchY->setValue(0); @@ -82,11 +87,11 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { new GUI::StaticTextWidget(_tab, 130 - 20, 65, 20, 15, "-8", Graphics::kTextAlignCenter); - _touchPadStyle = new GUI::CheckboxWidget(_tab, 5, 80, 270, 20, "Use laptop trackpad-style cursor control", 0x20000001, 'T'); - _screenTaps = new GUI::CheckboxWidget(_tab, 5, 95, 285, 20, "Tap for left click, double tap right click", 0x20000002, 'T'); + _touchPadStyle = new GUI::CheckboxWidget(_tab, 5, 80, 270, 20, _("Use laptop trackpad-style cursor control"), 0, 0x20000001, 'T'); + _screenTaps = new GUI::CheckboxWidget(_tab, 5, 95, 285, 20, _("Tap for left click, double tap right click"), 0, 0x20000002, 'T'); - _sensitivityLabel = new GUI::StaticTextWidget(_tab, 20, 110, 110, 15, "Sensitivity", Graphics::kTextAlignLeft); - _sensitivity = new GUI::SliderWidget(_tab, 130, 110, 130, 12, 1); + _sensitivityLabel = new GUI::StaticTextWidget(_tab, 20, 110, 110, 15, _("Sensitivity"), Graphics::kTextAlignLeft); + _sensitivity = new GUI::SliderWidget(_tab, 130, 110, 130, 12, "TODO: Add tooltip", 1); _sensitivity->setMinValue(4); _sensitivity->setMaxValue(16); _sensitivity->setValue(8); @@ -94,20 +99,20 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { _tab->addTab("Graphics"); - new GUI::StaticTextWidget(_tab, 5, 67, 180, 15, "Initial top screen scale:", Graphics::kTextAlignLeft); + new GUI::StaticTextWidget(_tab, 5, 67, 180, 15, _("Initial top screen scale:"), Graphics::kTextAlignLeft); - _100PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 82, 80, 20, "100%", 0x30000001, 'T'); - _150PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 97, 80, 20, "150%", 0x30000002, 'T'); - _200PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 112, 80, 20, "200%", 0x30000003, 'T'); + _100PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 82, 80, 20, "100%", "TODO: Add tooltip", 0x30000001, 'T'); + _150PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 97, 80, 20, "150%", "TODO: Add tooltip", 0x30000002, 'T'); + _200PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 112, 80, 20, "200%", "TODO: Add tooltip", 0x30000003, 'T'); - new GUI::StaticTextWidget(_tab, 5, 5, 180, 15, "Main screen scaling:", Graphics::kTextAlignLeft); + new GUI::StaticTextWidget(_tab, 5, 5, 180, 15, _("Main screen scaling:"), Graphics::kTextAlignLeft); - _hardScaler = new GUI::CheckboxWidget(_tab, 5, 20, 270, 20, "Hardware scale (fast, but low quality)", 0x10000001, 'T'); - _cpuScaler = new GUI::CheckboxWidget(_tab, 5, 35, 270, 20, "Software scale (good quality, but slower)", 0x10000002, 'S'); - _unscaledCheckbox = new GUI::CheckboxWidget(_tab, 5, 50, 270, 20, "Unscaled (you must scroll left and right)", 0x10000003, 'S'); + _hardScaler = new GUI::CheckboxWidget(_tab, 5, 20, 270, 20, _("Hardware scale (fast, but low quality)"), 0, 0x10000001, 'T'); + _cpuScaler = new GUI::CheckboxWidget(_tab, 5, 35, 270, 20, _("Software scale (good quality, but slower)"), 0, 0x10000002, 'S'); + _unscaledCheckbox = new GUI::CheckboxWidget(_tab, 5, 50, 270, 20, _("Unscaled (you must scroll left and right)"), 0, 0x10000003, 'S'); - new GUI::StaticTextWidget(_tab, 5, 125, 110, 15, "Brightness:", Graphics::kTextAlignLeft); - _gammaCorrection = new GUI::SliderWidget(_tab, 130, 120, 130, 12, 1); + new GUI::StaticTextWidget(_tab, 5, 125, 110, 15, _("Brightness:"), Graphics::kTextAlignLeft); + _gammaCorrection = new GUI::SliderWidget(_tab, 130, 120, 130, 12, "TODO: Add tooltip", 1); _gammaCorrection->setMinValue(0); _gammaCorrection->setMaxValue(8); _gammaCorrection->setValue(0); @@ -116,8 +121,8 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { _tab->addTab("General"); - _highQualityAudioCheckbox = new GUI::CheckboxWidget(_tab, 5, 5, 250, 20, "High quality audio (slower) (reboot)", 0, 'T'); - _disablePowerOff = new GUI::CheckboxWidget(_tab, 5, 20, 200, 20, "Disable power off", 0, 'T'); + _highQualityAudioCheckbox = new GUI::CheckboxWidget(_tab, 5, 5, 250, 20, _("High quality audio (slower) (reboot)"), 0, 0, 'T'); + _disablePowerOff = new GUI::CheckboxWidget(_tab, 5, 20, 200, 20, _("Disable power off"), 0, 0, 'T'); _tab->setActiveTab(0); @@ -125,7 +130,7 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { #ifdef DS_SCUMM_BUILD if (!DS::isGBAMPAvailable()) { -// addButton(this, 100, 140, "Delete Save", 'dels', 'D'); +// addButton(this, 100, 140, "Delete Save", 0, 'dels', 'D'); } #endif @@ -133,7 +138,7 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) { //#ifdef ALLOW_CPU_SCALER -// _cpuScaler = new GUI::CheckboxWidget(this, 160, 115, 90, 20, "CPU scaler", 0, 'T'); +// _cpuScaler = new GUI::CheckboxWidget(this, 160, 115, 90, 20, "CPU scaler", 0, 0, 'T'); //#endif @@ -364,7 +369,7 @@ void showOptionsDialog() { DS::displayMode16Bit(); - DSOptionsDialog* d = new DSOptionsDialog(); + DSOptionsDialog *d = new DSOptionsDialog(); d->runModal(); delete d; @@ -418,7 +423,7 @@ void setOptions() { DS::setTrackPadStyleEnable(enable); - if ((enable) and (firstLoad)) { + if (enable && firstLoad) { // If we've just booted up, want to swap screens when trackpad mode is in use // but not every time we enter the options dialog. DS::setGameScreenSwap(true); @@ -436,4 +441,5 @@ void setOptions() { firstLoad = false; } -} +} // End of namespace DS + diff --git a/backends/platform/ds/arm9/source/dsoptions.h b/backends/platform/ds/arm9/source/dsoptions.h index 4b3ac36d45..1bdc7c1f27 100644 --- a/backends/platform/ds/arm9/source/dsoptions.h +++ b/backends/platform/ds/arm9/source/dsoptions.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -46,30 +49,30 @@ protected: virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); void updateConfigManager(); - GUI::TabWidget* _tab; + GUI::TabWidget *_tab; - GUI::StaticTextWidget* _sensitivityLabel; + GUI::StaticTextWidget *_sensitivityLabel; - GUI::SliderWidget* _touchX; - GUI::SliderWidget* _touchY; - GUI::SliderWidget* _sensitivity; - GUI::SliderWidget* _gammaCorrection; - GUI::CheckboxWidget* _leftHandedCheckbox; - GUI::CheckboxWidget* _unscaledCheckbox; - GUI::CheckboxWidget* _100PercentCheckbox; - GUI::CheckboxWidget* _150PercentCheckbox; - GUI::CheckboxWidget* _200PercentCheckbox; - GUI::CheckboxWidget* _indyFightCheckbox; - GUI::CheckboxWidget* _highQualityAudioCheckbox; - GUI::CheckboxWidget* _disablePowerOff; - GUI::CheckboxWidget* _showCursorCheckbox; - GUI::CheckboxWidget* _snapToBorderCheckbox; + GUI::SliderWidget *_touchX; + GUI::SliderWidget *_touchY; + GUI::SliderWidget *_sensitivity; + GUI::SliderWidget *_gammaCorrection; + GUI::CheckboxWidget *_leftHandedCheckbox; + GUI::CheckboxWidget *_unscaledCheckbox; + GUI::CheckboxWidget *_100PercentCheckbox; + GUI::CheckboxWidget *_150PercentCheckbox; + GUI::CheckboxWidget *_200PercentCheckbox; + GUI::CheckboxWidget *_indyFightCheckbox; + GUI::CheckboxWidget *_highQualityAudioCheckbox; + GUI::CheckboxWidget *_disablePowerOff; + GUI::CheckboxWidget *_showCursorCheckbox; + GUI::CheckboxWidget *_snapToBorderCheckbox; - GUI::CheckboxWidget* _hardScaler; - GUI::CheckboxWidget* _cpuScaler; + GUI::CheckboxWidget *_hardScaler; + GUI::CheckboxWidget *_cpuScaler; - GUI::CheckboxWidget* _touchPadStyle; - GUI::CheckboxWidget* _screenTaps; + GUI::CheckboxWidget *_touchPadStyle; + GUI::CheckboxWidget *_screenTaps; bool _radioButtonMode; @@ -78,6 +81,6 @@ protected: extern void showOptionsDialog(); extern void setOptions(); -} +} // End of namespace DS #endif diff --git a/backends/platform/ds/arm9/source/fat/gba_nds_fat.c b/backends/platform/ds/arm9/source/fat/gba_nds_fat.c index b70d9e7b99..07affd8839 100644 --- a/backends/platform/ds/arm9/source/fat/gba_nds_fat.c +++ b/backends/platform/ds/arm9/source/fat/gba_nds_fat.c @@ -294,9 +294,9 @@ u16 getRTCtoFileTime (void) { #ifdef NDS return ( - ( ( (IPC->rtc_hours > 11 ? IPC->rtc_hours - 40 : IPC->rtc_hours) & 0x1F) << 11) | - ( (IPC->rtc_minutes & 0x3F) << 5) | - ( (IPC->rtc_seconds >> 1) & 0x1F) ); + ( ( (IPC->rtc.hours > 11 ? IPC->rtc.hours - 40 : IPC->rtc.hours) & 0x1F) << 11) | + ( (IPC->rtc.minutes & 0x3F) << 5) | + ( (IPC->rtc.seconds >> 1) & 0x1F) ); #else return 0; #endif @@ -306,9 +306,9 @@ u16 getRTCtoFileDate (void) { #ifdef NDS return ( - ( ((IPC->rtc_year + 20) & 0x7F) <<9) | - ( (IPC->rtc_month & 0xF) << 5) | - (IPC->rtc_day & 0x1F) ); + ( ((IPC->rtc.year + 20) & 0x7F) <<9) | + ( (IPC->rtc.month & 0xF) << 5) | + (IPC->rtc.day & 0x1F) ); #else return 0; #endif diff --git a/backends/platform/ds/arm9/source/fat/io_nmmc.c b/backends/platform/ds/arm9/source/fat/io_nmmc.c index 261096a27b..6c996f5de1 100644 --- a/backends/platform/ds/arm9/source/fat/io_nmmc.c +++ b/backends/platform/ds/arm9/source/fat/io_nmmc.c @@ -170,7 +170,7 @@ bool NMMC_IsInserted(void) { Neo_EnableMMC( true ); // Open SPI port to MMC card Neo_SendMMCCommand(MMC_SEND_CSD, 0); - if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured + if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occurred Neo_EnableMMC( false ); return false; } @@ -227,14 +227,14 @@ bool NMMC_StartUp(void) { // Set block length Neo_SendMMCCommand(MMC_SET_BLOCKLEN, BYTE_PER_READ ); - if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured + if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occurred Neo_EnableMMC( false ); return false; } // Check if we can use a higher SPI frequency Neo_SendMMCCommand(MMC_SEND_CSD, 0); - if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured + if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occurred Neo_EnableMMC( false ); return false; } @@ -268,7 +268,7 @@ bool NMMC_WriteSectors (u32 sector, u8 numSecs, void* buffer) Neo_EnableMMC( true ); // Open SPI port to MMC card Neo_SendMMCCommand( 25, sector ); - if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured + if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occurred Neo_EnableMMC( false ); return false; } @@ -318,7 +318,7 @@ bool NMMC_ReadSectors (u32 sector, u8 numSecs, void* buffer) while (totalSecs--) { Neo_SendMMCCommand(MMC_READ_BLOCK, sector ); - if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occured + if( Neo_CheckMMCResponse( 0x00, 0xFF ) == false ) { // Make sure no errors occurred Neo_EnableMMC( false ); return false; } diff --git a/backends/platform/ds/arm9/source/gbampsave.cpp b/backends/platform/ds/arm9/source/gbampsave.cpp index 820e569555..d0fb8fff3b 100644 --- a/backends/platform/ds/arm9/source/gbampsave.cpp +++ b/backends/platform/ds/arm9/source/gbampsave.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -29,7 +32,7 @@ // GBAMP Save File ///////////////////////// -GBAMPSaveFile::GBAMPSaveFile(char* name, bool saveOrLoad) { +GBAMPSaveFile::GBAMPSaveFile(char *name, bool saveOrLoad) { handle = DS::std_fopen(name, saveOrLoad? "w": "r"); // consolePrintf("%s handle is %d\n", name, handle); // consolePrintf("Created %s\n", name); @@ -44,10 +47,10 @@ GBAMPSaveFile::~GBAMPSaveFile() { // consolePrintf("Closed file\n"); } -uint32 GBAMPSaveFile::read(void *buf, uint32 size) { - saveSize += size; -// consolePrintf("Read %d %d ", size, saveSize); - return DS::std_fread(buf, 1, size, handle); +uint32 GBAMPSaveFile::read(void *buf, uint32 length) { + saveSize += length; +// consolePrintf("Read %d %d ", length, saveSize); + return DS::std_fread(buf, 1, length, handle); } bool GBAMPSaveFile::eos() const { @@ -74,27 +77,27 @@ int32 GBAMPSaveFile::pos() const { int32 GBAMPSaveFile::size() const { int position = pos(); DS::std_fseek(handle, 0, SEEK_END); - int size = DS::std_ftell(handle); + int length = DS::std_ftell(handle); DS::std_fseek(handle, position, SEEK_SET); - return size; + return length; } -bool GBAMPSaveFile::seek(int32 pos, int whence) { - return DS::std_fseek(handle, pos, whence) == 0; +bool GBAMPSaveFile::seek(int32 newPos, int whence) { + return DS::std_fseek(handle, newPos, whence) == 0; } -uint32 GBAMPSaveFile::write(const void *buf, uint32 size) { - if (bufferPos + size > SAVE_BUFFER_SIZE) { +uint32 GBAMPSaveFile::write(const void *buf, uint32 length) { + if (bufferPos + length > SAVE_BUFFER_SIZE) { flushSaveBuffer(); - saveSize += size; -// consolePrintf("Writing %d bytes from %x", size, buf); -// DS::std_fwrite(buf, 1, size, handle); + saveSize += length; +// consolePrintf("Writing %d bytes from %x", length, buf); +// DS::std_fwrite(buf, 1, length, handle); - memcpy(buffer + bufferPos, buf, size); - bufferPos += size; + memcpy(buffer + bufferPos, buf, length); + bufferPos += length; - saveSize += size; + saveSize += length; /* int pos = 0; @@ -104,31 +107,31 @@ uint32 GBAMPSaveFile::write(const void *buf, uint32 size) { bufferPos = 512; pos += rest; flushSaveBuffer(); - size -= rest; + length -= rest; // consolePrintf("First section: %d\n", rest); - while (size >= 512) { + while (length >= 512) { DS::std_fwrite(((char *) (buf)) + pos, 1, 512, handle); - size -= 512; + length -= 512; pos += 512; -// consolePrintf("Full chunk, %d left ", size); +// consolePrintf("Full chunk, %d left ", length); } bufferPos = 0; - memcpy(buffer + bufferPos, ((char *) (buf)) + pos, size); - bufferPos += size; + memcpy(buffer + bufferPos, ((char *) (buf)) + pos, length); + bufferPos += length; // consolePrintf("%d left in buffer ", bufferPos);*/ } else { - memcpy(buffer + bufferPos, buf, size); - bufferPos += size; + memcpy(buffer + bufferPos, buf, length); + bufferPos += length; - saveSize += size; + saveSize += length; } -// if ((size > 100) || (size <= 0)) consolePrintf("Write %d bytes\n", size); - return size; +// if ((length > 100) || (length <= 0)) consolePrintf("Write %d bytes\n", length); + return length; } @@ -196,7 +199,7 @@ Common::StringArray GBAMPSaveFileManager::listSavefiles(const Common::String &pa // consolePrintf("Real cwd:%d\n", realName); - char* p = realName; + char *p = realName; while (*p) { if (*p == '\\') *p = '/'; p++; diff --git a/backends/platform/ds/arm9/source/gbampsave.h b/backends/platform/ds/arm9/source/gbampsave.h index bc4fdaa1a4..ad929236cd 100644 --- a/backends/platform/ds/arm9/source/gbampsave.h +++ b/backends/platform/ds/arm9/source/gbampsave.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -24,19 +27,20 @@ #define _GBAMPSAVE_H_ #include "common/system.h" +#include "common/savefile.h" #include "backends/fs/ds/ds-fs.h" #define SAVE_BUFFER_SIZE 100000 class GBAMPSaveFile : public Common::InSaveFile, public Common::OutSaveFile { - DS::fileHandle* handle; + DS::fileHandle *handle; char buffer[SAVE_BUFFER_SIZE]; int bufferPos; int saveSize; int flushed; public: - GBAMPSaveFile(char* name, bool saveOrLoad); + GBAMPSaveFile(char *name, bool saveOrLoad); virtual ~GBAMPSaveFile(); virtual uint32 read(void *buf, uint32 size); @@ -62,12 +66,12 @@ public: GBAMPSaveFileManager(); ~GBAMPSaveFileManager(); -// static GBAMPSaveFileManager* instance() { return instancePtr; } +// static GBAMPSaveFileManager *instance() { return instancePtr; } GBAMPSaveFile *openSavefile(const char *filename, bool saveOrLoad); - virtual Common::OutSaveFile* openForSaving(const Common::String &filename) { return openSavefile(filename.c_str(), true); } - virtual Common::InSaveFile* openForLoading(const Common::String &filename) { return openSavefile(filename.c_str(), false); } + virtual Common::OutSaveFile *openForSaving(const Common::String &filename) { return openSavefile(filename.c_str(), true); } + virtual Common::InSaveFile *openForLoading(const Common::String &filename) { return openSavefile(filename.c_str(), false); } virtual bool removeSavefile(const Common::String &filename) { return false; } // TODO: Implement this virtual Common::StringArray listSavefiles(const Common::String &pattern); diff --git a/backends/platform/ds/arm9/source/keys.cpp b/backends/platform/ds/arm9/source/keys.cpp index 63fae866e5..2f8497ab19 100644 --- a/backends/platform/ds/arm9/source/keys.cpp +++ b/backends/platform/ds/arm9/source/keys.cpp @@ -74,7 +74,6 @@ #include <nds/system.h> #include <nds/arm9/input.h> -//------------------------------------------------------------------------------ #define KEYS_CUR (( ((~REG_KEYINPUT)&0x3ff) | (((~IPC->buttons)&3)<<10) | (((~IPC->buttons)<<6) & (KEY_TOUCH|KEY_LID) ))^KEY_LID) @@ -89,63 +88,50 @@ static u8 delay = 60, repeat = 30, count = 60; static uint16 oldx = 0; static uint16 oldy = 0; -//------------------------------------------------------------------------------ void scanKeys(void) { -//------------------------------------------------------------------------------ keysold = keys; keys = KEYS_CUR; oldx = IPC->touchXpx; oldy = IPC->touchYpx; - if ( delay != 0 ) { - if ( keys != keysold ) { - count = delay ; - keysrepeat = keysDown() ; + if (delay != 0) { + if (keys != keysold) { + count = delay; + keysrepeat = keysDown(); } count--; - if ( count == 0 ) { + if (count == 0) { count = repeat; keysrepeat = keys; } } } -//------------------------------------------------------------------------------ uint32 keysHeld(void) { -//------------------------------------------------------------------------------ return keys; } -//------------------------------------------------------------------------------ uint32 keysDown(void) { -//------------------------------------------------------------------------------ return (keys ^ keysold) & keys; } -//------------------------------------------------------------------------------ uint32 keysDownRepeat(void) { -//------------------------------------------------------------------------------ uint32 tmp = keysrepeat; - keysrepeat = 0; - return tmp; } -//------------------------------------------------------------------------------ void keysSetRepeat( u8 setDelay, u8 setRepeat ) { -//------------------------------------------------------------------------------ - delay = setDelay ; - repeat = setRepeat ; - count = delay ; - keysrepeat = 0 ; + delay = setDelay; + repeat = setRepeat; + count = delay; + keysrepeat = 0; } -//------------------------------------------------------------------------------ uint32 keysUp(void) { -//------------------------------------------------------------------------------ return (keys ^ keysold) & (~keys); } -} // namespace ds +} // End of namespace DS + diff --git a/backends/platform/ds/arm9/source/keys.h b/backends/platform/ds/arm9/source/keys.h index e0f28a12cf..8d08014232 100644 --- a/backends/platform/ds/arm9/source/keys.h +++ b/backends/platform/ds/arm9/source/keys.h @@ -1,4 +1,27 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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; either version 2 + * of the License, or (at your option) any later version. + * 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 for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ namespace DS { @@ -7,7 +30,7 @@ void scanKeys(void); uint32 keysHeld(void); uint32 keysDown(void); uint32 keysDownRepeat(void); -void keysSetRepeat( u8 setDelay, u8 setRepeat ); +void keysSetRepeat(u8 setDelay, u8 setRepeat); uint32 keysUp(void); -} +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/libcartreset/cartreset.c b/backends/platform/ds/arm9/source/libcartreset/cartreset.c deleted file mode 100644 index 6fb906b86d..0000000000 --- a/backends/platform/ds/arm9/source/libcartreset/cartreset.c +++ /dev/null @@ -1,107 +0,0 @@ -/********************************** - Copyright (C) Rick Wong (Lick) - http://licklick.wordpress.com/ -***********************************/ -#include <cartreset_nolibfat.h> - - -#ifdef ARM9 - -bool cartSetMenuMode(u32 _deviceType) -{ - *(vu16*)(0x04000204) &= ~0x0880; //sysSetBusOwners(true, true); - u32 deviceType = _deviceType; - - *((vu32*)0x027FFFF8) = 0x080000C0; // ARM7 reset address - - if(deviceType == DEVICE_TYPE_EFA2) - { - *(u16 *)0x9FE0000 = 0xD200; - *(u16 *)0x8000000 = 0x1500; - *(u16 *)0x8020000 = 0xD200; - *(u16 *)0x8040000 = 0x1500; - *(u16 *)0x9880000 = 1 << 15; - *(u16 *)0x9FC0000 = 0x1500; - return true; - } - else if(deviceType == DEVICE_TYPE_MPCF) - { - return true; - } - else if(deviceType == DEVICE_TYPE_EZSD) - { - return true; - } - else if(deviceType == DEVICE_TYPE_M3CF || deviceType == DEVICE_TYPE_M3SD) - { - u32 mode = 0x00400004; - vu16 tmp; - tmp = *(vu16*)(0x08E00002); - tmp = *(vu16*)(0x0800000E); - tmp = *(vu16*)(0x08801FFC); - tmp = *(vu16*)(0x0800104A); - tmp = *(vu16*)(0x08800612); - tmp = *(vu16*)(0x08000000); - tmp = *(vu16*)(0x08801B66); - tmp = *(vu16*)(0x08000000 + (mode << 1)); - tmp = *(vu16*)(0x0800080E); - tmp = *(vu16*)(0x08000000); - - tmp = *(vu16*)(0x080001E4); - tmp = *(vu16*)(0x080001E4); - tmp = *(vu16*)(0x08000188); - tmp = *(vu16*)(0x08000188); - return true; - } - else if(deviceType == DEVICE_TYPE_SCCF || deviceType == DEVICE_TYPE_SCSD) - { - *(vu16*)0x09FFFFFE = 0xA55A; - *(vu16*)0x09FFFFFE = 0xA55A; - *(vu16*)0x09FFFFFE = 0; - *(vu16*)0x09FFFFFE = 0; - *((vu32*)0x027FFFF8) = 0x08000000; // Special ARM7 reset address - return true; - } - - return false; -} - - - -void passmeloopEnter() -{ - *(vu16*)(0x04000208) = 0; //REG_IME = IME_DISABLE; - *(vu16*)(0x04000204) |= 0x0880; //sysSetBusOwners(false, false); - *((vu32*)0x027FFFFC) = 0; - *((vu32*)0x027FFE04) = (u32)0xE59FF018; - *((vu32*)0x027FFE24) = (u32)0x027FFE04; - asm("swi 0x00"); //swiSoftReset(); - asm("bx lr"); -} - -#endif - - -#ifdef ARM7 - -bool passmeloopQuery() -{ - if(*((vu32*)0x027FFE24) == (u32)0x027FFE04) - return true; - return false; -} - - - -void cartExecute() -{ - *(vu16*)(0x04000208) = 0; //REG_IME = IME_DISABLE; - *((vu32*)0x027FFE34) = *((vu32*)0x027FFFF8); - asm("swi 0x00"); //swiSoftReset(); - asm("bx lr"); -} - -#endif - - - diff --git a/backends/platform/ds/arm9/source/libcartreset/cartreset_nolibfat.h b/backends/platform/ds/arm9/source/libcartreset/cartreset_nolibfat.h deleted file mode 100644 index ddc4b1d4c2..0000000000 --- a/backends/platform/ds/arm9/source/libcartreset/cartreset_nolibfat.h +++ /dev/null @@ -1,57 +0,0 @@ -/********************************** - Copyright (C) Rick Wong (Lick) - http://licklick.wordpress.com/ -***********************************/ -#ifndef CARTRESET_H -#define CARTRESET_H - -//#include <fat.h> -#include <nds.h> - - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef ARM9 -// Auto detect: -#define DEVICE_TYPE_AUTO 0x00000000 // doesn't work in libcartreset "nolibfat" version - -// Not supported: -#define DEVICE_TYPE_FCSR 0x52534346 -#define DEVICE_TYPE_MMCF 0x46434D4D -#define DEVICE_TYPE_NJSD 0x44534A4E -#define DEVICE_TYPE_NMMC 0x434D4D4E - -// Supported: -#define DEVICE_TYPE_EFA2 0x32414645 -#define DEVICE_TYPE_MPCF 0x4643504D -#define DEVICE_TYPE_M3CF 0x4643334D -#define DEVICE_TYPE_M3SD 0x4453334D -#define DEVICE_TYPE_SCCF 0x46434353 -#define DEVICE_TYPE_SCSD 0x44534353 - -// Supported, but libfat doesn't detect the device: -#define DEVICE_TYPE_EZSD 0x44535A45 - - -bool cartSetMenuMode(u32 _deviceType); -void passmeloopEnter(); - -#endif - - -#ifdef ARM7 - -bool passmeloopQuery(); -void cartExecute(); - -#endif - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp index 691fb2ec7a..c4ff241de0 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.cpp +++ b/backends/platform/ds/arm9/source/osystem_ds.cpp @@ -66,9 +66,14 @@ #define DEFAULT_CONFIG_FILE "scummvmj.ini" #elif defined(DS_BUILD_K) #define DEFAULT_CONFIG_FILE "scummvmk.ini" +#else + // Use the "scummvm.ini" as config file if no build was specified. This + // currently only happens with builds made using the regular ScummVM build + // system (as opposed to the nds specific build system). +#define DEFAULT_CONFIG_FILE "scummvm.ini" #endif -OSystem_DS* OSystem_DS::_instance = NULL; +OSystem_DS *OSystem_DS::_instance = NULL; OSystem_DS::OSystem_DS() : eventNum(0), lastPenFrame(0), queuePos(0), _mixer(NULL), _timer(NULL), _frameBufferExists(false), @@ -128,7 +133,7 @@ bool OSystem_DS::getFeatureState(Feature f) { return false; } -const OSystem::GraphicsMode* OSystem_DS::getSupportedGraphicsModes() const { +const OSystem::GraphicsMode *OSystem_DS::getSupportedGraphicsModes() const { return s_supportedGraphicsModes; } @@ -203,8 +208,7 @@ void OSystem_DS::setPalette(const byte *colors, uint start, uint num) { } } -void OSystem_DS::restoreHardwarePalette() -{ +void OSystem_DS::restoreHardwarePalette() { // Set the hardware palette up based on the stored palette for (int r = 0; r < 255; r++) { @@ -238,13 +242,13 @@ void OSystem_DS::setCursorPalette(const byte *colors, uint start, uint num) { refreshCursor(); } -bool OSystem_DS::grabRawScreen(Graphics::Surface* surf) { +bool OSystem_DS::grabRawScreen(Graphics::Surface *surf) { surf->create(DS::getGameWidth(), DS::getGameHeight(), 1); // Ensure we copy using 16 bit quantities due to limitation of VRAM addressing - const u16* image = (const u16 *) DS::get8BitBackBuffer(); + const u16 *image = (const u16 *) DS::get8BitBackBuffer(); for (int y = 0; y < DS::getGameHeight(); y++) { DC_FlushRange(image + (y << 8), DS::getGameWidth()); for (int x = 0; x < DS::getGameWidth() >> 1; x++) { @@ -277,9 +281,9 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int // consolePrintf("CopyRectToScreen %d\n", w * h); - u16* bg; + u16 *bg; s32 stride; - u16* bgSub = (u16 *)BG_GFX_SUB; + u16 *bgSub = (u16 *)BG_GFX_SUB; // The DS video RAM doesn't support 8-bit writes because Nintendo wanted // to save a few pennies/euro cents on the hardware. @@ -304,14 +308,14 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int // the keyboard image uses the same VRAM addresses. for (int dy = y; dy < y + h; dy++) { - u8* dest = ((u8 *) (bg)) + (dy * stride) + x; - u8* src = (u8 *) buf + (pitch * by); + u8 *dest = ((u8 *) (bg)) + (dy * stride) + x; + const u8 *src = (const u8 *) buf + (pitch * by); u32 dx; u32 pixelsLeft = w; - if (MISALIGNED16(dest)) { + if (MISALIGNED16(dest)) { // Read modify write dest--; @@ -326,9 +330,9 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int } // We can now assume dest is aligned - u16* dest16 = (u16 *) dest; + u16 *dest16 = (u16 *) dest; - for (dx = 0; dx < pixelsLeft; dx+=2) { + for (dx = 0; dx < pixelsLeft; dx+=2) { u16 mix; mix = *src + (*(src + 1) << 8); @@ -355,15 +359,15 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int // When they keyboard is not on screen, update both vram copies for (int dy = y; dy < y + h; dy++) { - u8* dest = ((u8 *) (bg)) + (dy * stride) + x; - u8* destSub = ((u8 *) (bgSub)) + (dy * 512) + x; - u8* src = (u8 *) buf + (pitch * by); + u8 *dest = ((u8 *) (bg)) + (dy * stride) + x; + u8 *destSub = ((u8 *) (bgSub)) + (dy * 512) + x; + const u8 *src = (const u8 *) buf + (pitch * by); u32 dx; u32 pixelsLeft = w; - if (MISALIGNED16(dest)) { + if (MISALIGNED16(dest)) { // Read modify write dest--; @@ -380,10 +384,10 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int } // We can now assume dest is aligned - u16* dest16 = (u16 *) dest; - u16* destSub16 = (u16 *) destSub; + u16 *dest16 = (u16 *) dest; + u16 *destSub16 = (u16 *) destSub; - for (dx = 0; dx < pixelsLeft; dx+=2) { + for (dx = 0; dx < pixelsLeft; dx+=2) { u16 mix; mix = *src + (*(src + 1) << 8); @@ -417,12 +421,12 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int // Stuff is aligned to 16-bit boundaries, so it's safe to do DMA. - u16* src = (u16 *) buf; + u16 *src = (u16 *) buf; if (DS::getKeyboardEnable()) { for (int dy = y; dy < y + h; dy++) { - u16* dest = bg + (dy * (stride >> 1)) + (x >> 1); + u16 *dest = bg + (dy * (stride >> 1)) + (x >> 1); DC_FlushRange(src, w << 1); DC_FlushRange(dest, w << 1); @@ -435,8 +439,8 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int } else { for (int dy = y; dy < y + h; dy++) { - u16* dest1 = bg + (dy * (stride >> 1)) + (x >> 1); - u16* dest2 = bgSub + (dy << 8) + (x >> 1); + u16 *dest1 = bg + (dy * (stride >> 1)) + (x >> 1); + u16 *dest2 = bgSub + (dy << 8) + (x >> 1); DC_FlushRange(src, w << 1); DC_FlushRange(dest1, w << 1); @@ -458,7 +462,7 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int } void OSystem_DS::updateScreen() { - static int cnt = 0; +// static int cnt = 0; // consolePrintf("updatescr %d\n", cnt++); if ((_frameBufferExists) && (DS::getIsDisplayMode8Bit())) { @@ -498,13 +502,13 @@ void OSystem_DS::clearOverlay() { // consolePrintf("clearovl\n"); } -void OSystem_DS::grabOverlay(OverlayColor* buf, int pitch) { +void OSystem_DS::grabOverlay(OverlayColor *buf, int pitch) { // consolePrintf("grabovl\n") - u16* start = DS::get16BitBackBuffer(); + u16 *start = DS::get16BitBackBuffer(); for (int y = 0; y < 200; y++) { - u16* src = start + (y * 320); - u16* dest = ((u16 *) (buf)) + (y * pitch); + u16 *src = start + (y * 320); + u16 *dest = ((u16 *) (buf)) + (y * pitch); for (int x = 0; x < 320; x++) { *dest++ = *src++; @@ -514,8 +518,8 @@ void OSystem_DS::grabOverlay(OverlayColor* buf, int pitch) { } void OSystem_DS::copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) { - u16* bg = (u16 *) DS::get16BitBackBuffer(); - const u16* src = (const u16 *) buf; + u16 *bg = (u16 *) DS::get16BitBackBuffer(); + const u16 *src = (const u16 *) buf; // if (x + w > 256) w = 256 - x; //if (x + h > 256) h = 256 - y; @@ -586,7 +590,7 @@ void OSystem_DS::refreshCursor() { DS::setCursorIcon(_cursorImage, _cursorW, _cursorH, _cursorKey, _cursorHotX, _cursorHotY); } -void OSystem_DS::addEvent(Common::Event& e) { +void OSystem_DS::addEvent(const Common::Event& e) { eventQueue[queuePos++] = e; } @@ -724,31 +728,15 @@ void OSystem_DS::quit() { swiSoftReset();*/ } -Common::SaveFileManager* OSystem_DS::getSavefileManager() { - bool forceSram; - - if (ConfMan.hasKey("forcesramsave", "ds")) { - forceSram = ConfMan.getBool("forcesramsave", "ds"); - } else { - forceSram = false; - } - if (forceSram) { - consolePrintf("Using SRAM save method!\n"); - } - - if (DS::isGBAMPAvailable() && (!forceSram)) { +Common::SaveFileManager *OSystem_DS::getSavefileManager() { + if (DS::isGBAMPAvailable()) { return &mpSaveManager; - } else { -#ifdef GBA_SRAM_SAVE - return &saveManager; -#else - return NULL; -#endif } + return NULL; } -Graphics::Surface* OSystem_DS::createTempFrameBuffer() { +Graphics::Surface *OSystem_DS::createTempFrameBuffer() { // Ensure we copy using 16 bit quantities due to limitation of VRAM addressing @@ -773,13 +761,13 @@ Graphics::Surface* OSystem_DS::createTempFrameBuffer() { s32 width = DS::getGameWidth(); s32 stride = DS::get8BitBackBufferStride(); - u16* src = DS::get8BitBackBuffer(); - u16* dest = DS::getScalerBuffer(); + u16 *src = DS::get8BitBackBuffer(); + u16 *dest = DS::getScalerBuffer(); for (int y = 0; y < height; y++) { - u16* destLine = dest + (y * (width / 2)); - u16* srcLine = src + (y * (stride / 2)); + u16 *destLine = dest + (y * (width / 2)); + u16 *srcLine = src + (y * (stride / 2)); DC_FlushRange(srcLine, width); @@ -800,7 +788,7 @@ Graphics::Surface* OSystem_DS::createTempFrameBuffer() { size_t imageStrideInBytes = DS::get8BitBackBufferStride(); size_t imageStrideInWords = imageStrideInBytes / 2; - u16* image = (u16 *) DS::get8BitBackBuffer(); + u16 *image = (u16 *) DS::get8BitBackBuffer(); for (int y = 0; y < DS::getGameHeight(); y++) { DC_FlushRange(image + (y * imageStrideInWords), DS::getGameWidth()); for (int x = 0; x < DS::getGameWidth() >> 1; x++) { @@ -846,13 +834,13 @@ void OSystem_DS::setCharactersEntered(int count) { DS::setCharactersEntered(count); } -Common::SeekableReadStream* OSystem_DS::createConfigReadStream() { +Common::SeekableReadStream *OSystem_DS::createConfigReadStream() { Common::FSNode file(DEFAULT_CONFIG_FILE); // consolePrintf("R %s", DEFAULT_CONFIG_FILE); return file.createReadStream(); } -Common::WriteStream* OSystem_DS::createConfigWriteStream() { +Common::WriteStream *OSystem_DS::createConfigWriteStream() { Common::FSNode file(DEFAULT_CONFIG_FILE); // consolePrintf("W %s", DEFAULT_CONFIG_FILE); return file.createWriteStream(); diff --git a/backends/platform/ds/arm9/source/osystem_ds.h b/backends/platform/ds/arm9/source/osystem_ds.h index 10b4c87f66..65ac3f4f7e 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.h +++ b/backends/platform/ds/arm9/source/osystem_ds.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -27,7 +30,6 @@ #include "backends/base-backend.h" #include "common/events.h" #include "nds.h" -#include "ramsave.h" #include "gbampsave.h" #include "backends/saves/default/default-saves.h" #include "backends/timer/default/default-timer.h" @@ -44,17 +46,14 @@ protected: Common::Event eventQueue[96]; int queuePos; -#ifdef GBA_SRAM_SAVE - DSSaveFileManager saveManager; -#endif GBAMPSaveFileManager mpSaveManager; - Audio::MixerImpl* _mixer; - DefaultTimerManager* _timer; + Audio::MixerImpl *_mixer; + DefaultTimerManager *_timer; Graphics::Surface _framebuffer; bool _frameBufferExists; bool _graphicsEnable; - static OSystem_DS* _instance; + static OSystem_DS *_instance; u16 _palette[256]; u16 _cursorPalette[256]; @@ -68,7 +67,7 @@ protected: int _cursorScale; - Graphics::Surface* createTempFrameBuffer(); + Graphics::Surface *createTempFrameBuffer(); bool _disableCursorPalette; int _gammaValue; @@ -94,7 +93,7 @@ public: virtual int16 getHeight(); virtual int16 getWidth(); virtual void setPalette(const byte *colors, uint start, uint num); - virtual void grabPalette(unsigned char* colors, uint start, uint num); + virtual void grabPalette(unsigned char *colors, uint start, uint num); void restoreHardwarePalette(); virtual void copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h); @@ -136,10 +135,10 @@ public: virtual Common::SaveFileManager *getSavefileManager(); - void addEvent(Common::Event& e); - bool isEventQueueEmpty() { return queuePos == 0; } + void addEvent(const Common::Event& e); + bool isEventQueueEmpty() const { return queuePos == 0; } - virtual bool grabRawScreen(Graphics::Surface* surf); + virtual bool grabRawScreen(Graphics::Surface *surf); virtual void setFocusRectangle(const Common::Rect& rect); @@ -150,10 +149,10 @@ public: virtual Graphics::Surface *lockScreen(); virtual void unlockScreen(); - virtual Audio::Mixer* getMixer() { return _mixer; } - Audio::MixerImpl* getMixerImpl() { return _mixer; } + virtual Audio::Mixer *getMixer() { return _mixer; } + Audio::MixerImpl *getMixerImpl() { return _mixer; } - virtual Common::TimerManager* getTimerManager() { return _timer; } + virtual Common::TimerManager *getTimerManager() { return _timer; } static int timerHandler(int t); @@ -161,8 +160,8 @@ public: virtual void clearAutoComplete(); virtual void setCharactersEntered(int count); - u16 getDSPaletteEntry(u32 entry) { return _palette[entry]; } - u16 getDSCursorPaletteEntry(u32 entry) { return !_disableCursorPalette? _cursorPalette[entry]: _palette[entry]; } + u16 getDSPaletteEntry(u32 entry) const { return _palette[entry]; } + u16 getDSCursorPaletteEntry(u32 entry) const { return !_disableCursorPalette? _cursorPalette[entry]: _palette[entry]; } virtual void setCursorPalette(const byte *colors, uint start, uint num); @@ -172,8 +171,8 @@ public: void refreshCursor(); - Common::WriteStream* createConfigWriteStream(); - Common::SeekableReadStream* createConfigReadStream(); + Common::WriteStream *createConfigWriteStream(); + Common::SeekableReadStream *createConfigReadStream(); u16 applyGamma(u16 colour); void setGammaValue(int gamma) { _gammaValue = gamma; } diff --git a/backends/platform/ds/arm9/source/portdefs.h b/backends/platform/ds/arm9/source/portdefs.h index 5472b711b8..bdb42993d1 100644 --- a/backends/platform/ds/arm9/source/portdefs.h +++ b/backends/platform/ds/arm9/source/portdefs.h @@ -8,39 +8,26 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ #ifndef _PORTDEFS_H_ #define _PORTDEFS_H_ - - -/* -typedef unsigned char u8; -typedef signed char s8; - -typedef unsigned short u16; -typedef signed short s16; - -typedef unsigned int u32; -typedef signed int s32; -*/ - -#include "nds/ndstypes.h" - - -// Somebody removed these from scummsys.h, but they're still required, so I'm adding them here -// in the hope that they'll stay. +// Somebody removed these from scummsys.h, but they're still required, so I'm +// adding them here in the hope that they'll stay. #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -50,18 +37,20 @@ typedef signed int s32; #define double float -#define CT_NO_TRANSPARENCY - +#ifndef DISABLE_TEXT_CONSOLE #define DISABLE_TEXT_CONSOLE +#endif + +#ifndef DISABLE_COMMAND_LINE #define DISABLE_COMMAND_LINE +#endif +#ifndef STREAM_AUDIO_FROM_DISK #define STREAM_AUDIO_FROM_DISK +#endif -//#undef assert -//#define assert(expr) consolePrintf("Asserted!") #define NO_DEBUG_MSGS - // This is defined in dsmain.cpp #ifdef __cplusplus extern "C" { @@ -76,15 +65,17 @@ void consolePrintf(const char *format, ...); #undef assert #endif -#define assert(s) if (!(s)) consolePrintf("Assertion failed: '##s##' at file %s, line %d\n", __FILE__, __LINE__) +#define assert(s) \ + do { \ + if (!(s)) \ + consolePrintf("Assertion failed: '##s##' at file %s, line %d\n", __FILE__, __LINE__); \ + } while (0) //#include "ds-fs.h" //#define debug(fmt, ...) consolePrintf(fmt, ##__VA_ARGS__) //#define debug(fmt, ...) debug(0, fmt, ##__VA_ARGS__) -#define ITCM_DATA __attribute__((section(".itcm"))) - // FIXME: Since I can't change the engine at the moment (post lockdown) this define can go here. // This define changes the mouse-relative motion which doesn't make sense on a touch screen to // a more conventional form of input where the menus can be clicked on. diff --git a/backends/platform/ds/arm9/source/ramsave.cpp b/backends/platform/ds/arm9/source/ramsave.cpp deleted file mode 100644 index a0f4633988..0000000000 --- a/backends/platform/ds/arm9/source/ramsave.cpp +++ /dev/null @@ -1,538 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * 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; either version 2 - * of the License, or (at your option) any later version. - * - * 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 for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ -#ifdef GBA_SRAM_SAVE - - -#include "ramsave.h" -#include "nds.h" -#include "compressor/lz.h" - -#define CART_RAM ((vu8 *) (0x0A000000)) -#define SRAM_SAVE_MAX (65533) - -DSSaveFile::DSSaveFile() { - ptr = 0; - saveCompressed = false; - save.isValid = false; - ownsData = false; - isOpenFlag = true; - isTempFile = false; -} - -DSSaveFile::DSSaveFile(SCUMMSave* s, bool compressed, u8* data) { - save = *s; - saveData = data; - ptr = 0; - saveCompressed = compressed; - isOpenFlag = true; - - if (saveCompressed) { - u8* uncompressed = new unsigned char[save.size]; - if (!uncompressed) consolePrintf("Out of memory allocating %d!\n", save.size); - LZ_Uncompress(saveData, uncompressed, save.compressedSize); - saveData = uncompressed; - ownsData = true; - saveCompressed = false; -// consolePrintf("Decompressed. name=%s size=%d (%d)", save.name, save.size, save.compressedSize); - - } else { - ownsData = false; - origHeader = s; - } - - if (save.magic == (int) 0xBEEFCAFE) { - save.isValid = true; - } else { - save.isValid = false; - } - - isTempFile = false; - eosReached = false; -} - -DSSaveFile::~DSSaveFile() { - if (!ownsData) { - *origHeader = save; - DSSaveFileManager::instance()->flushToSaveRAM(); - } - if (ownsData) { - delete[] saveData; - } -} - -bool DSSaveFile::loadFromSaveRAM(vu8* address) { - - SCUMMSave newSave; - - for (int t = 0; t < (int) sizeof(newSave); t++) { - ((char *) (&newSave))[t] = *(address + t); - } - - if (newSave.magic == 0xBEEFCAFE) { - newSave.isValid = true; - - *((u16 *) (0x4000204)) |= 0x3; - - saveData = new unsigned char[newSave.compressedSize]; - - for (int t = 0; t < (int) newSave.compressedSize; t++) { - ((char *) (saveData))[t] = *(address + t + sizeof(newSave)); - } - - if (ownsData) delete[] this->saveData; - save = newSave; - saveCompressed = true; - this->saveData = saveData; - ownsData = true; - ptr = 0; - - return true; - } - - return false; -} - -void DSSaveFile::compress() { - if (!saveCompressed) { - unsigned char* compBuffer = new unsigned char[(save.size * 110) / 100]; - int compSize = LZ_Compress((u8 *) saveData, compBuffer, save.size); - save.compressedSize = compSize; - - - - delete[] saveData; - - // Make the save smaller - saveData = (u8 *) realloc(compBuffer, save.compressedSize); - saveCompressed = true; - } -} - -int DSSaveFile::saveToSaveRAM(vu8* address) { - - unsigned char* compBuffer; - bool failed; - - - int compSize; - - compress(); - - compSize = save.compressedSize; - compBuffer = saveData; - - if (DSSaveFileManager::instance()->getBytesFree() >= getRamUsage()) { - - DSSaveFileManager::instance()->addBytesFree(-getRamUsage()); - - // Write header - for (int t = 0; t < sizeof(save); t++) { - while (*(address + t) != ((char *) (&save))[t]) { - *(address + t) = ((char *) (&save))[t]; - } - } - - // Write compressed buffer - for (int t = sizeof(save); t < (int) sizeof(save) + compSize; t++) { - while (*(address + t) != compBuffer[t - sizeof(save)]) { - *(address + t) = compBuffer[t - sizeof(save)]; - } - } - - failed = false; - } else { - failed = true; - } - - - return failed? 0: compSize + sizeof(save); - -} - -void DSSaveFile::reset() { - ptr = 0; - eosReached = false; -} - -uint32 DSSaveFile::read(void *buf, uint32 size) { - if (ptr + size > save.size) { - size = save.size - ptr; - eosReached = true; - if (size < 0) size = 0; - } - memcpy(buf, saveData + ptr, size); -// consolePrintf("byte: %d ", ((u8 *) (buf))[0]); - - ptr += size; - return size; -} - -int32 DSSaveFile::pos() const { - return ptr; -} - -int32 DSSaveFile::size() const { - return save.size; -} - -bool DSSaveFile::seek(int32 pos, int whence) { - switch (whence) { - case SEEK_SET: { - ptr = pos; - break; - } - case SEEK_CUR: { - ptr += pos; - break; - } - case SEEK_END: { - ptr = save.size + pos; - break; - } - } - eosReached = false; - return true; -} - -bool DSSaveFile::eos() const { - return eosReached; -} - -void DSSaveFile::clearErr() { - eosReached = false; -} - -bool DSSaveFile::skip(uint32 bytes) { - ptr = ptr + bytes; - if (ptr > (int) save.size) ptr = save.size; - return true; -} - -uint32 DSSaveFile::write(const void *buf, uint32 size) { - - if (ptr + size > DS_MAX_SAVE_SIZE) { - size = DS_MAX_SAVE_SIZE - ptr; - } - - memcpy(saveData + ptr, buf, size); - ptr += size; - save.size += size; - return size; -} - -bool DSSaveFile::matches(const char *prefix, int num) { - char str[16]; - if (isValid()) { - sprintf(str, "%s%02d", prefix, num); - if (!strcmp(str, save.name)) { - return true; - } else { - return false; - } - } else { - return false; - } -} - -bool DSSaveFile::matches(const char *filename) { - if (isValid()) { - return !strcmp(save.name, filename); - } else { - return false; - } -} - -void DSSaveFile::setName(char *name) { - save.isValid = true; - save.magic = 0xBEEFCAFE; - ownsData = true; - save.size = 0; - save.compressedSize = 0; - saveData = new unsigned char[DS_MAX_SAVE_SIZE]; - strcpy(save.name, name); - - if ((strstr(name, ".s99")) || (strstr(name, ".c"))) { - isTempFile = true; - } else { - isTempFile = false; - } -} - -void DSSaveFile::clearData() { - save.size = 0; - - if (saveCompressed) { - if (ownsData) { - delete[] saveData; - DSSaveFileManager::instance()->addBytesFree(getRamUsage()); - } - saveData = new unsigned char[DS_MAX_SAVE_SIZE]; - saveCompressed = false; - ownsData = true; - } - -} - -void DSSaveFile::deleteFile() { - if (isValid()) { - if (ownsData) { - DSSaveFileManager::instance()->addBytesFree(getRamUsage()); - delete[] saveData; - saveData = NULL; - } - ptr = 0; - saveCompressed = false; - save.isValid = false; - ownsData = false; - isOpenFlag = true; - } -} - -DSSaveFileManager::DSSaveFileManager() { - instancePtr = this; - - *((u16 *) (0x4000204)) |= 0x3; - swiWaitForVBlank(); - - loadAllFromSRAM(); -} - -DSSaveFileManager::~DSSaveFileManager() { - instancePtr = NULL; -} - -void DSSaveFileManager::loadAllFromSRAM() { - int addr = 1; - - for (int r = 0; r < 8; r++) { - gbaSave[r].deleteFile(); - } - - sramBytesFree = SRAM_SAVE_MAX; - - // Try to find saves in save RAM - for (int r = 0; r < 8; r++) { - if (gbaSave[r].loadFromSaveRAM(CART_RAM + addr)) { - addr += gbaSave[r].getRamUsage(); - sramBytesFree -= gbaSave[r].getRamUsage(); - } - } - -} - -void DSSaveFileManager::formatSram() { - for (int r = 0; r < SRAM_SAVE_MAX; r++) { - *(CART_RAM + r) = 0; - } - - loadAllFromSRAM(); -} - -void DSSaveFileManager::listFiles() { - for (int r = 0; r < 8; r++) { - if (gbaSave[r].isValid()) { - consolePrintf("'%s': %d bytes\n", gbaSave[r].getName(), gbaSave[r].getRamUsage()); - } - } - consolePrintf("SRAM free: %d bytes\n", getBytesFree()); -} - -DSSaveFileManager* DSSaveFileManager::instancePtr = NULL; - -DSSaveFile *DSSaveFileManager::openSavefile(const char *filename, bool saveOrLoad) { - for (int r = 0; r < 8; r++) { - if (gbaSave[r].isValid() && (gbaSave[r].matches(filename))) { -// consolePrintf("Matched save %d (%d)\n", r, gbaSave[r].getSize()); - gbaSave[r].reset(); - //consolePrintf("reset "); - if (saveOrLoad) gbaSave[r].clearData(); -// consolePrintf("cleared "); - return gbaSave[r].clone(); - } - } - - if (saveOrLoad) { - return makeSaveFile(filename, saveOrLoad); - } else { - return NULL; - } -} - - - -DSSaveFile* DSSaveFile::clone() { -// consolePrintf("Clone %s %d\n", save.name, save.size); - return new DSSaveFile(&save, saveCompressed, saveData); -} - -void DSSaveFileManager::deleteFile(const char* name) { -// consolePrintf("Deleting %s", name); - for (int r = 0; r < 8; r++) { - if (gbaSave[r].isValid() && (gbaSave[r].matches(name))) { - gbaSave[r].deleteFile(); - } - } - flushToSaveRAM(); -} - -bool DSSaveFileManager::removeSavefile(const Common::String &filename) { - consolePrintf("DSSaveFileManager::removeSavefile : Not implemented yet.\n"); - assert(false); - //TODO: Implement this. Most likely, you just have to use the code of deleteFile? - return false; -} - - -Common::StringArray DSSaveFileManager::listSavefiles(const Common::String &pattern) { - consolePrintf("DSSaveFileManager::listSavefiles : Not implemented yet.\n"); - assert(false); - return Common::StringArray(); - /* - TODO: Implement this. If you don't understand what it should do, just ask - (e.g. on scummvm-devel or Fingolfin). It should be pretty simple if you - use Common::matchString from common/util.h and read the Doxygen docs, - then combine this with the old code below... - */ -} - - -/* -void DSSaveFileManager::listSavefiles(const char *prefix, bool *marks, int num) { - memset(marks, true, num * sizeof(bool)); - return; - - memset(marks, false, num*sizeof(bool)); - - for (int saveNum = 0; saveNum < num; saveNum++) { - for (int r = 0; r < 8; r++) { - if (gbaSave[r].isValid() && (gbaSave[r].matches(prefix, saveNum))) { - marks[saveNum] = true; - } - } - } - -} -*/ - - -DSSaveFile *DSSaveFileManager::makeSaveFile(const char *filename, bool saveOrLoad) { - - // Find a free save slot - int r = 0; - - while ((r < 8) && (gbaSave[r].isValid())) { - r++; - } - - if ((r == 8) && (gbaSave[r].isValid())) { - // No more saves - return NULL; - } else { - // Allocate this save -// consolePrintf("Allocated save %d\n", r); - gbaSave[r].setName((char *) filename); - gbaSave[r].reset(); - return gbaSave[r].clone(); - } -} - -void DSSaveFileManager::flushToSaveRAM() { - int cartAddr = 1; - int s; - int extraData = DSSaveFileManager::getExtraData(); - - *((u16 *) (0x4000204)) |= 0x3; - - swiWaitForVBlank(); - - int size = 0; - for (int r = 0; (r < 8); r++) { - if (gbaSave[r].isValid()) { - gbaSave[r].compress(); - if (!gbaSave[r].isTemp()) size += gbaSave[r].getRamUsage(); - } - } - - if (size <= SRAM_SAVE_MAX) { - - for (int r = 0; r < SRAM_SAVE_MAX; r++) { - *(CART_RAM + r) = 0; - } - - sramBytesFree = SRAM_SAVE_MAX; - - for (int r = 0; (r < 8); r++) { - if (gbaSave[r].isValid() && (!gbaSave[r].isTemp())) { - - cartAddr += s = gbaSave[r].saveToSaveRAM(CART_RAM + cartAddr); - - /* if (s == 0) { - consolePrintf("WARNING: Save didn't fit in cart RAM and has been lost!! Delete files and save again.", gbaSave[r].getName()); - failed = true; - }*/ - } - } - } else { - - consolePrintf("WARNING: Save didn't fit in cart RAM and has been lost!! Delete files and save again."); - loadAllFromSRAM(); - - } - - DSSaveFileManager::setExtraData(extraData); -// consolePrintf("SRAM free: %d bytes\n", getBytesFree()); -} - -void DSSaveFileManager::setExtraData(int data) { - // Offset of extra data is 31. This overlaps the padding and reserved bytes of the first save entry. - // which have not been used up until now. So it should be safe. - - vu8* sram = CART_RAM + 31; - - *(sram + 0) = 0xF0; // This is an identifier to check - *(sram + 1) = 0x0D; // that extra data is present. - - *(sram + 2) = (data & 0xFF000000) >> 24; // Now write the actual data - *(sram + 3) = (data & 0x00FF0000) >> 16; // taking care to use single - *(sram + 4) = (data & 0x0000FF00) >> 8; // byte writes (it's an 8-bit bus) - *(sram + 5) = (data & 0x000000FF); -} - -bool DSSaveFileManager::isExtraDataPresent() { - vu8* sram = CART_RAM + 31; - - // Check for the identifier - return ((*(sram + 0) == 0xF0) && (*(sram + 1) == 0x0D)); -} - -int DSSaveFileManager::getExtraData() { - vu8* sram = CART_RAM + 31; - - if (isExtraDataPresent()) { - int value = (*(sram + 2) << 24) | (*(sram + 3) << 16) | (*(sram + 4) << 8) | (*(sram + 5)); - return value; - } else { - return 0; - } -} - -#endif diff --git a/backends/platform/ds/arm9/source/ramsave.h b/backends/platform/ds/arm9/source/ramsave.h deleted file mode 100644 index e74df94952..0000000000 --- a/backends/platform/ds/arm9/source/ramsave.h +++ /dev/null @@ -1,150 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * 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; either version 2 - * of the License, or (at your option) any later version. - * - * 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 for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ - -#ifndef _RAMSAVE_H_ -#define _RAMSAVE_H_ - -#include "common/system.h" -#include "common/savefile.h" - -// SaveFileManager class - -#define DS_MAX_SAVE_SIZE 150000 - -class DSSaveFile : public Common::InSaveFile, public Common::OutSaveFile { - int address; - int ptr; - bool ownsData; - bool saveCompressed; - - struct SCUMMSave { - u32 magic; // 4 - bool isValid; // 5 - bool pad; // 6 - char name[16]; // 22 - u32 size; // 26 - u32 compressedSize; // 30 - u16 extraMagic; // 32 - u32 reserved; // 36 - } __attribute__ ((packed)); - - SCUMMSave save; - u8* saveData; - SCUMMSave* origHeader; - bool isOpenFlag; - bool isTempFile; - bool eosReached; - -public: - DSSaveFile(); - DSSaveFile(SCUMMSave* s, bool saveCompressed, u8* data); - ~DSSaveFile(); - - void reset(); - - bool isOpen() const { return isOpenFlag; } - virtual bool eos() const; - virtual void clearErr(); - virtual bool skip(uint32 size); - - virtual int32 pos() const; - virtual int32 size() const; - virtual bool seek(int32 pos, int whence); - - uint32 read(void *buf, uint32 size); - uint32 write(const void *buf, uint32 size); - - void setName(char *name); - char* getName() { return save.name; } - - bool isValid() { return save.isValid; } - bool isTemp() { return isTempFile; } - bool matches(const char *prefix, int num); - bool matches(const char *filename); - - void clearData(); - void compress(); - - int getRamUsage() { return sizeof(save) + save.compressedSize; } - char* getRamImage() { return (char *) &save; } - - int getSize() { return save.size; } - - DSSaveFile* clone(); - - bool loadFromSaveRAM(vu8* address); - int saveToSaveRAM(vu8* address); - - - - void deleteFile(); - - void operator delete(void *p) { -// consolePrintf("Finished! size=%d\n", ((DSSaveFile *) (p))->save->size); - } - - - -}; - - - -class DSSaveFileManager : public Common::SaveFileManager { - - DSSaveFile gbaSave[8]; - static DSSaveFileManager* instancePtr; - int sramBytesFree; - -public: - DSSaveFileManager(); - ~DSSaveFileManager(); - - static DSSaveFileManager* instance() { return instancePtr; } - - DSSaveFile *openSavefile(const char *filename, bool saveOrLoad); - - virtual Common::OutSaveFile* openForSaving(const Common::String &filename) { return openSavefile(filename.c_str(), true); } - virtual Common::InSaveFile* openForLoading(const Common::String &filename) { return openSavefile(filename.c_str(), false); } - - virtual bool removeSavefile(const Common::String &filename); - virtual Common::StringArray listSavefiles(const Common::String &pattern); - - void flushToSaveRAM(); - - void addBytesFree(int size) { sramBytesFree += size; } - int getBytesFree() { return sramBytesFree; } - - void deleteFile(char* name); - void listFiles(); - void formatSram(); - - void loadAllFromSRAM(); - - static bool isExtraDataPresent(); - static int getExtraData(); - static void setExtraData(int data); - -protected: - DSSaveFile *makeSaveFile(const Common::String &filename, bool saveOrLoad); -}; - -#endif diff --git a/backends/platform/ds/arm9/source/scummhelp.cpp b/backends/platform/ds/arm9/source/scummhelp.cpp index e1ddaecc2c..f1e8ba4fb2 100644 --- a/backends/platform/ds/arm9/source/scummhelp.cpp +++ b/backends/platform/ds/arm9/source/scummhelp.cpp @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -91,7 +94,8 @@ void updateStrings(byte gameId, byte version, Common::Platform platform, } -} +} // End of namespace DS + #undef ADD_BIND diff --git a/backends/platform/ds/arm9/source/scummhelp.h b/backends/platform/ds/arm9/source/scummhelp.h index 602cb5f788..4be28dca6a 100644 --- a/backends/platform/ds/arm9/source/scummhelp.h +++ b/backends/platform/ds/arm9/source/scummhelp.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -31,6 +34,7 @@ namespace DS { void updateStrings(byte gameId, byte version, Common::Platform platform, int page, Common::String &title, Common::String *&key, Common::String *&dsc); -} +} // End of namespace DS + #endif diff --git a/backends/platform/ds/arm9/source/touchkeyboard.cpp b/backends/platform/ds/arm9/source/touchkeyboard.cpp index 2d4b6a94f4..71f4f93c27 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.cpp +++ b/backends/platform/ds/arm9/source/touchkeyboard.cpp @@ -20,6 +20,7 @@ * */ #include <nds.h> +#include "NDS/scummvm_ipc.h" #include "touchkeyboard.h" #include "keyboard_raw.h" #include "keyboard_pal_raw.h" @@ -43,124 +44,124 @@ struct key_data { #define DS_CAPSLOCK 1 -key_data keys[DS_NUM_KEYS] = { +static key_data keys[DS_NUM_KEYS] = { // Key number x y character // Numbers - {28, 3, 0, '1'}, - {29, 5, 0, '2'}, - {30, 7, 0, '3'}, - {31, 9, 0, '4'}, - {32, 11, 0, '5'}, - {33, 13, 0, '6'}, - {34, 15, 0, '7'}, - {35, 17, 0, '8'}, - {36, 19, 0, '9'}, - {27, 21, 0, '0'}, - {45, 23, 0, Common::KEYCODE_MINUS}, - {50, 25, 0, Common::KEYCODE_EQUALS}, - {52, 27, 0, Common::KEYCODE_BACKSPACE}, + {28, 3, 0, '1', false}, + {29, 5, 0, '2', false}, + {30, 7, 0, '3', false}, + {31, 9, 0, '4', false}, + {32, 11, 0, '5', false}, + {33, 13, 0, '6', false}, + {34, 15, 0, '7', false}, + {35, 17, 0, '8', false}, + {36, 19, 0, '9', false}, + {27, 21, 0, '0', false}, + {45, 23, 0, Common::KEYCODE_MINUS, false}, + {50, 25, 0, Common::KEYCODE_EQUALS, false}, + {52, 27, 0, Common::KEYCODE_BACKSPACE, false}, // Top row - {'Q'-'A' + 1, 4, 2, 'Q'}, - {'W'-'A' + 1, 6, 2, 'W'}, - {'E'-'A' + 1, 8, 2, 'E'}, - {'R'-'A' + 1, 10, 2, 'R'}, - {'T'-'A' + 1, 12, 2, 'T'}, - {'Y'-'A' + 1, 14, 2, 'Y'}, - {'U'-'A' + 1, 16, 2, 'U'}, - {'I'-'A' + 1, 18, 2, 'I'}, - {'O'-'A' + 1, 20, 2, 'O'}, - {'P'-'A' + 1, 22, 2, 'P'}, - {43, 24, 2, Common::KEYCODE_LEFTBRACKET}, - {44, 26, 2, Common::KEYCODE_RIGHTBRACKET}, + {'Q'-'A' + 1, 4, 2, 'Q', false}, + {'W'-'A' + 1, 6, 2, 'W', false}, + {'E'-'A' + 1, 8, 2, 'E', false}, + {'R'-'A' + 1, 10, 2, 'R', false}, + {'T'-'A' + 1, 12, 2, 'T', false}, + {'Y'-'A' + 1, 14, 2, 'Y', false}, + {'U'-'A' + 1, 16, 2, 'U', false}, + {'I'-'A' + 1, 18, 2, 'I', false}, + {'O'-'A' + 1, 20, 2, 'O', false}, + {'P'-'A' + 1, 22, 2, 'P', false}, + {43, 24, 2, Common::KEYCODE_LEFTBRACKET, false}, + {44, 26, 2, Common::KEYCODE_RIGHTBRACKET, false}, // Middle row - {55, 3, 4, DS_CAPSLOCK}, - {'A'-'A' + 1, 5, 4, 'A'}, - {'S'-'A' + 1, 7, 4, 'S'}, - {'D'-'A' + 1, 9, 4, 'D'}, - {'F'-'A' + 1, 11, 4, 'F'}, - {'G'-'A' + 1, 13, 4, 'G'}, - {'H'-'A' + 1, 15, 4, 'H'}, - {'J'-'A' + 1, 17, 4, 'J'}, - {'K'-'A' + 1, 19, 4, 'K'}, - {'L'-'A' + 1, 21, 4, 'L'}, - {42, 23, 4, Common::KEYCODE_SEMICOLON}, - {41, 25, 4, Common::KEYCODE_QUOTE}, - {46, 27, 4, Common::KEYCODE_RETURN}, + {55, 3, 4, DS_CAPSLOCK, false}, + {'A'-'A' + 1, 5, 4, 'A', false}, + {'S'-'A' + 1, 7, 4, 'S', false}, + {'D'-'A' + 1, 9, 4, 'D', false}, + {'F'-'A' + 1, 11, 4, 'F', false}, + {'G'-'A' + 1, 13, 4, 'G', false}, + {'H'-'A' + 1, 15, 4, 'H', false}, + {'J'-'A' + 1, 17, 4, 'J', false}, + {'K'-'A' + 1, 19, 4, 'K', false}, + {'L'-'A' + 1, 21, 4, 'L', false}, + {42, 23, 4, Common::KEYCODE_SEMICOLON, false}, + {41, 25, 4, Common::KEYCODE_QUOTE, false}, + {46, 27, 4, Common::KEYCODE_RETURN, false}, // Bottom row - {51, 4, 6, DS_SHIFT}, - {'Z'-'A' + 1, 6, 6, 'Z'}, - {'X'-'A' + 1, 8, 6, 'X'}, - {'C'-'A' + 1, 10, 6, 'C'}, - {'V'-'A' + 1, 12, 6, 'V'}, - {'B'-'A' + 1, 14, 6, 'B'}, - {'N'-'A' + 1, 16, 6, 'N'}, - {'M'-'A' + 1, 18, 6, 'M'}, - {38, 20, 6, Common::KEYCODE_COMMA}, - {39, 22, 6, Common::KEYCODE_PERIOD}, - {40, 24, 6, Common::KEYCODE_SLASH}, + {51, 4, 6, DS_SHIFT, false}, + {'Z'-'A' + 1, 6, 6, 'Z', false}, + {'X'-'A' + 1, 8, 6, 'X', false}, + {'C'-'A' + 1, 10, 6, 'C', false}, + {'V'-'A' + 1, 12, 6, 'V', false}, + {'B'-'A' + 1, 14, 6, 'B', false}, + {'N'-'A' + 1, 16, 6, 'N', false}, + {'M'-'A' + 1, 18, 6, 'M', false}, + {38, 20, 6, Common::KEYCODE_COMMA, false}, + {39, 22, 6, Common::KEYCODE_PERIOD, false}, + {40, 24, 6, Common::KEYCODE_SLASH, false}, // Space bar - {47, 9, 8, Common::KEYCODE_SPACE}, - {48, 11, 8, Common::KEYCODE_SPACE}, - {48, 13, 8, Common::KEYCODE_SPACE}, - {48, 15, 8, Common::KEYCODE_SPACE}, - {48, 17, 8, Common::KEYCODE_SPACE}, - {49, 19, 8, Common::KEYCODE_SPACE}, + {47, 9, 8, Common::KEYCODE_SPACE, false}, + {48, 11, 8, Common::KEYCODE_SPACE, false}, + {48, 13, 8, Common::KEYCODE_SPACE, false}, + {48, 15, 8, Common::KEYCODE_SPACE, false}, + {48, 17, 8, Common::KEYCODE_SPACE, false}, + {49, 19, 8, Common::KEYCODE_SPACE, false}, // Cursor arrows - {52, 27, 8, Common::KEYCODE_LEFT}, - {54, 29, 8, Common::KEYCODE_DOWN}, - {53, 31, 8, Common::KEYCODE_RIGHT}, - {51, 29, 6, Common::KEYCODE_UP}, + {52, 27, 8, Common::KEYCODE_LEFT, false}, + {54, 29, 8, Common::KEYCODE_DOWN, false}, + {53, 31, 8, Common::KEYCODE_RIGHT, false}, + {51, 29, 6, Common::KEYCODE_UP, false}, // Close button - {56, 30, 0, Common::KEYCODE_INVALID}, + {56, 30, 0, Common::KEYCODE_INVALID, false}, // Function keys (needed for AGI) - {57, 4, -2, Common::KEYCODE_F1}, - {58, 6, -2, Common::KEYCODE_F2}, - {59, 8, -2, Common::KEYCODE_F3}, - {60, 10, -2, Common::KEYCODE_F4}, - {61, 14, -2, Common::KEYCODE_F5}, - {62, 16, -2, Common::KEYCODE_F6}, - {63, 18, -2, Common::KEYCODE_F7}, - {64, 20, -2, Common::KEYCODE_F8}, - {65, 24, -2, Common::KEYCODE_F9}, - {66, 26, -2, Common::KEYCODE_F10}, - {67, 28, -2, Common::KEYCODE_F11}, - {68, 30, -2, Common::KEYCODE_F12}, + {57, 4, -2, Common::KEYCODE_F1, false}, + {58, 6, -2, Common::KEYCODE_F2, false}, + {59, 8, -2, Common::KEYCODE_F3, false}, + {60, 10, -2, Common::KEYCODE_F4, false}, + {61, 14, -2, Common::KEYCODE_F5, false}, + {62, 16, -2, Common::KEYCODE_F6, false}, + {63, 18, -2, Common::KEYCODE_F7, false}, + {64, 20, -2, Common::KEYCODE_F8, false}, + {65, 24, -2, Common::KEYCODE_F9, false}, + {66, 26, -2, Common::KEYCODE_F10, false}, + {67, 28, -2, Common::KEYCODE_F11, false}, + {68, 30, -2, Common::KEYCODE_F12, false}, }; -int keyboardX; -int keyboardY; +static int keyboardX; +static int keyboardY; -int mapBase; -int tileBase; +static int s_mapBase; +static int s_tileBase; -u16* baseAddress; +static u16 *baseAddress; -bool shiftState; -bool capsLockState; +static bool shiftState; +static bool capsLockState; -bool closed; +static bool closed; -char autoCompleteWord[NUM_WORDS][32]; -int autoCompleteCount; +static char autoCompleteWord[NUM_WORDS][32]; +static int autoCompleteCount; -char autoCompleteBuffer[128]; +static char autoCompleteBuffer[128]; -int selectedCompletion = -1; -int charactersEntered = 0; -int typingTimeout = 0; +static int selectedCompletion = -1; +static int charactersEntered = 0; +static int typingTimeout = 0; // Render text onto the tiled screen -void drawText(int tx, int ty, char* string, bool highlight) { +void drawText(int tx, int ty, const char *string, bool highlight) { u16 baseValue = 0; @@ -181,7 +182,7 @@ void drawText(int tx, int ty, char* string, bool highlight) { -void restoreVRAM(int tileBase, int mapBase, u16* saveSpace) { +void restoreVRAM(int tileBase, int mapBase, u16 *saveSpace) { /* for (int r = 0; r < 32 * 32; r++) { ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase))[r] = *saveSpace++; } @@ -191,7 +192,7 @@ void restoreVRAM(int tileBase, int mapBase, u16* saveSpace) { }*/ } -void drawKeyboard(int tileBase, int mapBase, u16* saveSpace) { +void drawKeyboard(int tileBase, int mapBase, u16 *saveSpace) { /* int keyboardDataSize = 4736 * 2; */ for (int r = 0; r < 32 * 32; r++) { @@ -211,8 +212,8 @@ void drawKeyboard(int tileBase, int mapBase, u16* saveSpace) { // this is the font for (int tile = 0; tile < 94; tile++) { - u16* tileAddr = (u16 *) (CHAR_BASE_BLOCK_SUB(tileBase) + ((KEYBOARD_DATA_SIZE) + (tile * 32))); - u8* src = ((u8 *) (::_8x8font_tga_raw)) + 18 + tile * 8; + u16 *tileAddr = (u16 *) (CHAR_BASE_BLOCK_SUB(tileBase) + ((KEYBOARD_DATA_SIZE) + (tile * 32))); + const u8 *src = ((const u8 *) (::_8x8font_tga_raw)) + 18 + tile * 8; for (int y = 0 ; y < 8; y++) { for (int x = 0; x < 2; x++) { @@ -247,8 +248,8 @@ void drawKeyboard(int tileBase, int mapBase, u16* saveSpace) { keyboardX = -2; keyboardY = 2; - DS::mapBase = mapBase; - DS::tileBase = tileBase; + DS::s_mapBase = mapBase; + DS::s_tileBase = tileBase; shiftState = false; capsLockState = false; @@ -256,7 +257,7 @@ void drawKeyboard(int tileBase, int mapBase, u16* saveSpace) { int x = keyboardX; int y = keyboardY; - u16* base = ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase)); + u16 *base = ((u16 *) SCREEN_BASE_BLOCK_SUB(mapBase)); baseAddress = base; for (int r = 0; r < DS_NUM_KEYS; r++) { @@ -314,7 +315,7 @@ bool getKeyboardClosed() { } void setKeyHighlight(int key, bool highlight) { - u16* base = ((u16 *) SCREEN_BASE_BLOCK_SUB(DS::mapBase)); + u16 *base = ((u16 *) SCREEN_BASE_BLOCK_SUB(DS::s_mapBase)); if (highlight) { base[(keyboardY + keys[key].y) * 32 + keyboardX + keys[key].x] |= 0x1000; @@ -329,7 +330,7 @@ void setKeyHighlight(int key, bool highlight) { } } -void addAutoComplete(const char* word) { +void addAutoComplete(const char *word) { if (autoCompleteCount == NUM_WORDS) return; strcpy(&autoCompleteWord[autoCompleteCount++][0], word); drawAutoComplete(); @@ -353,7 +354,7 @@ void clearAutoComplete() { void typeCompletion(int current) { Common::Event event; - /* OSystem_DS* system = OSystem_DS::instance(); */ + /* OSystem_DS *system = OSystem_DS::instance(); */ strcat(autoCompleteBuffer, &autoCompleteWord[current][charactersEntered]); strcat(autoCompleteBuffer, " "); @@ -384,7 +385,7 @@ void typeCompletion(int current) { void updateTypeEvents() { if (autoCompleteBuffer[0] != '\0') { Common::Event event; - OSystem_DS* system = OSystem_DS::instance(); + OSystem_DS *system = OSystem_DS::instance(); event.kbd.keycode = (Common::KeyCode) autoCompleteBuffer[0]; event.kbd.ascii = autoCompleteBuffer[0]; @@ -395,8 +396,7 @@ void updateTypeEvents() { event.type = Common::EVENT_KEYUP; system->addEvent(event); - for (int r = 0; r < (int)strlen(autoCompleteBuffer); r++) - { + for (int r = 0; r < (int)strlen(autoCompleteBuffer); r++) { autoCompleteBuffer[r] = autoCompleteBuffer[r + 1]; } @@ -404,8 +404,7 @@ void updateTypeEvents() { } } -void createKeyEvent(int keyNum, Common::Event& event) -{ +void createKeyEvent(int keyNum, Common::Event& event) { event.kbd.flags = 0; if ((keys[keyNum].character >= '0') && (keys[keyNum].character <= '9')) { @@ -443,7 +442,7 @@ void releaseAllKeys() { if (keys[r].pressed) { DS::setKeyHighlight(r, false); - OSystem_DS* system = OSystem_DS::instance(); + OSystem_DS *system = OSystem_DS::instance(); Common::Event event; createKeyEvent(r, event); @@ -502,7 +501,7 @@ void addKeyboardEvents() { for (int r = 0; r < DS_NUM_KEYS; r++) { if (( (tx >= keys[r].x) && (tx <= keys[r].x + 1)) && (ty >= keys[r].y) && (ty <= keys[r].y + 1)) { - OSystem_DS* system = OSystem_DS::instance(); + OSystem_DS *system = OSystem_DS::instance(); Common::Event event; // consolePrintf("Key: %d\n", r); @@ -551,7 +550,7 @@ void addKeyboardEvents() { if (keys[r].pressed) { DS::setKeyHighlight(r, false); - OSystem_DS* system = OSystem_DS::instance(); + OSystem_DS *system = OSystem_DS::instance(); Common::Event event; if ((keys[r].character == Common::KEYCODE_INVALID)) { @@ -586,5 +585,4 @@ void addKeyboardEvents() { } -} - +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/touchkeyboard.h b/backends/platform/ds/arm9/source/touchkeyboard.h index 6ceb83bfc7..7644e48bff 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.h +++ b/backends/platform/ds/arm9/source/touchkeyboard.h @@ -8,15 +8,18 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ @@ -27,23 +30,25 @@ namespace DS { -static const int NUM_WORDS = 12; -static const int KEYBOARD_DATA_SIZE = 4736 * 2; -static const int KEYBOARD_BOTTOM_Y = 105; +enum { + NUM_WORDS = 12, + KEYBOARD_DATA_SIZE = 4736 * 2, + KEYBOARD_BOTTOM_Y = 105 +}; void createKeyEvent(int keyNum, Common::Event& event); -void drawKeyboard(int tileBase, int mapBase, u16* saveSpace); -void restoreVRAM(int tileBase, int mapBase, u16* saveSpace); +void drawKeyboard(int tileBase, int mapBase, u16 *saveSpace); +void restoreVRAM(int tileBase, int mapBase, u16 *saveSpace); void addKeyboardEvents(); bool getKeyboardClosed(); bool isInsideKeyboard(int x, int y); -void addAutoComplete(const char* word); +void addAutoComplete(const char *word); void clearAutoComplete(); void setCharactersEntered(int count); void releaseAllKeys(); -} +} // End of namespace DS #endif diff --git a/backends/platform/ds/arm9/source/wordcompletion.cpp b/backends/platform/ds/arm9/source/wordcompletion.cpp index 035f6a631d..43a16486c5 100644 --- a/backends/platform/ds/arm9/source/wordcompletion.cpp +++ b/backends/platform/ds/arm9/source/wordcompletion.cpp @@ -1,3 +1,28 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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; either version 2 + * of the License, or (at your option) any later version. + + * 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 for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + #include "wordcompletion.h" #include "osystem_ds.h" #include "engines/agi/agi.h" // Caution for #define for NUM_CHANNELS, causes problems in mixer_intern.h @@ -14,7 +39,7 @@ namespace DS { char wordBuffer[WORD_BUFFER_SIZE]; int wordBufferPos = 0; -char* wordBufferPtr[MAX_WORD_COUNT]; +char *wordBufferPtr[MAX_WORD_COUNT]; int wordBufferPtrPos = 0; void addAutoCompleteLine(const char *line) { @@ -53,7 +78,7 @@ void addAutoCompleteLine(const char *line) { } } -int stringCompare(const void* a, const void* b) { +int stringCompare(const void *a, const void *b) { const char** as = (const char **) a; const char** bs = (const char **) b; @@ -71,7 +96,7 @@ void sortAutoCompleteWordList() { } // Sends the current available words to the virtual keyboard code for display -bool findWordCompletions(const char* input) { +bool findWordCompletions(const char *input) { int min = 0; int max = wordBufferPtrPos - 1; char *word; @@ -82,7 +107,7 @@ bool findWordCompletions(const char* input) { if (wordBufferPtrPos == 0) return false; - OSystem_DS* system = (OSystem_DS *) g_system; + OSystem_DS *system = (OSystem_DS *) g_system; system->clearAutoComplete(); int start = 0; @@ -176,5 +201,6 @@ bool findWordCompletions(const char* input) { } -} +} // End of namespace DS + #endif diff --git a/backends/platform/ds/arm9/source/wordcompletion.h b/backends/platform/ds/arm9/source/wordcompletion.h index e50bade37b..55a0bc8b5a 100644 --- a/backends/platform/ds/arm9/source/wordcompletion.h +++ b/backends/platform/ds/arm9/source/wordcompletion.h @@ -1,3 +1,28 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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; either version 2 + * of the License, or (at your option) any later version. + + * 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 for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + namespace DS { extern void clearAutoCompleteWordList(); @@ -5,4 +30,4 @@ extern bool findWordCompletions(const char *input); extern void addAutoCompleteLine(const char *line); extern void sortAutoCompleteWordList(); -} +} // End of namespace DS diff --git a/backends/platform/ds/arm9/source/zipreader.cpp b/backends/platform/ds/arm9/source/zipreader.cpp index fd6da4e9b9..d4f055ee82 100644 --- a/backends/platform/ds/arm9/source/zipreader.cpp +++ b/backends/platform/ds/arm9/source/zipreader.cpp @@ -8,19 +8,23 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ +#include "common/scummsys.h" #include "zipreader.h" ZipFile::ZipFile() { @@ -28,7 +32,7 @@ ZipFile::ZipFile() { // consolePrintf("ZIP file check..."); - char* p = (char *) ZF_SEARCH_START; + char *p = (char *) ZF_SEARCH_START; bool found = false; _zipFile = NULL; @@ -75,7 +79,6 @@ bool ZipFile::restartFile() { bool more = true; while (!currentFileInFolder() && more) { - char name[128]; getFileName(name); more = skipFile(); } @@ -112,7 +115,7 @@ bool ZipFile::currentFileInFolder() { return false; } -void ZipFile::getFileName(char* name) { +void ZipFile::getFileName(char *name) { strncpy(name, (char *) (_currentFile + 1), _currentFile->nameLength); for (int r = 0; name[r] != 0; r++) { @@ -207,7 +210,7 @@ void ZipFile::changeToRoot() { _directory[0] = 0; } -void ZipFile::changeDirectory(const char* dir) { +void ZipFile::changeDirectory(const char *dir) { // consolePrintf("Current dir now '%s'\n", dir); assert(dir && *dir); diff --git a/backends/platform/ds/arm9/source/zipreader.h b/backends/platform/ds/arm9/source/zipreader.h index d1f70942ce..5429954088 100644 --- a/backends/platform/ds/arm9/source/zipreader.h +++ b/backends/platform/ds/arm9/source/zipreader.h @@ -8,21 +8,26 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ * */ #ifndef _ZIPREADER_H_ #define _ZIPREADER_H_ -#include "portdefs.h" + +#include <nds/ndstypes.h> + #define ZF_SEARCH_START 0x08000000 #define ZF_SEARCH_END 0x09000000 #define ZF_SEARCH_STRIDE 16 @@ -43,12 +48,12 @@ class ZipFile { u16 extraLength; // Length of any extra data } __attribute__ ((packed)); - char* _zipFile; + char *_zipFile; char _directory[128]; bool _allFilesVisible; - FileHeader* _currentFile; + FileHeader *_currentFile; public: ZipFile(); @@ -61,13 +66,13 @@ public: bool findFile(const char *search); // These return the file's data and information - char* getFile(); + char *getFile(); int getFileSize(); - void getFileName(char* name); + void getFileName(char *name); bool isDirectory(); // These set the current directory - void changeDirectory(const char* name); + void changeDirectory(const char *name); void changeToRoot(); void setAllFilesVisible(bool state) { _allFilesVisible = state; } diff --git a/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h b/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h index f41548f400..cf6436634a 100644 --- a/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h +++ b/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h @@ -33,34 +33,32 @@ ////////////////////////////////////////////////////////////////////// -typedef struct sTransferSoundData { -//--------------------------------------------------------------------------------- - const void *data; - u32 len; - u32 rate; - u8 vol; - u8 pan; - u8 format; - u8 PADDING; -} TransferSoundData, * pTransferSoundData; +typedef struct { + const void *data; + u32 len; + u32 rate; + u8 vol; + u8 pan; + u8 format; + u8 PADDING; +} TransferSoundData; //--------------------------------------------------------------------------------- -typedef struct sTransferSound { -//--------------------------------------------------------------------------------- - TransferSoundData data[16]; - u8 count; - u8 PADDING[3]; -} TransferSound, * pTransferSound; +typedef struct { + TransferSoundData data[16]; + u8 count; + u8 PADDING[3]; +} TransferSound; -typedef struct _adpcmBuffer { - u8* buffer[8]; +typedef struct { + u8 *buffer[8]; bool filled[8]; - u8* arm7Buffer[8]; + u8 *arm7Buffer[8]; bool arm7Dirty[8]; bool semaphore; } adpcmBuffer; @@ -82,22 +80,22 @@ typedef struct scummvmTransferRegion { uint8 curtime[8]; // current time response from RTC struct { - u8 rtc_command; - u8 rtc_year; //add 2000 to get 4 digit year - u8 rtc_month; //1 to 12 - u8 rtc_day; //1 to (days in month) - - u8 rtc_incr; - u8 rtc_hours; //0 to 11 for AM, 52 to 63 for PM - u8 rtc_minutes; //0 to 59 - u8 rtc_seconds; //0 to 59 - }; + u8 command; + u8 year; //add 2000 to get 4 digit year + u8 month; //1 to 12 + u8 day; //1 to (days in month) + + u8 incr; + u8 hours; //0 to 11 for AM, 52 to 63 for PM + u8 minutes; //0 to 59 + u8 seconds; //0 to 59 + } rtc; }; uint16 battery; // battery life ?? hopefully. :) uint16 aux; // i have no idea... - pTransferSound soundData; + TransferSound *soundData; adpcmBuffer adpcm; @@ -127,7 +125,7 @@ typedef struct scummvmTransferRegion { // Streaming sound bool streamFillNeeded[4]; int streamPlayingSection; -} scummTransferRegion, * pscummTransferRegion; +} scummTransferRegion; ////////////////////////////////////////////////////////////////////// diff --git a/backends/platform/ds/ds.mk b/backends/platform/ds/ds.mk index aeba1820c6..27309663d1 100644 --- a/backends/platform/ds/ds.mk +++ b/backends/platform/ds/ds.mk @@ -1,12 +1,64 @@ -# Repeat "all" target here, to make sure it is the first target -# Currently disabled, so only arm7.bin gets build -#all: +# To approximate the DS builds A, B, C, ... run our configure like this +# configure --host=ds --disable-translation --disable-all-engines OPTIONS +# where OPTIONS is... +# build A: --enable-scumm +# build B: --enable-sky --enable-queen +# build C: --enable-agos +# build D: --enable-gob --enable-cine --enable-agi +# build E: --enable-saga --disable-mad +# build F: --enable-kyra --disable-mad +# build G: --enable-lure +# build H: --enable-parallaction +# build I: --enable-made --disable-mad +# build K: --enable-cruise --disable-mad +# +# This does not currently take care of some things: +# * It does not #define DS_BUILD_A etc. -- most uses of that should be +# eliminated, though. Only usage should be for selecting the default config +# file (and for that we should really rather allow overriding the value of +# DEFAULT_CONFIG_FILE). +# There are a few game specific hacks which are currently controlled by this, +# too; we need to investigate those. +# * It does not currently adjust the logo. Ideally, if we ever get real plugin +# support, that should be necessary anymore anyway. +# * ... + +# Set location of ndsdir so that we can easily refer to files in it +ndsdir = backends/platform/ds + + +# Until we fix logo support, always use the A logo +LOGO = logoa.bmp + +# Uncomment the following line to enable support for the +# ace DS Debugger (remembering to make the same change in the arm7 makefile): +#USE_DEBUGGER = 1 +# TODO: Need to reimplement this (for arm9 and arm7). +#ifdef USE_DEBUGGER +# DEFINES += -DUSE_DEBUGGER +# CFLAGS += -g +#endif +# Uncomment the following line to enable the profiler +#USE_PROFILER = 1 +# TODO: Need to reimplement this; and maybe replace it by the --enable-profiling +# configure directive. Below is USE_PROFILER related code from the old NDS +# build system: +#ifdef USE_PROFILER +# CFLAGS += -mpoke-function-name -finstrument-functions -g +# DEFINES += -DUSE_PROFILER +#endif +# And this for module.mk: +#ifdef USE_PROFILER +# PORT_OBJS += arm9/source/profiler/cyg-profile.o +#endif + + + +# NOTE: The header and libs for the debugger is assumed to be in the libnds +# folder. -# Files in this list will be optimisied for speed, otherwise they will be optimised for space -OPTLIST := actor.cpp ds_main.cpp osystem_ds.cpp blitters.cpp fmopl.cpp rate.cpp isomap.cpp image.cpp gfx.cpp sprite.cpp actor_path.cpp actor_walk.cpp -#OPTLIST := # Compiler options for files which should be optimised for speed OPT_SPEED := -O3 @@ -14,31 +66,71 @@ OPT_SPEED := -O3 # Compiler options for files which should be optimised for space OPT_SIZE := -Os -mthumb +# By default optimize for size +CXXFLAGS += $(OPT_SIZE) + +# Files listed below will be optimisied for speed, otherwise they will be optimised for space +# TODO: speed original list contained three more files that should be optimized +# for speed: actor.cpp gfx.cpp sprite.cpp -- but there are many files with these +# names, which are the "right" ones? +$(ndsdir)/arm9/source/dsmain.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +$(ndsdir)/arm9/source/osystem_ds.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +$(ndsdir)/arm9/source/blitters.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +$(ndsdir)/arm9/source/ds_main.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/isomap.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +sound/rate.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/actor_walk.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/actor_path.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/image.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +sound/fmopl.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/scumm/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/m4/actor.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/scumm/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/cine/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/agos/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/gfx.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/saga/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/m4/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +engines/agi/sprite.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) +# TODO: Fingolfin says: optimizing staticres for size would +# save about 30k, so maybe consider that? +#engines/kyra/staticres.o: CXXFLAGS:=$(CXXFLAGS) $(OPT_SPEED) -#-mthumb -fno-gcse -fno-schedule-insns2 -OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) $(FAT_OBJS) +############################################################################# +# +# ARM9 rules. +# +############################################################################# + +all: scummvm.nds scummvm.ds.gba +clean: dsclean -# TODO: Handle files in OPTLIST. -# For this, the list should be made explicit. So, replace actor.cpp by path/to/actor.cpp -- -# in fact, there are several actor.cpp files, and right now all are "optimized", but -# I think Neil only had the SAGA one in mind. Same for gfx.cpp +dsclean: + $(RM) $(addprefix $(ndsdir)/, $(ARM7_MODULE_OBJS)) scummvm.nds scummvm.ds.gba +.PHONY: dsclean +# TODO: Add a 'dsdist' target ? +%.bin: %.elf + $(OBJCOPY) -S -O binary $< $@ +%.nds: %.bin $(ndsdir)/arm7/arm7.bin + ndstool -c $@ -9 $< -7 $(ndsdir)/arm7/arm7.bin -b $(srcdir)/$(ndsdir)/$(LOGO) "$(@F);ScummVM $(VERSION);DS Port" +%.ds.gba: %.nds + dsbuild $< -o $@ -l $(srcdir)/$(ndsdir)/arm9/ndsloader.bin + padbin 16 $@ ############################################################################# ############################################################################# ############################################################################# -#ndsdir = $(srcdir)/backends/platform/ds -ndsdir = backends/platform/ds - ############################################################################# # # ARM7 rules. @@ -47,12 +139,6 @@ ndsdir = backends/platform/ds # ############################################################################# -$(ndsdir)/arm7/arm7.bin: $(ndsdir)/arm7/arm7.elf - -$(ndsdir)/arm7/arm7.elf: \ - $(ndsdir)/arm7/source/libcartreset/cartreset.o \ - $(ndsdir)/arm7/source/main.o - # HACK/FIXME: C compiler, for cartreset.c -- we should switch this to use CXX # as soon as possible. CC := $(DEVKITARM)/bin/arm-eabi-gcc @@ -65,7 +151,7 @@ OBJCOPY := $(DEVKITARM)/bin/arm-eabi-objcopy # ARM7_ARCH := -mthumb-interwork -# note: arm9tdmi isn't the correct CPU arch, but anything newer and LD +# note: arm7tdmi isn't the correct CPU arch, but anything newer and LD # *insists* it has a FPU or VFP, and it won't take no for an answer! ARM7_CFLAGS := -g -Wall -O2\ -mcpu=arm7tdmi -mtune=arm7tdmi -fomit-frame-pointer\ @@ -89,7 +175,6 @@ ARM7_LDFLAGS := -g $(ARM7_ARCH) -mno-fpu $(MKDIR) $(*D)/$(DEPDIR) $(CC) -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o - # Set custom build flags for cartreset.o $(ndsdir)/arm7/source/libcartreset/cartreset.o: CXXFLAGS=$(ARM7_CFLAGS) $(ndsdir)/arm7/source/libcartreset/cartreset.o: CPPFLAGS= @@ -98,14 +183,28 @@ $(ndsdir)/arm7/source/libcartreset/cartreset.o: CPPFLAGS= $(ndsdir)/arm7/source/main.o: CXXFLAGS=$(ARM7_CXXFLAGS) $(ndsdir)/arm7/source/main.o: CPPFLAGS= +# Rule for creating ARM7 .elf files by linking .o files together with a special linker script +$(ndsdir)/arm7/arm7.elf: \ + $(ndsdir)/arm7/source/libcartreset/cartreset.o \ + $(ndsdir)/arm7/source/main.o + $(CXX) $(ARM7_LDFLAGS) -specs=ds_arm7.specs $+ -L$(DEVKITPRO)/libnds/lib -lnds7 -o $@ + # Rule for creating ARM7 .bin files from .elf files -%.bin: %.elf - @echo ------ - @echo Building $@... +$(ndsdir)/arm7/arm7.bin: $(ndsdir)/arm7/arm7.elf $(OBJCOPY) -O binary $< $@ -# Rule for creating ARM7 .elf files by linking .o files together with a special linker script -%.elf: - @echo ------ - @echo Building $@... - $(CXX) $(ARM7_LDFLAGS) -specs=ds_arm7.specs $+ -L/opt/devkitPro/libnds/lib -lnds7 -o $@ + + + + + + +# Command to build libmad is: +# ./configure --host=arm-elf --enable-speed --enable-sso -enable-fpm=arm CFLAGS='-specs=ds_arm9.specs -mthumb-interwork' +# +# I actually had to use +# ./configure --host=arm-elf --enable-speed --enable-sso -enable-fpm=arm CFLAGS='-specs=ds_arm9.specs -mthumb-interwork' LDFLAGS='C:/Progra~1/devkitpro/libnds/lib/libnds9.a' --disable-shared --disable-debugging +# +# Fingolfin used +# CXX=arm-eabi-g++ CC=arm-eabi-gcc ./configure --host=arm-elf --enable-speed --enable-sso -enable-fpm=arm CFLAGS='-specs=ds_arm9.specs -mthumb-interwork' --disable-shared --disable-debugging LDFLAGS=$DEVKITPRO/libnds/lib/libnds9.a + diff --git a/backends/platform/ds/module.mk b/backends/platform/ds/module.mk index 16630dc070..f6b69b3633 100644 --- a/backends/platform/ds/module.mk +++ b/backends/platform/ds/module.mk @@ -12,8 +12,6 @@ PORT_OBJS := \ arm9/source/gbampsave.o \ arm9/source/scummhelp.o \ arm9/source/osystem_ds.o \ - arm9/source/portdefs.o \ - arm9/source/ramsave.o \ arm9/source/touchkeyboard.o \ arm9/source/zipreader.o \ arm9/source/dsoptions.o \ @@ -21,10 +19,6 @@ PORT_OBJS := \ arm9/source/wordcompletion.o \ arm9/source/interrupt.o -ifdef USE_PROFILER - PORT_OBJS += arm9/source/profiler/cyg-profile.o -endif - DATA_OBJS := \ arm9/data/icons.o \ arm9/data/keyboard.o \ @@ -32,9 +26,9 @@ DATA_OBJS := \ arm9/data/default_font.o \ arm9/data/8x8font_tga.o -COMPRESSOR_OBJS := #arm9/source/compressor/lz.o - -FAT_OBJS := arm9/source/fat/disc_io.o arm9/source/fat/gba_nds_fat.o\ +FAT_OBJS := \ + arm9/source/fat/disc_io.o \ + arm9/source/fat/gba_nds_fat.o \ arm9/source/fat/io_fcsr.o \ arm9/source/fat/io_m3cf.o \ arm9/source/fat/io_mpcf.o \ @@ -51,21 +45,65 @@ FAT_OBJS := arm9/source/fat/disc_io.o arm9/source/fat/gba_nds_fat.o\ arm9/source/fat/m3sd.o -# arm9/source/fat/io_cf_common.o arm9/source/fat/io_m3_common.o\ -# arm9/source/fat/io_sd_common.o arm9/source/fat/io_scsd_s.o \ -# arm9/source/fat/io_sc_common.o arm9/source/fat/io_sd_common.o +MODULE_OBJS := $(DATA_OBJS) $(PORT_OBJS) $(FAT_OBJS) + + +#--------------------------------------------------------------------------------- +# canned command sequence for binary data +#--------------------------------------------------------------------------------- +define bin2o + $(MKDIR) $(*D) + bin2s $< | $(AS) -mthumb -mthumb-interwork -o $(@) +endef + +define bin2h + $(MKDIR) $(*D) + echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > $@ + echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> $@ + echo "extern const u32" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> $@ +endef + +vpath %.raw $(srcdir) +vpath %.pal $(srcdir) +vpath %.bin $(srcdir) + +%.o: %.raw + $(bin2o) + +%_raw.h: %.raw + $(bin2h) + +%.o: %.pal + $(bin2o) + +%_raw.h: %.pal + $(bin2h) + +%.o: %.bin + $(bin2o) -LIBCARTRESET_OBJS := - #arm9/source/libcartreset/cartreset.o +%_raw.h: %.bin + $(bin2h) -MODULE_OBJS := +# Mark files which require the *_raw.h files manually (for now, at least) +$(MODULE)/arm9/source/dsmain.o: \ + $(MODULE)/arm9/data/icons_raw.h \ + $(MODULE)/arm9/data/keyboard_raw.h \ + $(MODULE)/arm9/data/keyboard_pal_raw.h +$(MODULE)/arm9/source/touchkeyboard.o: \ + $(MODULE)/arm9/data/keyboard_raw.h \ + $(MODULE)/arm9/data/keyboard_pal_raw.h \ + $(MODULE)/arm9/data/8x8font_tga_raw.h -# TODO: Should add more dirs to MODULE_DIRS so that "make distclean" can remove .deps dirs. MODULE_DIRS += \ - backends/platform/ds/ + backends/platform/ds/ \ + backends/platform/ds/arm7/source/ \ + backends/platform/ds/arm7/source/libcartreset/ \ + backends/platform/ds/arm9/source/ \ + backends/platform/ds/arm9/source/fat/ # We don't use the rules.mk here on purpose OBJS := $(addprefix $(MODULE)/, $(MODULE_OBJS)) $(OBJS) diff --git a/backends/platform/gp2x/build/bundle.sh b/backends/platform/gp2x/build/bundle.sh index c68c62191b..d17f8bd831 100755 --- a/backends/platform/gp2x/build/bundle.sh +++ b/backends/platform/gp2x/build/bundle.sh @@ -1,52 +1,10 @@ -#!/bin/bash +#!/bin/sh echo Quick script to make building a distribution of the GP2X port more consistent. -PATH=/opt/open2x/gcc-4.1.1-glibc-2.3.6/arm-open2x-linux/bin:$PATH -PATH=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin:$PATH -export CXX=arm-open2x-linux-g++ -export CXXFLAGS=-march=armv4t -export CPPFLAGS=-I/opt/open2x/gcc-4.1.1-glibc-2.3.6/include -export LDFLAGS=-L/opt/open2x/gcc-4.1.1-glibc-2.3.6/lib +cd ../../../.. -echo Collecting files. -mkdir "scummvm-gp2x-`date '+%Y-%m-%d'`" -mkdir "scummvm-gp2x-`date '+%Y-%m-%d'`/saves" -mkdir "scummvm-gp2x-`date '+%Y-%m-%d'`/plugins" -mkdir "scummvm-gp2x-`date '+%Y-%m-%d'`/engine-data" +echo Building ScummVM for GP2X Wiz. -echo "Please put your save games in this dir" >> "scummvm-gp2x-`date '+%Y-%m-%d'`/saves/PUT_SAVES_IN_THIS_DIR" +make gp2x-bundle -cp ./scummvm.gpe ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ./scummvm.png ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ./README-GP2X ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ./mmuhack.o ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../scummvm.gp2x ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../AUTHORS ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../README ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../COPYING ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../COPYRIGHT ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../NEWS ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../gui/themes/scummmodern.zip ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../backends/vkeybd/packs/vkeybd_default.zip ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../dists/pred.dic ./scummvm-gp2x-`date '+%Y-%m-%d'`/ -cp ../../../../dists/engine-data/* ./scummvm-gp2x-`date '+%Y-%m-%d'`/engine-data -cp ../../../../plugins/* ./scummvm-gp2x-`date '+%Y-%m-%d'`/plugins - -echo Making Stripped GPE. -arm-open2x-linux-strip ./scummvm-gp2x-`date '+%Y-%m-%d'`/scummvm.gp2x - -echo Building ZIP bundle. -if [ -f /usr/bin/zip ] - then - rm ./"scummvm-gp2x-`date '+%Y-%m-%d'`.zip" - cd "scummvm-gp2x-`date '+%Y-%m-%d'`" - zip -r -9 "../scummvm-gp2x-`date '+%Y-%m-%d'`.zip" * - echo You should have a "scummvm-gp2x-`date '+%Y-%m-%d'`.zip" for the GP2X port ready to go. - cd .. - rm -R ./"scummvm-gp2x-`date '+%Y-%m-%d'`" - else - echo - /usr/bin/zip not found, ZIP bundle not created. - echo All included files can also be found in ./"scummvm-gp2x-`date '+%Y-%m-%d'`" - echo - Please use you preferred archive tool to bundle these files. -fi diff --git a/backends/platform/gp2x/gp2x-bundle.mk b/backends/platform/gp2x/gp2x-bundle.mk new file mode 100755 index 0000000000..c6fb72c1c3 --- /dev/null +++ b/backends/platform/gp2x/gp2x-bundle.mk @@ -0,0 +1,60 @@ +# Special target to create bundles for the GP2X. + +bundle_name = release/scummvm-gp2x + +gp2x-bundle: $(EXECUTABLE) + $(MKDIR) "$(bundle_name)" + $(MKDIR) "$(bundle_name)/saves" + $(MKDIR) "$(bundle_name)/engine-data" + + echo "Please put your save games in this dir" >> "$(bundle_name)/saves/PUT_SAVES_IN_THIS_DIR" + + $(CP) $(srcdir)/backends/platform/gp2x/build/scummvm.gpe $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gp2x/build/scummvm.png $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gp2x/build/README-GP2X $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gp2x/build/mmuhack.o $(bundle_name)/ + + $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) $(bundle_name)/ + $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(bundle_name)/ + $(INSTALL) -c -m 644 $(DIST_FILES_ENGINEDATA) $(bundle_name)/engine-data + $(CP) $(srcdir)/backends/vkeybd/packs/vkeybd_default.zip $(bundle_name)/ + + $(STRIP) $(EXECUTABLE) -o $(bundle_name)/$(EXECUTABLE) + +ifdef DYNAMIC_MODULES + $(INSTALL) -d "$(bundle_name)/plugins" + $(INSTALL) -c -m 644 $(PLUGINS) "$(bundle_name)/plugins" + $(STRIP) $(bundle_name)/plugins/* +endif + + tar -C $(bundle_name) -cvjf $(bundle_name).tar.bz2 . + rm -R ./$(bundle_name) + +gp2x-bundle-debug: $(EXECUTABLE) + $(MKDIR) "$(bundle_name)" + $(MKDIR) "$(bundle_name)/saves" + $(MKDIR) "$(bundle_name)/engine-data" + + echo "Please put your save games in this dir" >> "$(bundle_name)/saves/PUT_SAVES_IN_THIS_DIR" + + $(CP) $(srcdir)/backends/platform/gp2x/build/scummvm.gpe $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gp2x/build/scummvm.png $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gp2x/build/README-GP2X $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gp2x/build/mmuhack.o $(bundle_name)/ + + $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) $(bundle_name)/ + $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(bundle_name)/ + $(INSTALL) -c -m 644 $(DIST_FILES_ENGINEDATA) $(bundle_name)/engine-data + $(CP) $(srcdir)/backends/vkeybd/packs/vkeybd_default.zip $(bundle_name)/ + + $(INSTALL) -c -m 777 $(srcdir)/$(EXECUTABLE) $(bundle_name)/$(EXECUTABLE) + +ifdef DYNAMIC_MODULES + $(INSTALL) -d "$(bundle_name)/scummvm/plugins" + $(INSTALL) -c -m 644 $(PLUGINS) "$(bundle_name)/scummvm/plugins" +endif + + tar -C $(bundle_name) -cvjf $(bundle_name)-debug.tar.bz2 . + rm -R ./$(bundle_name) + +.PHONY: gp2x-bundle gp2x-bundle-debug diff --git a/backends/platform/gp2xwiz/build/bundle-debug.sh b/backends/platform/gp2xwiz/build/bundle-debug.sh new file mode 100755 index 0000000000..cd5145b31d --- /dev/null +++ b/backends/platform/gp2xwiz/build/bundle-debug.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +echo Quick script to make building a distribution of the GP2X Wiz backend more consistent. + +cd ../../../.. + +echo Building ScummVM for GP2X Wiz. + +make gp2xwiz-bundle-debug diff --git a/backends/platform/gp2xwiz/build/bundle.sh b/backends/platform/gp2xwiz/build/bundle.sh index 065bd7a685..579e2dc77b 100755 --- a/backends/platform/gp2xwiz/build/bundle.sh +++ b/backends/platform/gp2xwiz/build/bundle.sh @@ -2,56 +2,8 @@ echo Quick script to make building a distribution of the GP2X Wiz backend more consistent. -echo Collecting files. -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/saves" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/plugins" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/engine-data" -mkdir "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/lib" +cd ../../../.. +echo Building ScummVM for GP2X Wiz. -echo "Please put your save games in this dir" >> "scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/saves/PUT_SAVES_IN_THIS_DIR" - -cp ./scummvm.gpe ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ./scummvm.png ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ./README-GP2XWIZ ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ./scummvm.ini ./scummvm-wiz-`date '+%Y-%m-%d'`/ -cp ../../../../scummvm.wiz ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../AUTHORS ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../README ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../COPYING ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../COPYRIGHT ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../NEWS ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../gui/themes/scummmodern.zip ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../backends/vkeybd/packs/vkeybd_default.zip ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../dists/pred.dic ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/ -cp ../../../../dists/engine-data/* ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/engine-data -cp ../../../../plugins/* ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/plugins - -# Copy over dynamic libs needed by the app (as the ones in the default filesystem are broken). -f=`which arm-open2x-linux-g++` -loc=`dirname "$f"` -cp $loc/../lib/libz.so.1.2.3 ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/lib/libz.so.1 -cp $loc/../lib/libvorbisidec.so.1.0.2 ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/lib/libvorbisidec.so.1 - -echo Making Stripped Binary. -arm-open2x-linux-strip ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/scummvm.wiz - -echo Making Stripped Plugins. -arm-open2x-linux-strip ./scummvm-wiz-`date '+%Y-%m-%d'`/scummvm/plugins/* - -echo Building ZIP bundle. -if [ -f /usr/bin/zip ] - then - rm ./"scummvm-wiz-`date '+%Y-%m-%d'`.zip" - cd "scummvm-wiz-`date '+%Y-%m-%d'`" - zip -r -9 "../scummvm-wiz-`date '+%Y-%m-%d'`.zip" * - echo You should have a "scummvm-wiz-`date '+%Y-%m-%d'`.zip" for the GP2X Wiz backend ready to go. - cd .. - rm -R ./"scummvm-wiz-`date '+%Y-%m-%d'`" - else - echo - /usr/bin/zip not found, ZIP bundle not created. - echo All included files can also be found in ./"scummvm-wiz-`date '+%Y-%m-%d'`" - echo - Please use you preferred archive tool to bundle these files. -fi +make gp2xwiz-bundle diff --git a/backends/platform/gp2xwiz/build/scummvm-gdb.gpe b/backends/platform/gp2xwiz/build/scummvm-gdb.gpe new file mode 100755 index 0000000000..64b6c8b974 --- /dev/null +++ b/backends/platform/gp2xwiz/build/scummvm-gdb.gpe @@ -0,0 +1,16 @@ +#!/bin/sh + +# Export the location of any libs ScummVM depends on +# (to avoid installing to the NAND and overwriting the broken ones there). +export LD_LIBRARY_PATH=`pwd`/lib:$LD_LIBRARY_PATH + +# Run ScummVM via GDB (so make sure you have a terminal open or serial). +# Oh, and GDB installed of course ;) +gdb --args ./scummvm.wiz --fullscreen --gfx-mode=1x --config=$(pwd)/.scummvmrc + +# Sync the SD card to check that everything is written. +sync + +# Return to the GPH menu screen +cd /usr/gp2x +exec /usr/gp2x/gp2xmenu diff --git a/backends/platform/gp2xwiz/gp2xwiz-bundle.mk b/backends/platform/gp2xwiz/gp2xwiz-bundle.mk new file mode 100755 index 0000000000..fa5a247865 --- /dev/null +++ b/backends/platform/gp2xwiz/gp2xwiz-bundle.mk @@ -0,0 +1,73 @@ +# Special target to create bundles for the GP2X Wiz. + +#bundle_name = release/scummvm-wiz-`date '+%Y-%m-%d'` +bundle_name = release/scummvm-gp2xwiz +f=$(shell which $(STRIP)) +libloc = $(shell dirname $(f)) + +gp2xwiz-bundle: $(EXECUTABLE) + $(MKDIR) "$(bundle_name)" + $(MKDIR) "$(bundle_name)/scummvm" + $(MKDIR) "$(bundle_name)/scummvm/saves" + $(MKDIR) "$(bundle_name)/scummvm/engine-data" + $(MKDIR) "$(bundle_name)/scummvm/lib" + + echo "Please put your save games in this dir" >> "$(bundle_name)/scummvm/saves/PUT_SAVES_IN_THIS_DIR" + + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm.gpe $(bundle_name)/scummvm/ + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm.png $(bundle_name)/scummvm/ + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/README-GP2XWIZ $(bundle_name)/scummvm/ + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm.ini $(bundle_name)/ + + $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) $(bundle_name)/scummvm/ + $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(bundle_name)/scummvm/ + $(INSTALL) -c -m 644 $(DIST_FILES_ENGINEDATA) $(bundle_name)/scummvm/engine-data + $(CP) $(srcdir)/backends/vkeybd/packs/vkeybd_default.zip $(bundle_name)/scummvm/ + + $(STRIP) $(EXECUTABLE) -o $(bundle_name)/scummvm/$(EXECUTABLE) + +ifdef DYNAMIC_MODULES + $(INSTALL) -d "$(bundle_name)/scummvm/plugins" + $(INSTALL) -c -m 644 $(PLUGINS) "$(bundle_name)/scummvm/plugins" + $(STRIP) $(bundle_name)/scummvm/plugins/* +endif + + $(CP) $(libloc)/../lib/libz.so.1.2.3 $(bundle_name)/scummvm/lib/libz.so.1 + $(CP) $(libloc)/../lib/libvorbisidec.so.1.0.2 $(bundle_name)/scummvm/lib/libvorbisidec.so.1 + + tar -C $(bundle_name) -cvjf $(bundle_name).tar.bz2 . + rm -R ./$(bundle_name) + +gp2xwiz-bundle-debug: $(EXECUTABLE) + $(MKDIR) "$(bundle_name)" + $(MKDIR) "$(bundle_name)/scummvm" + $(MKDIR) "$(bundle_name)/scummvm/saves" + $(MKDIR) "$(bundle_name)/scummvm/engine-data" + $(MKDIR) "$(bundle_name)/scummvm/lib" + + echo "Please put your save games in this dir" >> "$(bundle_name)/scummvm/saves/PUT_SAVES_IN_THIS_DIR" + + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm-gdb.gpe $(bundle_name)/scummvm/scummvm.gpe + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm.png $(bundle_name)/scummvm/ + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/README-GP2XWIZ $(bundle_name)/scummvm/ + $(CP) $(srcdir)/backends/platform/gp2xwiz/build/scummvm.ini $(bundle_name)/ + + $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) $(bundle_name)/scummvm/ + $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(bundle_name)/scummvm/ + $(INSTALL) -c -m 644 $(DIST_FILES_ENGINEDATA) $(bundle_name)/scummvm/engine-data + $(CP) $(srcdir)/backends/vkeybd/packs/vkeybd_default.zip $(bundle_name)/scummvm/ + + $(INSTALL) -c -m 777 $(srcdir)/$(EXECUTABLE) $(bundle_name)/scummvm/$(EXECUTABLE) + +ifdef DYNAMIC_MODULES + $(INSTALL) -d "$(bundle_name)/scummvm/plugins" + $(INSTALL) -c -m 644 $(PLUGINS) "$(bundle_name)/scummvm/plugins" +endif + + $(CP) $(libloc)/../lib/libz.so.1.2.3 $(bundle_name)/scummvm/lib/libz.so.1 + $(CP) $(libloc)/../lib/libvorbisidec.so.1.0.2 $(bundle_name)/scummvm/lib/libvorbisidec.so.1 + + tar -C $(bundle_name) -cvjf $(bundle_name)-debug.tar.bz2 . + rm -R ./$(bundle_name) + +.PHONY: gp2xwiz-bundle gp2xwiz-bundle-debug diff --git a/backends/platform/iphone/osys_events.cpp b/backends/platform/iphone/osys_events.cpp index 72408be89a..c1c7ffdc0c 100644 --- a/backends/platform/iphone/osys_events.cpp +++ b/backends/platform/iphone/osys_events.cpp @@ -24,6 +24,7 @@ */ #include "gui/message.h" +#include "common/translation.h" #include "osys_main.h" @@ -335,9 +336,9 @@ bool OSystem_IPHONE::handleEvent_mouseSecondDragged(Common::Event &event, int x, _touchpadModeEnabled = !_touchpadModeEnabled; const char *dialogMsg; if (_touchpadModeEnabled) - dialogMsg = "Touchpad mode enabled."; + dialogMsg = _("Touchpad mode enabled."); else - dialogMsg = "Touchpad mode disabled."; + dialogMsg = _("Touchpad mode disabled."); GUI::TimedMessageDialog dialog(dialogMsg, 1500); dialog.runModal(); return false; diff --git a/backends/platform/psp/Makefile b/backends/platform/psp/Makefile index 7f8bb63b0a..fed558eaad 100644 --- a/backends/platform/psp/Makefile +++ b/backends/platform/psp/Makefile @@ -124,17 +124,13 @@ CXXFLAGS += -pg -g LDFLAGS += -pg endif -# SDL Libs and Flags -SDLFLAGS := $(shell $(PSPBIN)/sdl-config --cflags) -SDLLIBS := $(shell $(PSPBIN)/sdl-config --libs) # PSP LIBS PSPLIBS = -lpspprof -lpspvfpu -lpspdebug -lpspgu -lpspge -lpspdisplay -lpspctrl -lpspsdk \ -lpsputility -lpspuser -lpsppower -lpsphprm -lpspsdk -lpsprtc -lpspaudio -lpspaudiocodec \ -lpspkernel # Add in PSPSDK includes and libraries. -CXXFLAGS += $(SDLFLAGS) -LIBS += -lpng -lSDL -lz $(findstring -lGL,$(SDLLIBS)) -lstdc++ -lc -lm $(filter -L%,$(SDLLIBS)) $(PSPLIBS) +LIBS += -lpng -lz -lstdc++ -lc -lm $(PSPLIBS) OBJS := powerman.o \ psp_main.o \ @@ -151,6 +147,7 @@ OBJS := powerman.o \ pspkeyboard.o \ audio.o \ thread.o \ + rtc.o \ mp3.o # Include common Scummvm makefile diff --git a/backends/platform/psp/README.PSP b/backends/platform/psp/README.PSP index 45f31483f7..f4d5bae6d6 100644 --- a/backends/platform/psp/README.PSP +++ b/backends/platform/psp/README.PSP @@ -99,8 +99,6 @@ To build ScummVM for PSP you need: Note: This usually gets installed by the PSP toolchain, so you don't have to do it manually. -- SDL (svn co svn://svn.pspdev.org/psp/trunk/SDL) - - zlib (svn co svn://svn.pspdev.org/psp/trunk/zlib) - libPNG (svn co svn://svn.pspdev.org/psp/trunk/libpng) diff --git a/backends/platform/psp/README.PSP.in b/backends/platform/psp/README.PSP.in index d9f75974f1..2d53fd3b47 100644 --- a/backends/platform/psp/README.PSP.in +++ b/backends/platform/psp/README.PSP.in @@ -99,8 +99,6 @@ To build ScummVM for PSP you need: Note: This usually gets installed by the PSP toolchain, so you don't have to do it manually. -- SDL (svn co svn://svn.pspdev.org/psp/trunk/SDL) - - zlib (svn co svn://svn.pspdev.org/psp/trunk/zlib) - libPNG (svn co svn://svn.pspdev.org/psp/trunk/libpng) diff --git a/backends/platform/psp/display_manager.cpp b/backends/platform/psp/display_manager.cpp index c2f21e084b..a9f33f6091 100644 --- a/backends/platform/psp/display_manager.cpp +++ b/backends/platform/psp/display_manager.cpp @@ -311,27 +311,29 @@ void DisplayManager::calculateScaleParams() { } } -void DisplayManager::renderAll() { +// return true if we really rendered or no dirty. False otherwise +bool DisplayManager::renderAll() { DEBUG_ENTER_FUNC(); #ifdef USE_DISPLAY_CALLBACK if (!_masterGuRenderer.isRenderFinished()) { PSP_DEBUG_PRINT("Callback render not finished.\n"); - return; + return false; // didn't render } #endif /* USE_DISPLAY_CALLBACK */ - if (!isTimeToUpdate()) - return; - + // This is cheaper than checking time, so we do it first if (!_screen->isDirty() && (!_overlay->isDirty()) && (!_cursor->isDirty()) && (!_keyboard->isDirty())) { PSP_DEBUG_PRINT("Nothing dirty\n"); - return; + return true; // nothing to render } + if (!isTimeToUpdate()) + return false; // didn't render + PSP_DEBUG_PRINT("screen[%s], overlay[%s], cursor[%s], keyboard[%s]\n", _screen->isDirty() ? "true" : "false", _overlay->isDirty() ? "true" : "false", @@ -361,6 +363,8 @@ void DisplayManager::renderAll() { _keyboard->setClean(); _masterGuRenderer.guPostRender(); + + return true; // rendered successfully } inline bool DisplayManager::isTimeToUpdate() { @@ -375,7 +379,7 @@ inline bool DisplayManager::isTimeToUpdate() { return true; } -Common::List<Graphics::PixelFormat> DisplayManager::getSupportedPixelFormats() { +Common::List<Graphics::PixelFormat> DisplayManager::getSupportedPixelFormats() const { Common::List<Graphics::PixelFormat> list; // In order of preference diff --git a/backends/platform/psp/display_manager.h b/backends/platform/psp/display_manager.h index 5864f39b36..dbbdf2022c 100644 --- a/backends/platform/psp/display_manager.h +++ b/backends/platform/psp/display_manager.h @@ -40,12 +40,12 @@ public: void setupCallbackThread(); private: static uint32 _displayList[]; - uint32 _lastRenderTime; // For measuring rendering + uint32 _lastRenderTime; // For measuring rendering time void guProgramDisplayBufferSizes(); static int guCallbackThread(SceSize, void *); // for the graphics callbacks static int guCallback(int, int, void *__this); - bool _renderFinished; - int _callbackId; + bool _renderFinished; // for sync with render callback + int _callbackId; // to keep track of render callback }; class Screen; @@ -68,7 +68,7 @@ public: ~DisplayManager(); void init(); - void renderAll(); + bool renderAll(); // return true if rendered or nothing dirty. False otherwise bool setGraphicsMode(int mode); bool setGraphicsMode(const char *name); int getGraphicsMode() const { return _graphicsMode; } @@ -83,12 +83,12 @@ public: void setSizeAndPixelFormat(uint width, uint height, const Graphics::PixelFormat *format); // Getters - float getScaleX() { return _displayParams.scaleX; } - float getScaleY() { return _displayParams.scaleY; } - uint32 getOutputWidth() { return _displayParams.screenOutput.width; } - uint32 getOutputHeight() { return _displayParams.screenOutput.height; } - uint32 getOutputBitsPerPixel() { return _displayParams.outputBitsPerPixel; } - Common::List<Graphics::PixelFormat> getSupportedPixelFormats(); + float getScaleX() const { return _displayParams.scaleX; } + float getScaleY() const { return _displayParams.scaleY; } + uint32 getOutputWidth() const { return _displayParams.screenOutput.width; } + uint32 getOutputHeight() const { return _displayParams.screenOutput.height; } + uint32 getOutputBitsPerPixel() const { return _displayParams.outputBitsPerPixel; } + Common::List<Graphics::PixelFormat> getSupportedPixelFormats() const; private: struct GlobalDisplayParams { diff --git a/backends/platform/psp/module.mk b/backends/platform/psp/module.mk index 99170ce7fb..e9c896acfd 100644 --- a/backends/platform/psp/module.mk +++ b/backends/platform/psp/module.mk @@ -15,6 +15,7 @@ MODULE_OBJS := powerman.o \ pspkeyboard.o \ audio.o \ thread.o \ + rtc.o \ mp3.o MODULE_DIRS += \ diff --git a/backends/platform/psp/mp3.cpp b/backends/platform/psp/mp3.cpp index 972c5a8ba8..e25891396b 100644 --- a/backends/platform/psp/mp3.cpp +++ b/backends/platform/psp/mp3.cpp @@ -85,13 +85,13 @@ bool Mp3PspStream::initDecoder() { } } else { if (sceUtilityLoadAvModule(PSP_AV_MODULE_AVCODEC) < 0) { - PSP_ERROR("failed to load AVCODEC module.\n"); + PSP_ERROR("failed to load AVCODEC module. ME cannot start.\n"); _decoderFail = true; return false; } } - PSP_INFO_PRINT("Using PSP's ME for MP3\n"); // important to know this is happening + PSP_DEBUG_PRINT("Using PSP's ME for MP3\n"); // important to know this is happening _decoderInit = true; return true; @@ -319,7 +319,7 @@ void Mp3PspStream::decodeMP3Data() { // This function blocks. We'll want to put it in a thread int ret = sceAudiocodecDecode(_codecParams, 0x1002); if (ret < 0) { - PSP_ERROR("failed to decode MP3 data in ME. sceAudiocodecDecode returned 0x%x\n", ret); + PSP_INFO_PRINT("failed to decode MP3 data in ME. sceAudiocodecDecode returned 0x%x\n", ret); // handle error here } diff --git a/backends/platform/psp/mp3.h b/backends/platform/psp/mp3.h index f8802f930c..029b3e498c 100644 --- a/backends/platform/psp/mp3.h +++ b/backends/platform/psp/mp3.h @@ -110,7 +110,7 @@ public: bool endOfData() const { return _state == MP3_STATE_EOS; } bool isStereo() const { return MAD_NCHANNELS(&_header) == 2; } - int getRate() const { return _header.samplerate; } + int getRate() const { return _sampleRate; } bool seek(const Timestamp &where); Timestamp getLength() const { return _length; } diff --git a/backends/platform/psp/osys_psp.cpp b/backends/platform/psp/osys_psp.cpp index 2043a4bef2..b09d9c0c00 100644 --- a/backends/platform/psp/osys_psp.cpp +++ b/backends/platform/psp/osys_psp.cpp @@ -37,6 +37,7 @@ #include "backends/platform/psp/psppixelformat.h" #include "backends/platform/psp/osys_psp.h" #include "backends/platform/psp/powerman.h" +#include "backends/platform/psp/rtc.h" #include "backends/saves/psp/psp-saves.h" #include "backends/timer/default/default-timer.h" @@ -48,8 +49,6 @@ #include "backends/platform/psp/trace.h" -#define USE_PSP_AUDIO - #define SAMPLES_PER_SEC 44100 static int timer_handler(int t) { @@ -58,14 +57,6 @@ static int timer_handler(int t) { return t; } -void OSystem_PSP::initSDL() { -#ifdef USE_PSP_AUDIO - SDL_Init(0); -#else - SDL_Init(SDL_INIT_AUDIO); -#endif -} - OSystem_PSP::~OSystem_PSP() {} #define PSP_SCREEN_WIDTH 480 @@ -74,6 +65,9 @@ OSystem_PSP::~OSystem_PSP() {} void OSystem_PSP::initBackend() { DEBUG_ENTER_FUNC(); + // Instantiate real time clock + PspRtc::instance(); + _cursor.enableCursorPalette(false); _cursor.setXY(PSP_SCREEN_WIDTH >> 1, PSP_SCREEN_HEIGHT >> 1); // Mouse in the middle of the screen @@ -89,8 +83,6 @@ void OSystem_PSP::initBackend() { _inputHandler.setKeyboard(&_keyboard); _inputHandler.init(); - initSDL(); - _savefile = new PSPSaveFileManager; _timer = new DefaultTimerManager(); @@ -127,11 +119,13 @@ int OSystem_PSP::getDefaultGraphicsMode() const { bool OSystem_PSP::setGraphicsMode(int mode) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; return _displayManager.setGraphicsMode(mode); } bool OSystem_PSP::setGraphicsMode(const char *name) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; return _displayManager.setGraphicsMode(name); } @@ -146,7 +140,7 @@ Graphics::PixelFormat OSystem_PSP::getScreenFormat() const { return _screen.getScummvmPixelFormat(); } -Common::List<Graphics::PixelFormat> OSystem_PSP::getSupportedFormats() { +Common::List<Graphics::PixelFormat> OSystem_PSP::getSupportedFormats() const { return _displayManager.getSupportedPixelFormats(); } @@ -154,6 +148,7 @@ Common::List<Graphics::PixelFormat> OSystem_PSP::getSupportedFormats() { void OSystem_PSP::initSize(uint width, uint height, const Graphics::PixelFormat *format) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _displayManager.setSizeAndPixelFormat(width, height, format); _cursor.setVisible(false); @@ -172,6 +167,7 @@ int16 OSystem_PSP::getHeight() { void OSystem_PSP::setPalette(const byte *colors, uint start, uint num) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _screen.setPartialPalette(colors, start, num); _cursor.setScreenPalette(colors, start, num); _cursor.clearKeyColor(); @@ -179,6 +175,7 @@ void OSystem_PSP::setPalette(const byte *colors, uint start, uint num) { void OSystem_PSP::setCursorPalette(const byte *colors, uint start, uint num) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _cursor.setCursorPalette(colors, start, num); _cursor.enableCursorPalette(true); _cursor.clearKeyColor(); // Do we need this? @@ -186,37 +183,43 @@ void OSystem_PSP::setCursorPalette(const byte *colors, uint start, uint num) { void OSystem_PSP::disableCursorPalette(bool disable) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _cursor.enableCursorPalette(!disable); } void OSystem_PSP::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _screen.copyFromRect(buf, pitch, x, y, w, h); } Graphics::Surface *OSystem_PSP::lockScreen() { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; return _screen.lockAndGetForEditing(); } void OSystem_PSP::unlockScreen() { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; // The screen is always completely updated anyway, so we don't have to force a full update here. _screen.unlock(); } void OSystem_PSP::updateScreen() { DEBUG_ENTER_FUNC(); - _displayManager.renderAll(); + _pendingUpdate = !_displayManager.renderAll(); // if we didn't update, we have a pending update } void OSystem_PSP::setShakePos(int shakeOffset) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _screen.setShakePos(shakeOffset); } void OSystem_PSP::showOverlay() { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _overlay.setVisible(true); _cursor.setLimits(_overlay.getWidth(), _overlay.getHeight()); _cursor.useGlobalScaler(false); // mouse with overlay is 1:1 @@ -224,6 +227,7 @@ void OSystem_PSP::showOverlay() { void OSystem_PSP::hideOverlay() { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _overlay.setVisible(false); _cursor.setLimits(_screen.getWidth(), _screen.getHeight()); _cursor.useGlobalScaler(true); // mouse needs to be scaled with screen @@ -231,6 +235,7 @@ void OSystem_PSP::hideOverlay() { void OSystem_PSP::clearOverlay() { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _overlay.clearBuffer(); } @@ -241,6 +246,7 @@ void OSystem_PSP::grabOverlay(OverlayColor *buf, int pitch) { void OSystem_PSP::copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _overlay.copyFromRect(buf, pitch, x, y, w, h); } @@ -259,6 +265,8 @@ void OSystem_PSP::grabPalette(byte *colors, uint start, uint num) { bool OSystem_PSP::showMouse(bool v) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; + PSP_DEBUG_PRINT("%s\n", v ? "true" : "false"); bool last = _cursor.isVisible(); _cursor.setVisible(v); @@ -268,11 +276,14 @@ bool OSystem_PSP::showMouse(bool v) { void OSystem_PSP::warpMouse(int x, int y) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; _cursor.setXY(x, y); } void OSystem_PSP::setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, uint32 keycolor, int cursorTargetScale, const Graphics::PixelFormat *format) { DEBUG_ENTER_FUNC(); + _pendingUpdate = false; + PSP_DEBUG_PRINT("pbuf[%p], w[%u], h[%u], hotspot:X[%d], Y[%d], keycolor[%d], scale[%d], pformat[%p]\n", buf, w, h, hotspotX, hotspotY, keycolor, cursorTargetScale, format); if (format) { PSP_DEBUG_PRINT("format: bpp[%d], rLoss[%d], gLoss[%d], bLoss[%d], aLoss[%d], rShift[%d], gShift[%d], bShift[%d], aShift[%d]\n", format->bytesPerPixel, format->rLoss, format->gLoss, format->bLoss, format->aLoss, format->rShift, format->gShift, format->bShift, format->aShift); @@ -292,14 +303,28 @@ bool OSystem_PSP::pollEvent(Common::Event &event) { // Pausing the engine is a necessary fix for games that use the timer for music synchronization // recovering many hours later causes the game to crash. We're polling without mutexes since it's not critical to // get it right now. - PowerMan.pollPauseEngine(); + // A hack: + // Check if we have a pending update that we missed for some reason (FPS throttling for example) + // Time between event polls is usually 5-10ms, so waiting for 4 calls before checking to update the screen should be fine + if (_pendingUpdate) { + _pendingUpdateCounter++; + + if (_pendingUpdateCounter >= 4) { + PSP_DEBUG_PRINT("servicing pending update\n"); + updateScreen(); + if (!_pendingUpdate) // we handled the update + _pendingUpdateCounter = 0; + } + } else + _pendingUpdateCounter = 0; // reset the counter, no pending + return _inputHandler.getAllInputs(event); } uint32 OSystem_PSP::getMillis() { - return _pspRtc.getMillis(); + return PspRtc::instance().getMillis(); } void OSystem_PSP::delayMillis(uint msecs) { @@ -313,19 +338,19 @@ void OSystem_PSP::setTimerCallback(TimerProc callback, int interval) { } OSystem::MutexRef OSystem_PSP::createMutex(void) { - return (MutexRef)SDL_CreateMutex(); + return (MutexRef) new PspMutex(true); // start with a full mutex } void OSystem_PSP::lockMutex(MutexRef mutex) { - SDL_mutexP((SDL_mutex *)mutex); + ((PspMutex *)mutex)->lock(); } void OSystem_PSP::unlockMutex(MutexRef mutex) { - SDL_mutexV((SDL_mutex *)mutex); + ((PspMutex *)mutex)->unlock(); } void OSystem_PSP::deleteMutex(MutexRef mutex) { - SDL_DestroyMutex((SDL_mutex *)mutex); + delete (PspMutex *)mutex; } void OSystem_PSP::mixCallback(void *sys, byte *samples, int len) { @@ -355,7 +380,6 @@ void OSystem_PSP::setupMixer(void) { assert(!_mixer); -#ifdef USE_PSP_AUDIO if (!_audio.open(samplesPerSec, 2, samples, mixCallback, this)) { PSP_ERROR("failed to open audio\n"); return; @@ -365,46 +389,10 @@ void OSystem_PSP::setupMixer(void) { assert(_mixer); _mixer->setReady(true); _audio.unpause(); -#else - SDL_AudioSpec obtained; - SDL_AudioSpec desired; - - memset(&desired, 0, sizeof(desired)); - desired.freq = samplesPerSec; - desired.format = AUDIO_S16SYS; - desired.channels = 2; - desired.samples = samples; - desired.callback = mixCallback; - desired.userdata = this; - - if (SDL_OpenAudio(&desired, &obtained) != 0) { - warning("Could not open audio: %s", SDL_GetError()); - _mixer = new Audio::MixerImpl(this, samplesPerSec); - assert(_mixer); - _mixer->setReady(false); - } else { - // Note: This should be the obtained output rate, but it seems that at - // least on some platforms SDL will lie and claim it did get the rate - // even if it didn't. Probably only happens for "weird" rates, though. - samplesPerSec = obtained.freq; - - // Create the mixer instance and start the sound processing - _mixer = new Audio::MixerImpl(this, samplesPerSec); - assert(_mixer); - _mixer->setReady(true); - - SDL_PauseAudio(0); - } -#endif /* USE_PSP_AUDIO */ } void OSystem_PSP::quit() { -#ifdef USE_PSP_AUDIO _audio.close(); -#else - SDL_CloseAudio(); -#endif - SDL_Quit(); sceKernelExitGame(); } diff --git a/backends/platform/psp/osys_psp.h b/backends/platform/psp/osys_psp.h index a6c84ba39a..5721296c94 100644 --- a/backends/platform/psp/osys_psp.h +++ b/backends/platform/psp/osys_psp.h @@ -42,14 +42,14 @@ #include "backends/timer/psp/timer.h" #include "backends/platform/psp/thread.h" -#include <SDL.h> - class OSystem_PSP : public BaseBackend { private: Common::SaveFileManager *_savefile; Audio::MixerImpl *_mixer; Common::TimerManager *_timer; + bool _pendingUpdate; // save an update we couldn't perform + uint32 _pendingUpdateCounter; // prevent checking for pending update too often, in a cheap way // All needed sub-members Screen _screen; @@ -60,12 +60,9 @@ private: InputHandler _inputHandler; PspAudio _audio; PspTimer _pspTimer; - PspRtc _pspRtc; - - void initSDL(); public: - OSystem_PSP() : _savefile(0), _mixer(0), _timer(0) {} + OSystem_PSP() : _savefile(0), _mixer(0), _timer(0), _pendingUpdate(false), _pendingUpdateCounter(0) {} ~OSystem_PSP(); static OSystem *instance(); @@ -85,7 +82,7 @@ public: int getGraphicsMode() const; #ifdef USE_RGB_COLOR virtual Graphics::PixelFormat getScreenFormat() const; - virtual Common::List<Graphics::PixelFormat> getSupportedFormats(); + virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const; #endif // Screen size diff --git a/backends/platform/psp/powerman.cpp b/backends/platform/psp/powerman.cpp index df8da12f6d..eaadad16c5 100644 --- a/backends/platform/psp/powerman.cpp +++ b/backends/platform/psp/powerman.cpp @@ -23,16 +23,16 @@ * */ -//#define __PSP_DEBUG_FUNCS__ /* can put this locally too */ -//#define __PSP_DEBUG_PRINT__ -#include "backends/platform/psp/trace.h" - #include <psppower.h> #include <pspthreadman.h> #include "backends/platform/psp/powerman.h" #include "engine.h" +//#define __PSP_DEBUG_FUNCS__ /* can put this locally too */ +//#define __PSP_DEBUG_PRINT__ +#include "backends/platform/psp/trace.h" + DECLARE_SINGLETON(PowerManager) // Function to debug the Power Manager (we have no output to screen) @@ -47,68 +47,30 @@ inline void PowerManager::debugPM() { * Constructor * ********************************************/ -PowerManager::PowerManager() { - DEBUG_ENTER_FUNC(); - - _flagMutex = NULL; /* Init mutex handle */ - _listMutex = NULL; /* Init mutex handle */ - _condSuspendable = NULL; /* Init condition variable */ - _condPM = NULL; - - _condSuspendable = SDL_CreateCond(); - if (_condSuspendable <= 0) { - PSP_ERROR("Couldn't create Suspendable condition variable\n"); - } - - _condPM = SDL_CreateCond(); - if (_condPM <= 0) { - PSP_ERROR("Couldn't create PM condition variable\n"); - } - - _flagMutex = SDL_CreateMutex(); - if (_flagMutex <= 0) { - PSP_ERROR("Couldn't create flag Mutex\n"); - } - - _listMutex = SDL_CreateMutex(); - if (_listMutex <= 0) { - PSP_ERROR("Couldn't create list Mutex\n"); - } - - _suspendFlag = false; - _criticalCounter = 0; // How many are in the critical section - _pauseFlag = 0; - _pauseFlagOld = 0; - _pauseClientState = 0; - _listCounter = 0; - PMStatusSet(kInitDone); - _error = 0; -} +PowerManager::PowerManager() : _pauseFlag(false), _pauseFlagOld(false), _pauseClientState(UNPAUSED), + _suspendFlag(false), _flagMutex(true), _listMutex(true), + _criticalCounter(0), _listCounter(0), _error(0), _PMStatus(kInitDone) {} /******************************************* * * Function to register to be notified when suspend/resume time comes * ********************************************/ -int PowerManager::registerSuspend(Suspendable *item) { +bool PowerManager::registerForSuspend(Suspendable *item) { DEBUG_ENTER_FUNC(); // Register in list debugPM(); - if (SDL_mutexP(_listMutex) != 0) { - PSP_ERROR("Couldn't lock _listMutex[%p]\n", _listMutex); - } + _listMutex.lock(); _suspendList.push_front(item); _listCounter++; - if (SDL_mutexV(_listMutex) != 0) { - PSP_ERROR("Couldn't unlock _listMutex[%p]\n", _listMutex); - } + _listMutex.unlock(); debugPM(); - return 0; + return true; } /******************************************* @@ -116,26 +78,20 @@ int PowerManager::registerSuspend(Suspendable *item) { * Function to unregister to be notified when suspend/resume time comes * ********************************************/ -int PowerManager::unregisterSuspend(Suspendable *item) { +bool PowerManager::unregisterForSuspend(Suspendable *item) { DEBUG_ENTER_FUNC(); debugPM(); // Unregister from stream list - if (SDL_mutexP(_listMutex) != 0) { - PSP_ERROR("Couldn't unlock _listMutex[%p]\n", _listMutex); - } - + _listMutex.lock(); + _suspendList.remove(item); _listCounter--; - if (SDL_mutexV(_listMutex) != 0) { - PSP_ERROR("Couldn't unlock _listMutex[%p]\n", _listMutex); - } + _listMutex.unlock(); - PSP_DEBUG_PRINT("Out of unregisterSuspend\n"); debugPM(); - - return 0; + return true; } /******************************************* @@ -144,21 +100,7 @@ int PowerManager::unregisterSuspend(Suspendable *item) { * ********************************************/ PowerManager::~PowerManager() { - DEBUG_ENTER_FUNC(); - - PMStatusSet(kDestroyPM); - - SDL_DestroyCond(_condSuspendable); - _condSuspendable = 0; - - SDL_DestroyCond(_condPM); - _condPM = 0; - - SDL_DestroyMutex(_flagMutex); - _flagMutex = 0; - - SDL_DestroyMutex(_listMutex); - _listMutex = 0; + _PMStatus = kDestroyPM; } /******************************************* @@ -171,114 +113,92 @@ PowerManager::~PowerManager() { * ********************************************/ void PowerManager::pollPauseEngine() { - + DEBUG_ENTER_FUNC(); + + bool pause = _pauseFlag; // We copy so as not to have multiple values - if ((pause != _pauseFlagOld) && g_engine) { // Check to see if we have an engine - if (pause && _pauseClientState == PowerManager::Unpaused) { - _pauseClientState = PowerManager::Pausing; // Tell PM we're in the middle of pausing - g_engine->pauseEngine(true); - PSP_DEBUG_PRINT_FUNC("Pausing engine\n"); - _pauseClientState = PowerManager::Paused; // Tell PM we're done pausing - } else if (!pause && _pauseClientState == PowerManager::Paused) { - g_engine->pauseEngine(false); - PSP_DEBUG_PRINT_FUNC("Unpausing for resume\n"); - _pauseClientState = PowerManager::Unpaused; // Tell PM we're in the middle of pausing + if (pause != _pauseFlagOld) { + if (g_engine) { // Check to see if we have an engine + if (pause && _pauseClientState == UNPAUSED) { + _pauseClientState = PAUSING; // Tell PM we're in the middle of pausing + g_engine->pauseEngine(true); + PSP_DEBUG_PRINT_FUNC("Pausing engine\n"); + _pauseClientState = PAUSED; // Tell PM we're done pausing + } else if (!pause && _pauseClientState == PAUSED) { + g_engine->pauseEngine(false); + PSP_DEBUG_PRINT_FUNC("Unpausing for resume\n"); + _pauseClientState = UNPAUSED; // Tell PM we're unpaused + } } - _pauseFlagOld = pause; } } /******************************************* * -* Function to be called by threads wanting to block on the PSP entering suspend -* Use this for small critical sections where you can easily restore the previous state. -* -********************************************/ -int PowerManager::blockOnSuspend() { - return beginCriticalSection(true); -} - -/******************************************* -* * Function to block on a suspend, then start a non-suspendable critical section * Use this for large or REALLY critical critical-sections. * Make sure to call endCriticalSection or the PSP won't suspend. +* returns true if blocked, false if not blocked ********************************************/ -int PowerManager::beginCriticalSection(bool justBlock) { +bool PowerManager::beginCriticalSection() { DEBUG_ENTER_FUNC(); - int ret = NotBlocked; - - if (SDL_mutexP(_flagMutex) != 0) { - PSP_ERROR("PowerManager::blockOnSuspend(): Couldn't lock flagMutex[%p]\n", _flagMutex); - ret = Error; - } + bool ret = false; + + _flagMutex.lock(); // Check the access flag - if (_suspendFlag == true) { - PSP_DEBUG_PRINT("We're being blocked!\n"); - debugPM(); - ret = Blocked; + if (_suspendFlag) { + ret = true; - // If it's true, we wait for a signal to continue - if (SDL_CondWait(_condSuspendable, _flagMutex) != 0) { - PSP_DEBUG_PRINT("PowerManager::blockOnSuspend(): Couldn't wait on cond[%p]\n", _condSuspendable); - } + PSP_DEBUG_PRINT("I got blocked. ThreadId[%x]\n", sceKernelGetThreadId()); + debugPM(); + + _threadSleep.wait(_flagMutex); - PSP_DEBUG_PRINT("We got blocked!!\n"); + PSP_DEBUG_PRINT_FUNC("I got released. ThreadId[%x]\n", sceKernelGetThreadId()); debugPM(); } // Now prevent the PM from suspending until we're done - if (justBlock == false) - _criticalCounter++; + _criticalCounter++; - if (SDL_mutexV(_flagMutex) != 0) { - PSP_ERROR("PowerManager::blockOnSuspend(): Couldn't unlock flagMutex[%p]\n", _flagMutex); - ret = Error; - } + _flagMutex.unlock(); return ret; } -int PowerManager::endCriticalSection() { +// returns success = true +void PowerManager::endCriticalSection() { DEBUG_ENTER_FUNC(); - int ret = 0; - if (SDL_mutexP(_flagMutex) != 0) { - PSP_ERROR("PowerManager::endCriticalSection(): Couldn't lock flagMutex[%p]\n", _flagMutex); - ret = Error; - } + _flagMutex.lock(); // We're done with our critical section _criticalCounter--; if (_criticalCounter <= 0) { - if (_suspendFlag == true) { // If the PM is sleeping, this flag must be set - PSP_DEBUG_PRINT("Unblocked thread waking up the PM.\n"); - debugPM(); - - SDL_CondBroadcast(_condPM); - - PSP_DEBUG_PRINT("Woke up the PM\n"); - debugPM(); + if (_suspendFlag) { // If the PM is sleeping, this flag must be set + PSP_DEBUG_PRINT_FUNC("PM is asleep. Waking it up.\n"); + debugPM(); + + _pmSleep.releaseAll(); + + PSP_DEBUG_PRINT_FUNC("Woke up the PM\n"); + + debugPM(); } if (_criticalCounter < 0) { // Check for bad usage of critical sections - PSP_ERROR("Critical counter[%d]\n", _criticalCounter); + PSP_ERROR("Critical counter[%d]!!!\n", _criticalCounter); debugPM(); } } - if (SDL_mutexV(_flagMutex) != 0) { - PSP_ERROR("Couldn't unlock flagMutex[%p]\n", _flagMutex); - ret = Error; - } - - return ret; + _flagMutex.unlock(); } /******************************************* @@ -286,90 +206,77 @@ int PowerManager::endCriticalSection() { * Callback function to be called to put every Suspendable to suspend * ********************************************/ -int PowerManager::suspend() { +void PowerManager::suspend() { DEBUG_ENTER_FUNC(); - int ret = 0; - if (_pauseFlag) return ret; // Very important - make sure we only suspend once + if (_pauseFlag) + return; // Very important - make sure we only suspend once - scePowerLock(0); // Critical to make sure PSP doesn't suspend before we're done + scePowerLock(0); // Also critical to make sure PSP doesn't suspend before we're done // The first stage of suspend is pausing the engine if possible. We don't want to cause files // to block, or we might not get the engine to pause. On the other hand, we might wait for polling // and it'll never happen. We also want to do this w/o mutexes (for speed) which is ok in this case. _pauseFlag = true; - PMStatusSet(kWaitForClientPause); + _PMStatus = kWaitForClientPause; // Now we wait, giving the engine thread some time to find our flag. - for (int i = 0; i < 10 && _pauseClientState == Unpaused; i++) - sceKernelDelayThread(50000); // We wait 50 msec x 10 times = 0.5 seconds + for (int i = 0; i < 10 && _pauseClientState == UNPAUSED; i++) + PspThread::delayMicros(50000); // We wait 50 msec x 10 times = 0.5 seconds - if (_pauseClientState == Pausing) { // Our event has been acknowledged. Let's wait until the client is done. - PMStatusSet(kWaitForClientToFinishPausing); + if (_pauseClientState == PAUSING) { // Our event has been acknowledged. Let's wait until the client is done. + _PMStatus = kWaitForClientToFinishPausing; - while (_pauseClientState != Paused) - sceKernelDelayThread(50000); // We wait 50 msec at a time + while (_pauseClientState != PAUSED) + PspThread::delayMicros(50000); // We wait 50 msec at a time } - // It's possible that the polling thread missed our pause event, but there's nothing we can do about that. - // We can't know if there's polling going on or not. It's usually not a critical thing anyway. + // It's possible that the polling thread missed our pause event, but there's + // nothing we can do about that. + // We can't know if there's polling going on or not. + // It's usually not a critical thing anyway. - PMStatusSet(kGettingFlagMutexSuspend); + _PMStatus = kGettingFlagMutexSuspend; // Now we set the suspend flag to true to cause reading threads to block + _flagMutex.lock(); - if (SDL_mutexP(_flagMutex) != 0) { - PSP_ERROR("Couldn't lock flagMutex[%p]\n", _flagMutex); - _error = Error; - ret = Error; - } - - PMStatusSet(kGotFlagMutexSuspend); + _PMStatus = kGotFlagMutexSuspend; _suspendFlag = true; // Check if anyone is in a critical section. If so, we'll wait for them if (_criticalCounter > 0) { - PMStatusSet(kWaitCritSectionSuspend); - SDL_CondWait(_condPM, _flagMutex); - PMStatusSet(kDoneWaitingCritSectionSuspend); - } + _PMStatus = kWaitCritSectionSuspend; + + _pmSleep.wait(_flagMutex); + + _PMStatus = kDoneWaitingCritSectionSuspend; + } + + _flagMutex.unlock(); - if (SDL_mutexV(_flagMutex) != 0) { - PSP_ERROR("Couldn't unlock flagMutex[%p]\n", _flagMutex); - _error = Error; - ret = Error; - } - - PMStatusSet(kGettingListMutexSuspend); + _PMStatus = kGettingListMutexSuspend; // Loop over list, calling suspend() - if (SDL_mutexP(_listMutex) != 0) { - PSP_ERROR("Couldn't lock listMutex[%p]\n", _listMutex); - _error = Error; - ret = Error; - } - PMStatusSet(kIteratingListSuspend); + _listMutex.lock(); + + _PMStatus = kIteratingListSuspend; // Iterate Common::List<Suspendable *>::iterator i; for (i = _suspendList.begin(); i != _suspendList.end(); ++i) { (*i)->suspend(); } + _PMStatus = kDoneIteratingListSuspend; - PMStatusSet(kDoneIteratingListSuspend); - - if (SDL_mutexV(_listMutex) != 0) { - PSP_ERROR("Couldn't unlock listMutex[%p]\n", _listMutex); - _error = Error; - ret = Error; - } - PMStatusSet(kDoneSuspend); + _listMutex.unlock(); + _PMStatus = kDoneSuspend; scePowerUnlock(0); // Allow the PSP to go to sleep now - - return ret; + + _PMStatus = kDonePowerUnlock; } /******************************************* @@ -377,24 +284,26 @@ int PowerManager::suspend() { * Callback function to resume every Suspendable * ********************************************/ -int PowerManager::resume() { +void PowerManager::resume() { DEBUG_ENTER_FUNC(); - int ret = 0; + + _PMStatus = kBeginResume; // Make sure we can't get another suspend scePowerLock(0); - if (!_pauseFlag) return ret; // Make sure we can only resume once + _PMStatus = kCheckingPauseFlag; + + if (!_pauseFlag) + return; // Make sure we can only resume once - PMStatusSet(kGettingListMutexResume); + _PMStatus = kGettingListMutexResume; // First we notify our Suspendables. Loop over list, calling resume() - if (SDL_mutexP(_listMutex) != 0) { - PSP_ERROR("Couldn't lock listMutex[%p]\n", _listMutex); - _error = Error; - ret = Error; - } - PMStatusSet(kIteratingListResume); + _listMutex.lock(); + + _PMStatus = kIteratingListResume; + // Iterate Common::List<Suspendable *>::iterator i = _suspendList.begin(); @@ -402,46 +311,31 @@ int PowerManager::resume() { (*i)->resume(); } - PMStatusSet(kDoneIteratingListResume); + _PMStatus = kDoneIteratingListResume; - if (SDL_mutexV(_listMutex) != 0) { - PSP_ERROR("Couldn't unlock listMutex[%p]\n", _listMutex); - _error = Error; - ret = Error; - } - - PMStatusSet(kGettingFlagMutexResume); + _listMutex.unlock(); + + _PMStatus = kGettingFlagMutexResume; // Now we set the suspend flag to false - if (SDL_mutexP(_flagMutex) != 0) { - PSP_ERROR("Couldn't lock flagMutex %p\n", _flagMutex); - _error = Error; - ret = Error; - } - PMStatusSet(kGotFlagMutexResume); + _flagMutex.lock(); + + _PMStatus = kGotFlagMutexResume; _suspendFlag = false; - PMStatusSet(kSignalSuspendedThreadsResume); + _PMStatus = kSignalSuspendedThreadsResume; - // Signal the other threads to wake up - if (SDL_CondBroadcast(_condSuspendable) != 0) { - PSP_ERROR("Couldn't broadcast condition[%p]\n", _condSuspendable); - _error = Error; - ret = Error; - } - PMStatusSet(kDoneSignallingSuspendedThreadsResume); + // Signal the threads to wake up + _threadSleep.releaseAll(); + + _PMStatus = kDoneSignallingSuspendedThreadsResume; - if (SDL_mutexV(_flagMutex) != 0) { - PSP_ERROR("Couldn't unlock flagMutex[%p]\n", _flagMutex); - _error = Error; - ret = Error; - } - PMStatusSet(kDoneResume); + _flagMutex.unlock(); + + _PMStatus = kDoneResume; - _pauseFlag = false; // Signal engine to unpause + _pauseFlag = false; // Signal engine to unpause -- no mutex needed scePowerUnlock(0); // Allow new suspends - - return ret; } diff --git a/backends/platform/psp/powerman.h b/backends/platform/psp/powerman.h index af3134adee..5f09bc7794 100644 --- a/backends/platform/psp/powerman.h +++ b/backends/platform/psp/powerman.h @@ -26,8 +26,7 @@ #ifndef POWERMAN_H #define POWERMAN_H -#include <SDL/SDL_thread.h> -#include <SDL/SDL_mutex.h> +#include "backends/platform/psp/thread.h" #include "common/singleton.h" #include "common/list.h" @@ -53,12 +52,12 @@ class PowerManager: public Common::Singleton<PowerManager> { public: int blockOnSuspend(); /* block if suspending */ - int beginCriticalSection(bool justBlock = false); /* Use a critical section to block (if suspend was already pressed) */ - int endCriticalSection(); /* and to prevent the PSP from suspending in a particular section */ - int registerSuspend(Suspendable *item); /* register to be called to suspend/resume */ - int unregisterSuspend(Suspendable *item); /* remove from suspend/resume list */ - int suspend(); /* callback to have all items in list suspend */ - int resume(); /* callback to have all items in list resume */ + bool beginCriticalSection(); /* Use a critical section to block (if suspend was already pressed) */ + void endCriticalSection(); /* and to prevent the PSP from suspending in a particular section */ + bool registerForSuspend(Suspendable *item); /* register to be called to suspend/resume */ + bool unregisterForSuspend(Suspendable *item); /* remove from suspend/resume list */ + void suspend(); /* callback to have all items in list suspend */ + void resume(); /* callback to have all items in list resume */ // Functions for pausing the engine void pollPauseEngine(); /* Poll whether the engine should be paused */ @@ -69,11 +68,9 @@ public: }; enum PauseState { - Unpaused = 0, - PauseEvent, - UnpauseEvent, - Pausing, - Paused + UNPAUSED = 0, + PAUSING, + PAUSED }; private: @@ -81,34 +78,38 @@ private: PowerManager(); ~PowerManager(); - Common::List<Suspendable *> _suspendList; /* list to register in */ + Common::List<Suspendable *> _suspendList; // list to register in - volatile bool _pauseFlag; /* For pausing, which is before suspending */ - volatile bool _pauseFlagOld; /* Save the last state of the flag while polling */ - volatile int _pauseClientState; /* Pause state of the target */ + volatile bool _pauseFlag; // For pausing, which is before suspending + volatile bool _pauseFlagOld; // Save the last state of the flag while polling + volatile PauseState _pauseClientState; // Pause state of the target - volatile bool _suspendFlag; /* protected variable */ - SDL_mutex *_flagMutex; /* mutex to access access flag */ - SDL_mutex *_listMutex; /* mutex to access Suspendable list */ - SDL_cond *_condSuspendable; /* signal to synchronize accessing threads */ - SDL_cond *_condPM; /* signal to wake up the PM from a critical section */ - volatile int _criticalCounter; /* Counter of how many threads are in a critical section */ - int _error; /* error code - PM can't talk to us. For debugging */ + volatile bool _suspendFlag; // protected variable + PspMutex _flagMutex; // mutex to access access flag + PspMutex _listMutex; // mutex to access Suspendable list + PspCondition _threadSleep; // signal to synchronize accessing threads + PspCondition _pmSleep; // signal to wake up the PM from a critical section + volatile int _criticalCounter; // Counter of how many threads are in a critical section + int _error; // error code - PM can't talk to us. For debugging + volatile int _PMStatus; // What the PM is doing. for debugging // States for PM to be in (used for debugging) enum PMState { - kInitDone = 1 , - kDestroyPM, - kWaitForClientPause, - kWaitForClientToFinishPausing, - kGettingFlagMutexSuspend, - kGotFlagMutexSuspend, - kWaitCritSectionSuspend, - kDoneWaitingCritSectionSuspend, - kGettingListMutexSuspend, - kIteratingListSuspend, - kDoneIteratingListSuspend, - kDoneSuspend, + kInitDone = 1, + kDestroyPM = 2, + kWaitForClientPause = 3, + kWaitForClientToFinishPausing = 4, + kGettingFlagMutexSuspend = 5, + kGotFlagMutexSuspend = 6, + kWaitCritSectionSuspend = 7, + kDoneWaitingCritSectionSuspend = 8, + kGettingListMutexSuspend = 9, + kIteratingListSuspend = 10, + kDoneIteratingListSuspend = 11, + kDoneSuspend = 12, + kDonePowerUnlock, + kBeginResume, + kCheckingPauseFlag, kGettingListMutexResume, kIteratingListResume, kDoneIteratingListResume, @@ -122,8 +123,6 @@ private: volatile int _listCounter; /* How many people are in the list - just for debugging */ void debugPM(); /* print info about the PM */ - void PMStatusSet(PMState s) { _PMStatus = s; } - volatile int _PMStatus; /* What the PM is doing */ public: int getPMStatus() const { return _PMStatus; } diff --git a/backends/platform/psp/psp_main.cpp b/backends/platform/psp/psp_main.cpp index e6940eba13..c26aed539e 100644 --- a/backends/platform/psp/psp_main.cpp +++ b/backends/platform/psp/psp_main.cpp @@ -110,12 +110,13 @@ int exit_callback(void) { } /* Function for handling suspend/resume */ -void power_callback(int , int powerinfo) { +int power_callback(int , int powerinfo, void *) { if (powerinfo & PSP_POWER_CB_POWER_SWITCH || powerinfo & PSP_POWER_CB_SUSPENDING) { PowerMan.suspend(); } else if (powerinfo & PSP_POWER_CB_RESUME_COMPLETE) { PowerMan.resume(); } + return 0; } /* Callback thread */ diff --git a/backends/platform/psp/psploader.cpp b/backends/platform/psp/psploader.cpp index 68e51c1a50..464e20770c 100644 --- a/backends/platform/psp/psploader.cpp +++ b/backends/platform/psp/psploader.cpp @@ -37,24 +37,20 @@ #include "backends/platform/psp/psploader.h" #include "backends/platform/psp/powerman.h" -//#define __PSP_DEBUG_PLUGINS__ +//#define __PSP_DEBUG_FUNCS__ /* For debugging the stack */ +//#define __PSP_DEBUG_PRINT__ -#ifdef __PSP_DEBUG_PLUGINS__ -#define DBG(x,...) fprintf(stderr,x, ## __VA_ARGS__) -#else -#define DBG(x,...) -#endif - -#define seterror(x,...) fprintf(stderr,x, ## __VA_ARGS__) +#include "backends/platform/psp/trace.h" extern char __plugin_hole_start; // Indicates start of hole in program file for shorts extern char __plugin_hole_end; // Indicates end of hole in program file -extern char _gp[]; // Value of gp register +extern char _gp[]; // Value of gp register DECLARE_SINGLETON(ShortSegmentManager) // For singleton // Get rid of symbol table in memory void DLObject::discard_symtab() { + DEBUG_ENTER_FUNC(); free(_symtab); free(_strtab); _symtab = NULL; @@ -64,6 +60,7 @@ void DLObject::discard_symtab() { // Unload all objects from memory void DLObject::unload() { + DEBUG_ENTER_FUNC(); discard_symtab(); free(_segment); _segment = NULL; @@ -84,18 +81,19 @@ void DLObject::unload() { * */ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void *relSegment) { + DEBUG_ENTER_FUNC(); Elf32_Rel *rel = NULL; // relocation entry // Allocate memory for relocation table if (!(rel = (Elf32_Rel *)malloc(size))) { - seterror("Out of memory."); + PSP_ERROR("Out of memory."); return false; } // Read in our relocation table if (lseek(fd, offset, SEEK_SET) < 0 || read(fd, rel, size) != (ssize_t)size) { - seterror("Relocation table load failed."); + PSP_ERROR("Relocation table load failed."); free(rel); return false; } @@ -103,7 +101,7 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * // Treat each relocation entry. Loop over all of them int cnt = size / sizeof(*rel); - DBG("Loaded relocation table. %d entries. base address=%p\n", cnt, relSegment); + PSP_DEBUG_PRINT("Loaded relocation table. %d entries. base address=%p\n", cnt, relSegment); bool seenHi16 = false; // For treating HI/LO16 commands int firstHi16 = -1; // Mark the point of the first hi16 seen @@ -127,7 +125,7 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * // Get the target instruction in the code unsigned int *target = (unsigned int *)((char *)relSegment + rel[i].r_offset); - unsigned int origTarget = *target; // Save for debugging + PSP_DEBUG_DO(unsigned int origTarget = *target); // Save for debugging // Act differently based on the type of relocation switch (REL_TYPE(rel[i].r_info)) { @@ -142,7 +140,7 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * lastHiSymVal = sym->st_value; hi16InShorts = (ShortsMan.inGeneralSegment((char *)sym->st_value)); // Fix for problem with switching btw segments if (debugRelocs[0]++ < DEBUG_NUM) // Print only a set number - DBG("R_MIPS_HI16: i=%d, offset=%x, ahl = %x, target = %x\n", + PSP_DEBUG_PRINT("R_MIPS_HI16: i=%d, offset=%x, ahl = %x, target = %x\n", i, rel[i].r_offset, ahl, *target); } break; @@ -150,7 +148,7 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * case R_MIPS_LO16: // Absolute addressing. Needs a HI16 to come before it if (sym->st_shndx < SHN_LOPROC) { // Only shift for plugin section. (ie. has a real section index) if (!seenHi16) { // We MUST have seen HI16 first - seterror("R_MIPS_LO16 w/o preceding R_MIPS_HI16 at relocation %d!\n", i); + PSP_ERROR("R_MIPS_LO16 w/o preceding R_MIPS_HI16 at relocation %d!\n", i); free(rel); return false; } @@ -195,10 +193,10 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * *target |= relocation & 0xffff; // Take the lower 16 bits of the relocation if (debugRelocs[1]++ < DEBUG_NUM) - DBG("R_MIPS_LO16: i=%d, offset=%x, a=%x, ahl = %x, lastTarget = %x, origt = %x, target = %x\n", + PSP_DEBUG_PRINT("R_MIPS_LO16: i=%d, offset=%x, a=%x, ahl = %x, lastTarget = %x, origt = %x, target = %x\n", i, rel[i].r_offset, a, ahl, *lastTarget, origTarget, *target); if (lo16InShorts && debugRelocs[2]++ < DEBUG_NUM) - DBG("R_MIPS_LO16s: i=%d, offset=%x, a=%x, ahl = %x, lastTarget = %x, origt = %x, target = %x\n", + PSP_DEBUG_PRINT("R_MIPS_LO16s: i=%d, offset=%x, a=%x, ahl = %x, lastTarget = %x, origt = %x, target = %x\n", i, rel[i].r_offset, a, ahl, *lastTarget, origTarget, *target); } break; @@ -212,11 +210,11 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * *target |= (relocation & 0x03ffffff); if (debugRelocs[3]++ < DEBUG_NUM) - DBG("R_MIPS_26: i=%d, offset=%x, symbol=%d, stinfo=%x, a=%x, origTarget=%x, target=%x\n", + PSP_DEBUG_PRINT("R_MIPS_26: i=%d, offset=%x, symbol=%d, stinfo=%x, a=%x, origTarget=%x, target=%x\n", i, rel[i].r_offset, REL_INDEX(rel[i].r_info), sym->st_info, a, origTarget, *target); } else { if (debugRelocs[4]++ < DEBUG_NUM) - DBG("R_MIPS_26: i=%d, offset=%x, symbol=%d, stinfo=%x, a=%x, origTarget=%x, target=%x\n", + PSP_DEBUG_PRINT("R_MIPS_26: i=%d, offset=%x, symbol=%d, stinfo=%x, a=%x, origTarget=%x, target=%x\n", i, rel[i].r_offset, REL_INDEX(rel[i].r_info), sym->st_info, a, origTarget, *target); } break; @@ -233,7 +231,7 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * *target |= relocation & 0xffff; if (debugRelocs[5]++ < DEBUG_NUM) - DBG("R_MIPS_GPREL16: i=%d, a=%x, gpVal=%x, origTarget=%x, target=%x, offset=%x\n", + PSP_DEBUG_PRINT("R_MIPS_GPREL16: i=%d, a=%x, gpVal=%x, origTarget=%x, target=%x, offset=%x\n", i, a, _gpVal, origTarget, *target, _shortsSegment->getOffset()); } @@ -250,24 +248,25 @@ bool DLObject::relocate(int fd, unsigned long offset, unsigned long size, void * *target = relocation; if (debugRelocs[6]++ < DEBUG_NUM) - DBG("R_MIPS_32: i=%d, a=%x, origTarget=%x, target=%x\n", i, a, origTarget, *target); + PSP_DEBUG_PRINT("R_MIPS_32: i=%d, a=%x, origTarget=%x, target=%x\n", i, a, origTarget, *target); } break; default: - seterror("Unknown relocation type %x at relocation %d.\n", REL_TYPE(rel[i].r_info), i); + PSP_ERROR("Unknown relocation type %x at relocation %d.\n", REL_TYPE(rel[i].r_info), i); free(rel); return false; } } - DBG("Done with relocation. extendedHi16=%d\n\n", extendedHi16); + PSP_DEBUG_PRINT("Done with relocation. extendedHi16=%d\n\n", extendedHi16); free(rel); return true; } bool DLObject::readElfHeader(int fd, Elf32_Ehdr *ehdr) { + DEBUG_ENTER_FUNC(); // Start reading the elf header. Check for errors if (read(fd, ehdr, sizeof(*ehdr)) != sizeof(*ehdr) || memcmp(ehdr->e_ident, ELFMAG, SELFMAG) || // Check MAGIC @@ -275,31 +274,32 @@ bool DLObject::readElfHeader(int fd, Elf32_Ehdr *ehdr) { ehdr->e_machine != EM_MIPS || // Check for MIPS machine type ehdr->e_phentsize < sizeof(Elf32_Phdr) || // Check for size of program header ehdr->e_shentsize != sizeof(Elf32_Shdr)) { // Check for size of section header - seterror("Invalid file type."); + PSP_ERROR("Invalid file type."); return false; } - DBG("phoff = %d, phentsz = %d, phnum = %d\n", + PSP_DEBUG_PRINT("phoff = %d, phentsz = %d, phnum = %d\n", ehdr->e_phoff, ehdr->e_phentsize, ehdr->e_phnum); return true; } bool DLObject::readProgramHeaders(int fd, Elf32_Ehdr *ehdr, Elf32_Phdr *phdr, int num) { + DEBUG_ENTER_FUNC(); // Read program header if (lseek(fd, ehdr->e_phoff + sizeof(*phdr)*num, SEEK_SET) < 0 || read(fd, phdr, sizeof(*phdr)) != sizeof(*phdr)) { - seterror("Program header load failed."); + PSP_ERROR("Program header load failed."); return false; } // Check program header values if (phdr->p_type != PT_LOAD || phdr->p_filesz > phdr->p_memsz) { - seterror("Invalid program header."); + PSP_ERROR("Invalid program header."); return false; } - DBG("offs = %x, filesz = %x, memsz = %x, align = %x\n", + PSP_DEBUG_PRINT("offs = %x, filesz = %x, memsz = %x, align = %x\n", phdr->p_offset, phdr->p_filesz, phdr->p_memsz, phdr->p_align); return true; @@ -307,6 +307,7 @@ bool DLObject::readProgramHeaders(int fd, Elf32_Ehdr *ehdr, Elf32_Phdr *phdr, in } bool DLObject::loadSegment(int fd, Elf32_Phdr *phdr) { + DEBUG_ENTER_FUNC(); char *baseAddress = 0; @@ -315,15 +316,15 @@ bool DLObject::loadSegment(int fd, Elf32_Phdr *phdr) { // Attempt to allocate memory for segment int extra = phdr->p_vaddr % phdr->p_align; // Get extra length TODO: check logic here - DBG("extra mem is %x\n", extra); + PSP_DEBUG_PRINT("extra mem is %x\n", extra); if (phdr->p_align < 0x10000) phdr->p_align = 0x10000; // Fix for wrong alignment on e.g. AGI if (!(_segment = (char *)memalign(phdr->p_align, phdr->p_memsz + extra))) { - seterror("Out of memory.\n"); + PSP_ERROR("Out of memory.\n"); return false; } - DBG("allocated segment @ %p\n", _segment); + PSP_DEBUG_PRINT("allocated segment @ %p\n", _segment); // Get offset to load segment into baseAddress = (char *)_segment + phdr->p_vaddr; @@ -332,20 +333,20 @@ bool DLObject::loadSegment(int fd, Elf32_Phdr *phdr) { _shortsSegment = ShortsMan.newSegment(phdr->p_memsz, (char *)phdr->p_vaddr); baseAddress = _shortsSegment->getStart(); - DBG("shorts segment @ %p to %p. Segment wants to be at %x. Offset=%x\n", + PSP_DEBUG_PRINT("shorts segment @ %p to %p. Segment wants to be at %x. Offset=%x\n", _shortsSegment->getStart(), _shortsSegment->getEnd(), phdr->p_vaddr, _shortsSegment->getOffset()); } // Set bss segment to 0 if necessary (assumes bss is at the end) if (phdr->p_memsz > phdr->p_filesz) { - DBG("Setting %p to %p to 0 for bss\n", baseAddress + phdr->p_filesz, baseAddress + phdr->p_memsz); + PSP_DEBUG_PRINT("Setting %p to %p to 0 for bss\n", baseAddress + phdr->p_filesz, baseAddress + phdr->p_memsz); memset(baseAddress + phdr->p_filesz, 0, phdr->p_memsz - phdr->p_filesz); } // Read the segment into memory if (lseek(fd, phdr->p_offset, SEEK_SET) < 0 || read(fd, baseAddress, phdr->p_filesz) != (ssize_t)phdr->p_filesz) { - seterror("Segment load failed."); + PSP_ERROR("Segment load failed."); return false; } @@ -354,12 +355,13 @@ bool DLObject::loadSegment(int fd, Elf32_Phdr *phdr) { Elf32_Shdr * DLObject::loadSectionHeaders(int fd, Elf32_Ehdr *ehdr) { + DEBUG_ENTER_FUNC(); Elf32_Shdr *shdr = NULL; // Allocate memory for section headers if (!(shdr = (Elf32_Shdr *)malloc(ehdr->e_shnum * sizeof(*shdr)))) { - seterror("Out of memory."); + PSP_ERROR("Out of memory."); return NULL; } @@ -367,7 +369,7 @@ Elf32_Shdr * DLObject::loadSectionHeaders(int fd, Elf32_Ehdr *ehdr) { if (lseek(fd, ehdr->e_shoff, SEEK_SET) < 0 || read(fd, shdr, ehdr->e_shnum * sizeof(*shdr)) != (ssize_t)(ehdr->e_shnum * sizeof(*shdr))) { - seterror("Section headers load failed."); + PSP_ERROR("Section headers load failed."); return NULL; } @@ -375,11 +377,12 @@ Elf32_Shdr * DLObject::loadSectionHeaders(int fd, Elf32_Ehdr *ehdr) { } int DLObject::loadSymbolTable(int fd, Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) { + DEBUG_ENTER_FUNC(); // Loop over sections, looking for symbol table linked to a string table for (int i = 0; i < ehdr->e_shnum; i++) { - //DBG("Section %d: type = %x, size = %x, entsize = %x, link = %x\n", - // i, shdr[i].sh_type, shdr[i].sh_size, shdr[i].sh_entsize, shdr[i].sh_link); + PSP_DEBUG_PRINT("Section %d: type = %x, size = %x, entsize = %x, link = %x\n", + i, shdr[i].sh_type, shdr[i].sh_size, shdr[i].sh_entsize, shdr[i].sh_link); if (shdr[i].sh_type == SHT_SYMTAB && shdr[i].sh_entsize == sizeof(Elf32_Sym) && @@ -392,15 +395,15 @@ int DLObject::loadSymbolTable(int fd, Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) { // Check for no symbol table if (_symtab_sect < 0) { - seterror("No symbol table."); + PSP_ERROR("No symbol table."); return -1; } - DBG("Symbol section at section %d, size %x\n", _symtab_sect, shdr[_symtab_sect].sh_size); + PSP_DEBUG_PRINT("Symbol section at section %d, size %x\n", _symtab_sect, shdr[_symtab_sect].sh_size); // Allocate memory for symbol table if (!(_symtab = malloc(shdr[_symtab_sect].sh_size))) { - seterror("Out of memory."); + PSP_ERROR("Out of memory."); return -1; } @@ -408,25 +411,26 @@ int DLObject::loadSymbolTable(int fd, Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) { if (lseek(fd, shdr[_symtab_sect].sh_offset, SEEK_SET) < 0 || read(fd, _symtab, shdr[_symtab_sect].sh_size) != (ssize_t)shdr[_symtab_sect].sh_size) { - seterror("Symbol table load failed."); + PSP_ERROR("Symbol table load failed."); return -1; } // Set number of symbols _symbol_cnt = shdr[_symtab_sect].sh_size / sizeof(Elf32_Sym); - DBG("Loaded %d symbols.\n", _symbol_cnt); + PSP_DEBUG_PRINT("Loaded %d symbols.\n", _symbol_cnt); return _symtab_sect; } bool DLObject::loadStringTable(int fd, Elf32_Shdr *shdr) { + DEBUG_ENTER_FUNC(); int string_sect = shdr[_symtab_sect].sh_link; // Allocate memory for string table if (!(_strtab = (char *)malloc(shdr[string_sect].sh_size))) { - seterror("Out of memory."); + PSP_ERROR("Out of memory."); return false; } @@ -434,16 +438,17 @@ bool DLObject::loadStringTable(int fd, Elf32_Shdr *shdr) { if (lseek(fd, shdr[string_sect].sh_offset, SEEK_SET) < 0 || read(fd, _strtab, shdr[string_sect].sh_size) != (ssize_t)shdr[string_sect].sh_size) { - seterror("Symbol table strings load failed."); + PSP_ERROR("Symbol table strings load failed."); return false; } return true; } void DLObject::relocateSymbols(Elf32_Addr offset, Elf32_Addr shortsOffset) { + DEBUG_ENTER_FUNC(); int shortsCount = 0, othersCount = 0; - DBG("Relocating symbols by %x. Shorts offset=%x\n", offset, shortsOffset); + PSP_DEBUG_PRINT("Relocating symbols by %x. Shorts offset=%x\n", offset, shortsOffset); // Loop over symbols, add relocation offset Elf32_Sym *s = (Elf32_Sym *)_symtab; @@ -454,22 +459,23 @@ void DLObject::relocateSymbols(Elf32_Addr offset, Elf32_Addr shortsOffset) { othersCount++; s->st_value += offset; if (s->st_value < (Elf32_Addr)_segment || s->st_value > (Elf32_Addr)_segment + _segmentSize) - seterror("Symbol out of bounds! st_value = %x\n", s->st_value); + PSP_ERROR("Symbol out of bounds! st_value = %x\n", s->st_value); } else { // shorts section shortsCount++; s->st_value += shortsOffset; if (!_shortsSegment->inSegment((char *)s->st_value)) - seterror("Symbol out of bounds! st_value = %x\n", s->st_value); + PSP_ERROR("Symbol out of bounds! st_value = %x\n", s->st_value); } } } - DBG("Relocated %d short symbols, %d others.\n", shortsCount, othersCount); + PSP_DEBUG_PRINT("Relocated %d short symbols, %d others.\n", shortsCount, othersCount); } bool DLObject::relocateRels(int fd, Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) { + DEBUG_ENTER_FUNC(); // Loop over sections, finding relocation sections for (int i = 0; i < ehdr->e_shnum; i++) { @@ -500,7 +506,7 @@ bool DLObject::relocateRels(int fd, Elf32_Ehdr *ehdr, Elf32_Shdr *shdr) { bool DLObject::load(int fd) { - fprintf(stderr, "In DLObject::load\n"); + DEBUG_ENTER_FUNC(); Elf32_Ehdr ehdr; // ELF header Elf32_Phdr phdr; // Program header @@ -512,8 +518,7 @@ bool DLObject::load(int fd) { } for (int i = 0; i < ehdr.e_phnum; i++) { // Load our 2 segments - - fprintf(stderr, "Loading segment %d\n", i); + PSP_DEBUG_PRINT("Loading segment %d\n", i); if (readProgramHeaders(fd, &ehdr, &phdr, i) == false) return false; @@ -543,19 +548,20 @@ bool DLObject::load(int fd) { } bool DLObject::open(const char *path) { + DEBUG_ENTER_FUNC(); int fd; void *ctors_start, *ctors_end; - DBG("open(\"%s\")\n", path); + PSP_DEBUG_PRINT("open(\"%s\")\n", path); // Get the address of the global pointer _gpVal = (unsigned int) & _gp; - DBG("_gpVal is %x\n", _gpVal); + PSP_DEBUG_PRINT("_gpVal is %x\n", _gpVal); PowerMan.beginCriticalSection(); if ((fd = ::open(path, O_RDONLY)) < 0) { - seterror("%s not found.", path); + PSP_ERROR("%s not found.", path); return false; } @@ -581,21 +587,22 @@ bool DLObject::open(const char *path) { if (ctors_start == NULL || ctors_end == NULL || _dtors_start == NULL || _dtors_end == NULL) { - seterror("Missing ctors/dtors."); + PSP_ERROR("Missing ctors/dtors."); _dtors_start = _dtors_end = NULL; unload(); return false; } - DBG("Calling constructors.\n"); + PSP_DEBUG_PRINT("Calling constructors.\n"); for (void (**f)(void) = (void (**)(void))ctors_start; f != ctors_end; f++) (**f)(); - DBG("%s opened ok.\n", path); + PSP_DEBUG_PRINT("%s opened ok.\n", path); return true; } bool DLObject::close() { + DEBUG_ENTER_FUNC(); if (_dtors_start != NULL && _dtors_end != NULL) for (void (**f)(void) = (void (**)(void))_dtors_start; f != _dtors_end; f++) (**f)(); @@ -605,10 +612,11 @@ bool DLObject::close() { } void *DLObject::symbol(const char *name) { - DBG("symbol(\"%s\")\n", name); + DEBUG_ENTER_FUNC(); + PSP_DEBUG_PRINT("symbol(\"%s\")\n", name); if (_symtab == NULL || _strtab == NULL || _symbol_cnt < 1) { - seterror("No symbol table loaded."); + PSP_ERROR("No symbol table loaded."); return NULL; } @@ -621,23 +629,25 @@ void *DLObject::symbol(const char *name) { !strcmp(name, _strtab + s->st_name)) { // We found the symbol - DBG("=> %p\n", (void*)s->st_value); + PSP_DEBUG_PRINT("=> %p\n", (void*)s->st_value); return (void*)s->st_value; } } - seterror("Symbol \"%s\" not found.", name); + PSP_ERROR("Symbol \"%s\" not found.", name); return NULL; } ShortSegmentManager::ShortSegmentManager() { + DEBUG_ENTER_FUNC(); _shortsStart = &__plugin_hole_start ; _shortsEnd = &__plugin_hole_end; } ShortSegmentManager::Segment *ShortSegmentManager::newSegment(int size, char *origAddr) { + DEBUG_ENTER_FUNC(); char *lastAddress = origAddr; Common::List<Segment *>::iterator i; @@ -654,7 +664,7 @@ ShortSegmentManager::Segment *ShortSegmentManager::newSegment(int size, char *or lastAddress += 4 - ((Elf32_Addr)lastAddress & 3); // Round up to multiple of 4 if (lastAddress + size > _shortsEnd) { - seterror("Error. No space in shorts segment for %x bytes. Last address is %p, max address is %p.\n", + PSP_ERROR("No space in shorts segment for %x bytes. Last address is %p, max address is %p.\n", size, lastAddress, _shortsEnd); return NULL; } @@ -665,14 +675,15 @@ ShortSegmentManager::Segment *ShortSegmentManager::newSegment(int size, char *or _list.insert(i, seg); - DBG("Shorts segment size %x allocated. End = %p. Remaining space = %x. Highest so far is %p.\n", + PSP_DEBUG_PRINT("Shorts segment size %x allocated. End = %p. Remaining space = %x. Highest so far is %p.\n", size, lastAddress + size, _shortsEnd - _list.back()->getEnd(), _highestAddress); return seg; } void ShortSegmentManager::deleteSegment(ShortSegmentManager::Segment *seg) { - DBG("Deleting shorts segment from %p to %p.\n\n", seg->getStart(), seg->getEnd()); + DEBUG_ENTER_FUNC(); + PSP_DEBUG_PRINT("Deleting shorts segment from %p to %p.\n\n", seg->getStart(), seg->getEnd()); _list.remove(seg); delete seg; } diff --git a/backends/platform/psp/rtc.cpp b/backends/platform/psp/rtc.cpp new file mode 100644 index 0000000000..57edea7e49 --- /dev/null +++ b/backends/platform/psp/rtc.cpp @@ -0,0 +1,87 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * 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; either version 2 + * of the License, or (at your option) any later version. + + * 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 for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/psp/osys_psp.cpp $ + * $Id: osys_psp.cpp 49903 2010-06-16 09:04:27Z Bluddy $ + * + */ + +#include <time.h> +#include <psptypes.h> +#include <psprtc.h> + +#include "common/scummsys.h" +#include "backends/platform/psp/rtc.h" + +//#define __PSP_DEBUG_FUNCS__ /* For debugging function calls */ +//#define __PSP_DEBUG_PRINT__ /* For debug printouts */ + +#include "backends/platform/psp/trace.h" + + +// Class PspRtc --------------------------------------------------------------- +DECLARE_SINGLETON(PspRtc) + +void PspRtc::init() { // init our starting ticks + uint32 ticks[2]; + sceRtcGetCurrentTick((u64 *)ticks); + + _startMillis = ticks[0]/1000; + _startMicros = ticks[0]; + //_lastMillis = ticks[0]/1000; //debug - only when we don't subtract startMillis +} + +#define MS_LOOP_AROUND 4294967 /* We loop every 2^32 / 1000 = 71 minutes */ +#define MS_LOOP_CHECK 60000 /* Threading can cause weird mixups without this */ + +// Note that after we fill up 32 bits ie 50 days we'll loop back to 0, which may cause +// unpredictable results +uint32 PspRtc::getMillis() { + uint32 ticks[2]; + + sceRtcGetCurrentTick((u64 *)ticks); // can introduce weird thread delays + + uint32 millis = ticks[0]/1000; + millis -= _startMillis; // get ms since start of program + + if ((int)_lastMillis - (int)millis > MS_LOOP_CHECK) { // we must have looped around + if (_looped == false) { // check to make sure threads do this once + _looped = true; + _milliOffset += MS_LOOP_AROUND; // add the needed offset + PSP_DEBUG_PRINT("looping around. last ms[%d], curr ms[%d]\n", _lastMillis, millis); + } + } else { + _looped = false; + } + + _lastMillis = millis; + + return millis + _milliOffset; +} + +uint32 PspRtc::getMicros() { + uint32 ticks[2]; + + sceRtcGetCurrentTick((u64 *)ticks); + ticks[0] -= _startMicros; + + return ticks[0]; +} + diff --git a/backends/platform/ds/arm9/source/portdefs.cpp b/backends/platform/psp/rtc.h index 0dcdc1d5a3..7c1a28474d 100644 --- a/backends/platform/ds/arm9/source/portdefs.cpp +++ b/backends/platform/psp/rtc.h @@ -8,28 +8,43 @@ * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * 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 for more details. - * + * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/backends/platform/psp/osys_psp.cpp $ + * $Id: osys_psp.cpp 49903 2010-06-16 09:04:27Z Bluddy $ * */ -#include <string.h> -#include "nds/dma.h" -#include "osystem_ds.h" +#ifndef _PSP_RTC_H_ +#define _PSP_RTC_H_ -/* -extern "C" time_t __wrap_time(time_t* t) { - if (t) { - *t = OSystem_DS::instance()->getMillis() / 1000; +#include "common/singleton.h" + +class PspRtc : public Common::Singleton<PspRtc> { +private: + uint32 _startMillis; + uint32 _startMicros; + uint32 _lastMillis; + uint32 _milliOffset; // to prevent looping around of millis + bool _looped; // make sure we only loop once - for threading +public: + PspRtc() + : _startMillis(0), _startMicros(0), + _lastMillis(0), _milliOffset(0), + _looped(false) { + init(); } + void init(); + uint32 getMillis(); + uint32 getMicros(); +}; - return OSystem_DS::instance()->getMillis() / 1000; -} -*/ +#endif
\ No newline at end of file diff --git a/backends/platform/psp/thread.cpp b/backends/platform/psp/thread.cpp index 4e7d5eada9..c19ff5f9e3 100644 --- a/backends/platform/psp/thread.cpp +++ b/backends/platform/psp/thread.cpp @@ -23,14 +23,13 @@ * */ -#include <time.h> -#include <psptypes.h> -#include <psprtc.h> #include <pspthreadman.h> #include "backends/platform/psp/thread.h" #include "backends/platform/psp/trace.h" +// Class PspThread -------------------------------------------------- + void PspThread::delayMillis(uint32 ms) { sceKernelDelayThread(ms * 1000); } @@ -39,49 +38,154 @@ void PspThread::delayMicros(uint32 us) { sceKernelDelayThread(us); } -void PspRtc::init() { // init our starting ticks - uint32 ticks[2]; - sceRtcGetCurrentTick((u64 *)ticks); +// Class PspSemaphore ------------------------------------------------ +//#define __PSP_DEBUG_FUNCS__ /* For debugging function calls */ +//#define __PSP_DEBUG_PRINT__ /* For debug printouts */ + +#include "backends/platform/psp/trace.h" - _startMillis = ticks[0]/1000; - _startMicros = ticks[0]; - //_lastMillis = ticks[0]/1000; //debug - only when we don't subtract startMillis +PspSemaphore::PspSemaphore(int initialValue, int maxValue/*=255*/) { + DEBUG_ENTER_FUNC(); + _handle = 0; + _handle = (uint32)sceKernelCreateSema("ScummVM Sema", 0 /* attr */, + initialValue, maxValue, + 0 /*option*/); + if (!_handle) + PSP_ERROR("failed to create semaphore.\n"); } -#define MS_LOOP_AROUND 4294967 /* We loop every 2^32 / 1000 = 71 minutes */ -#define MS_LOOP_CHECK 60000 /* Threading can cause weird mixups without this */ +PspSemaphore::~PspSemaphore() { + DEBUG_ENTER_FUNC(); + if (_handle) + if (sceKernelDeleteSema((SceUID)_handle) < 0) + PSP_ERROR("failed to delete semaphore.\n"); +} -// Note that after we fill up 32 bits ie 50 days we'll loop back to 0, which may cause -// unpredictable results -uint32 PspRtc::getMillis() { - uint32 ticks[2]; +int PspSemaphore::numOfWaitingThreads() { + DEBUG_ENTER_FUNC(); + SceKernelSemaInfo info; + info.numWaitThreads = 0; - sceRtcGetCurrentTick((u64 *)ticks); // can introduce weird thread delays + if (sceKernelReferSemaStatus((SceUID)_handle, &info) < 0) + PSP_ERROR("failed to retrieve semaphore info for handle %d\n", _handle); + + return info.numWaitThreads; +} + +int PspSemaphore::getValue() { + DEBUG_ENTER_FUNC(); + SceKernelSemaInfo info; + info.currentCount = 0; - uint32 millis = ticks[0]/1000; - millis -= _startMillis; // get ms since start of program - - if ((int)_lastMillis - (int)millis > MS_LOOP_CHECK) { // we must have looped around - if (_looped == false) { // check to make sure threads do this once - _looped = true; - _milliOffset += MS_LOOP_AROUND; // add the needed offset - PSP_DEBUG_PRINT("looping around. last ms[%d], curr ms[%d]\n", _lastMillis, millis); - } - } else { - _looped = false; - } + if (sceKernelReferSemaStatus((SceUID)_handle, &info) < 0) + PSP_ERROR("failed to retrieve semaphore info for handle %d\n", _handle); + + return info.currentCount; +} + +bool PspSemaphore::pollForValue(int value) { + DEBUG_ENTER_FUNC(); + if (sceKernelPollSema((SceUID)_handle, value) < 0) + return false; + + return true; +} + +// false: timeout or error +bool PspSemaphore::takeWithTimeOut(uint32 timeOut) { + DEBUG_ENTER_FUNC(); - _lastMillis = millis; + uint32 *pTimeOut = 0; + if (timeOut) + pTimeOut = &timeOut; - return millis + _milliOffset; + if (sceKernelWaitSema(_handle, 1, pTimeOut) < 0) // we always wait for 1 + return false; + return true; } -uint32 PspRtc::getMicros() { - uint32 ticks[2]; +bool PspSemaphore::give(int num /*=1*/) { + DEBUG_ENTER_FUNC(); - sceRtcGetCurrentTick((u64 *)ticks); - ticks[0] -= _startMicros; + if (sceKernelSignalSema((SceUID)_handle, num) < 0) + return false; + return true; +} + +// Class PspMutex ------------------------------------------------------------ + +bool PspMutex::lock() { + DEBUG_ENTER_FUNC(); + int threadId = sceKernelGetThreadId(); + bool ret = true; - return ticks[0]; + if (_ownerId == threadId) { + _recursiveCount++; + } else { + ret = _semaphore.take(); + _ownerId = threadId; + _recursiveCount = 0; + } + return ret; +} + +bool PspMutex::unlock() { + DEBUG_ENTER_FUNC(); + int threadId = sceKernelGetThreadId(); + bool ret = true; + + if (_ownerId != threadId) { + PSP_ERROR("attempt to unlock mutex by thread[%x] as opposed to owner[%x]\n", + threadId, _ownerId); + return false; + } + + if (_recursiveCount) { + _recursiveCount--; + } else { + _ownerId = 0; + ret = _semaphore.give(1); + } + return ret; +} + +// Class PspCondition ------------------------------------------------- + +// Release all threads waiting on the condition +void PspCondition::releaseAll() { + _mutex.lock(); + if (_waitingThreads > _signaledThreads) { // we have signals to issue + int numWaiting = _waitingThreads - _signaledThreads; // threads we haven't signaled + _signaledThreads = _waitingThreads; + + _waitSem.give(numWaiting); + _mutex.unlock(); + for (int i=0; i<numWaiting; i++) // wait for threads to tell us they're awake + _doneSem.take(); + } else { + _mutex.unlock(); + } +} + +// Mutex must be taken before entering wait +void PspCondition::wait(PspMutex &externalMutex) { + _mutex.lock(); + _waitingThreads++; + _mutex.unlock(); + + externalMutex.unlock(); // must unlock external mutex + + _waitSem.take(); // sleep on the wait semaphore + + // let the signaling thread know we're done + _mutex.lock(); + if (_signaledThreads > 0 ) { + _doneSem.give(); // let the thread know + _signaledThreads--; + } + _waitingThreads--; + _mutex.unlock(); + + externalMutex.lock(); // must lock external mutex here for continuation } diff --git a/backends/platform/psp/thread.h b/backends/platform/psp/thread.h index 380159fa2d..27d53903d6 100644 --- a/backends/platform/psp/thread.h +++ b/backends/platform/psp/thread.h @@ -34,18 +34,46 @@ public: static void delayMicros(uint32 us); }; -class PspRtc { +class PspSemaphore { private: - uint32 _startMillis; - uint32 _startMicros; - uint32 _lastMillis; - uint32 _milliOffset; // to prevent looping around of millis - bool _looped; // make sure we only loop once + uint32 _handle; public: - PspRtc() : _startMillis(0), _startMicros(0), _lastMillis(0), _milliOffset(0), _looped(false) { init(); } - void init(); - uint32 getMillis(); - uint32 getMicros(); + PspSemaphore(int initialValue, int maxValue=255); + ~PspSemaphore(); + bool take() { return takeWithTimeOut(0); } + bool takeWithTimeOut(uint32 timeOut); + bool give(int num=1); + bool pollForValue(int value); // check for a certain value + int numOfWaitingThreads(); + int getValue(); +}; + +class PspMutex { +private: + PspSemaphore _semaphore; + int _recursiveCount; + int _ownerId; +public: + PspMutex(bool initialValue) : _semaphore(initialValue ? 1 : 0, 255), _recursiveCount(0), _ownerId(0) {} // initial, max value + bool lock(); + bool unlock(); + bool poll() { return _semaphore.pollForValue(1); } + int numOfWaitingThreads() { return _semaphore.numOfWaitingThreads(); } + bool getValue() { return (bool)_semaphore.getValue(); } +}; + +class PspCondition { +private: + PspMutex _mutex; + int _waitingThreads; + int _signaledThreads; + PspSemaphore _waitSem; + PspSemaphore _doneSem; +public: + PspCondition() : _mutex(true), _waitingThreads(0), _signaledThreads(0), + _waitSem(0), _doneSem(0) {} + void wait(PspMutex &externalMutex); + void releaseAll(); }; enum ThreadPriority { diff --git a/backends/platform/psp/trace.cpp b/backends/platform/psp/trace.cpp index 4bf5450177..7bac6534da 100644 --- a/backends/platform/psp/trace.cpp +++ b/backends/platform/psp/trace.cpp @@ -30,8 +30,9 @@ #include <stdio.h> int psp_debug_indent = 0; +bool firstWriteToFile = true; -void PSPDebugTrace(bool alsoToScreen, const char *format, ...) { +void PspDebugTrace(bool alsoToScreen, const char *format, ...) { va_list opt; char buffer[2048]; int bufsz; @@ -41,8 +42,12 @@ void PSPDebugTrace(bool alsoToScreen, const char *format, ...) { bufsz = vsnprintf(buffer, (size_t) sizeof(buffer), format, opt); va_end(opt); - //fd = fopen("MS0:/SCUMMTRACE.TXT", "ab"); - fd = fopen("SCUMMTRACE.TXT", "ab"); + if (firstWriteToFile) { + fd = fopen("SCUMMTRACE.TXT", "wb"); // erase the file the first time we write + firstWriteToFile = false; + } else { + fd = fopen("SCUMMTRACE.TXT", "ab"); + } if (fd == 0) return; diff --git a/backends/platform/psp/trace.h b/backends/platform/psp/trace.h index 1aad0f6781..ade8fd7214 100644 --- a/backends/platform/psp/trace.h +++ b/backends/platform/psp/trace.h @@ -39,8 +39,8 @@ #define __PSP_PRINT__(format,...) fprintf(stderr, format, ## __VA_ARGS__) #endif /* PSP_PRINT_TO_FILE/SCREEN */ -/* Error function */ -#define PSP_ERROR(format,...) __PSP_PRINT__("Error in %s: " format, __PRETTY_FUNCTION__, ## __VA_ARGS__) +/* Error function - always print to file as well */ +#define PSP_ERROR(format,...) PspDebugTrace(true, "Error in %s: " format, __PRETTY_FUNCTION__, ## __VA_ARGS__) /* Do the indent */ #define __PSP_INDENT__ for(int _i=psp_debug_indent; _i>0; _i--) \ @@ -52,7 +52,7 @@ #define PSP_INFO_PRINT_INDENT(format,...) { __PSP_INDENT__; \ __PSP_PRINT__(format, ## __VA_ARGS__); } -void PSPDebugTrace(bool alsoToScreen, const char *format, ...); +void PspDebugTrace(bool alsoToScreen, const char *format, ...); extern int psp_debug_indent; diff --git a/backends/platform/symbian/src/SymbianActions.cpp b/backends/platform/symbian/src/SymbianActions.cpp index d925f5f0e7..1a55a68778 100644 --- a/backends/platform/symbian/src/SymbianActions.cpp +++ b/backends/platform/symbian/src/SymbianActions.cpp @@ -28,6 +28,7 @@ #include "gui/message.h" #include "scumm/scumm.h" #include "common/config-manager.h" +#include "common/translation.h" #include <sdl.h> @@ -37,25 +38,25 @@ namespace GUI { // or we put them in this file separated by #ifdefs, this one is up to you, AnotherGuest :) const Common::String actionNames[] = { - "Up", - "Down", - "Left", - "Right", - "Left Click", - "Right Click", - "Save", - "Skip", - "Zone", - "Multi Function", - "Swap character", - "Skip text", - "Pause", - "Fast mode", - "Quit", - "Debugger", - "Global menu", - "Virtual keyboard", - "Key mapper" + _s("Up"), + _s("Down"), + _s("Left"), + _s("Right"), + _s("Left Click"), + _s("Right Click"), + _s("Save"), + _s("Skip"), + _s("Zone"), + _s("Multi Function"), + _s("Swap character"), + _s("Skip text"), + _s("Pause"), + _s("Fast mode"), + _s("Quit"), + _s("Debugger"), + _s("Global menu"), + _s("Virtual keyboard"), + _s("Key mapper") }; #ifdef UIQ @@ -75,7 +76,7 @@ void SymbianActions::init() { Common::String SymbianActions::actionName(ActionType action) { - return actionNames[action]; + return _(actionNames[action]); } int SymbianActions::size() { diff --git a/backends/platform/wii/options.cpp b/backends/platform/wii/options.cpp index a8f3552313..295856d564 100644 --- a/backends/platform/wii/options.cpp +++ b/backends/platform/wii/options.cpp @@ -28,6 +28,8 @@ #include "gui/dialog.h" #include "backends/fs/wii/wii-fs-factory.h" +#include "common/translation.h" + #include "options.h" WiiOptionsDialog::WiiOptionsDialog(bool doubleStrike) : @@ -42,84 +44,84 @@ WiiOptionsDialog::WiiOptionsDialog(bool doubleStrike) : _strUnderscanY = "wii_video_default_underscan_y"; } - new ButtonWidget(this, _w - 108 - 16, _h - 24 - 16, 108, 24, "Ok", 'k'); - new ButtonWidget(this, _w - 216 - 32, _h - 24 - 16, 108, 24, "Cancel", 'c'); + new ButtonWidget(this, _w - 108 - 16, _h - 24 - 16, 108, 24, _("OK"), 0, 'k'); + new ButtonWidget(this, _w - 216 - 32, _h - 24 - 16, 108, 24, _("Cancel"), 0, 'c'); _tab = new TabWidget(this, 0, 0, _w, _h - 54); - _tabVideo = _tab->addTab("Video"); + _tabVideo = _tab->addTab(_("Video")); new StaticTextWidget(_tab, 16, 16, 128, 16, - "Current video mode:", Graphics::kTextAlignRight); + _("Current video mode:"), Graphics::kTextAlignRight); new StaticTextWidget(_tab, 160, 16, 128, 16, - _doubleStrike ? "Double-strike" : "Default", + _doubleStrike ? _("Double-strike") : _("Default"), Graphics::kTextAlignLeft); new StaticTextWidget(_tab, 16, 48, 128, 16, - "Horizontal underscan:", Graphics::kTextAlignRight); - _sliderUnderscanX = new SliderWidget(_tab, 160, 47, 128, 18, 'x'); + _("Horizontal underscan:"), Graphics::kTextAlignRight); + _sliderUnderscanX = new SliderWidget(_tab, 160, 47, 128, 18, 0, 'x'); _sliderUnderscanX->setMinValue(0); _sliderUnderscanX->setMaxValue(32); new StaticTextWidget(_tab, 16, 80, 128, 16, - "Vertical underscan:", Graphics::kTextAlignRight); - _sliderUnderscanY = new SliderWidget(_tab, 160, 79, 128, 18, 'y'); + _("Vertical underscan:"), Graphics::kTextAlignRight); + _sliderUnderscanY = new SliderWidget(_tab, 160, 79, 128, 18, 0, 'y'); _sliderUnderscanY->setMinValue(0); _sliderUnderscanY->setMaxValue(32); - _tabInput = _tab->addTab("Input"); + _tabInput = _tab->addTab(_("Input")); new StaticTextWidget(_tab, 16, 16, 128, 16, - "GC Pad sensitivity:", Graphics::kTextAlignRight); - _sliderPadSensitivity = new SliderWidget(_tab, 160, 15, 128, 18, 'x'); + _("GC Pad sensitivity:"), Graphics::kTextAlignRight); + _sliderPadSensitivity = new SliderWidget(_tab, 160, 15, 128, 18, 0, 'x'); _sliderPadSensitivity->setMinValue(0); _sliderPadSensitivity->setMaxValue(64); new StaticTextWidget(_tab, 16, 44, 128, 16, - "GC Pad acceleration:", Graphics::kTextAlignRight); - _sliderPadAcceleration = new SliderWidget(_tab, 160, 43, 128, 18, 'y'); + _("GC Pad acceleration:"), Graphics::kTextAlignRight); + _sliderPadAcceleration = new SliderWidget(_tab, 160, 43, 128, 18, 0, 'y'); _sliderPadAcceleration->setMinValue(0); _sliderPadAcceleration->setMaxValue(8); #ifdef USE_WII_DI - _tabDVD = _tab->addTab("DVD"); + _tabDVD = _tab->addTab(_("DVD")); new StaticTextWidget(_tab, 16, 16, 64, 16, - "Status:", Graphics::kTextAlignRight); - _textDVDStatus = new StaticTextWidget(_tab, 96, 16, 272, 16, "Unknown", + _("Status:"), Graphics::kTextAlignRight); + _textDVDStatus = new StaticTextWidget(_tab, 96, 16, 272, 16, _("Unknown"), Graphics::kTextAlignLeft); - new ButtonWidget(_tab, 16, 48, 108, 24, "Mount DVD", 'mdvd'); - new ButtonWidget(_tab, 140, 48, 108, 24, "Unmount DVD", 'udvd'); + new ButtonWidget(_tab, 16, 48, 108, 24, _("Mount DVD"), 0, 'mdvd'); + new ButtonWidget(_tab, 140, 48, 108, 24, _("Unmount DVD"), 0, 'udvd'); #endif #ifdef USE_WII_SMB - _tabSMB = _tab->addTab("SMB"); + _tabSMB = _tab->addTab(_("SMB")); new StaticTextWidget(_tab, 16, 16, 64, 16, - "Status:", Graphics::kTextAlignRight); - _textSMBStatus = new StaticTextWidget(_tab, 96, 16, 272, 16, "Unknown", + _("Status:"), Graphics::kTextAlignRight); + _textSMBStatus = new StaticTextWidget(_tab, 96, 16, 272, 16, _("Unknown"), Graphics::kTextAlignLeft); new StaticTextWidget(_tab, 16, 52, 64, 16, - "Server:", Graphics::kTextAlignRight); + _("Server:"), Graphics::kTextAlignRight); _editSMBServer = new EditTextWidget(_tab, 96, 48, _w - 96 - 32, 24, ""); new StaticTextWidget(_tab, 16, 92, 64, 16, - "Share:", Graphics::kTextAlignRight); + _("Share:"), Graphics::kTextAlignRight); _editSMBShare = new EditTextWidget(_tab, 96, 88, _w - 96 - 32, 24, ""); new StaticTextWidget(_tab, 16, 132, 64, 16, - "Username:", Graphics::kTextAlignRight); + _("Username:"), Graphics::kTextAlignRight); _editSMBUsername = new EditTextWidget(_tab, 96, 128, _w - 96 - 32, 24, ""); new StaticTextWidget(_tab, 16, 172, 64, 16, - "Password:", Graphics::kTextAlignRight); + _("Password:"), Graphics::kTextAlignRight); _editSMBPassword = new EditTextWidget(_tab, 96, 168, _w - 96 - 32, 24, ""); - new ButtonWidget(_tab, 16, 208, 108, 24, "Init network", 'net'); + new ButtonWidget(_tab, 16, 208, 108, 24, _("Init network"), 0, 'net'); - new ButtonWidget(_tab, 140, 208, 108, 24, "Mount SMB", 'msmb'); - new ButtonWidget(_tab, 264, 208, 108, 24, "Unmount SMB", 'usmb'); + new ButtonWidget(_tab, 140, 208, 108, 24, _("Mount SMB"), 0, 'msmb'); + new ButtonWidget(_tab, 264, 208, 108, 24, _("Unmount SMB"), 0, 'usmb'); #endif _tab->setActiveTab(_tabVideo); @@ -140,12 +142,12 @@ void WiiOptionsDialog::handleTickle() { #ifdef USE_WII_DI if (tab == _tabDVD) { if (fsf.isMounted(WiiFilesystemFactory::kDVD)) { - _textDVDStatus->setLabel("DVD Mounted successfully"); + _textDVDStatus->setLabel(_("DVD Mounted successfully")); } else { if (fsf.failedToMount(WiiFilesystemFactory::kDVD)) - _textDVDStatus->setLabel("Error while mounting the DVD"); + _textDVDStatus->setLabel(_("Error while mounting the DVD")); else - _textDVDStatus->setLabel("DVD not mounted"); + _textDVDStatus->setLabel(_("DVD not mounted")); } } #endif @@ -158,32 +160,32 @@ void WiiOptionsDialog::handleTickle() { switch (status) { case 0: if (fsf.isMounted(WiiFilesystemFactory::kSMB)) { - label = "Network up, share mounted"; + label = _("Network up, share mounted"); } else { - label = "Network up"; + label = _("Network up"); if (fsf.failedToMount(WiiFilesystemFactory::kSMB)) - label += ", error while mounting the share"; + label += _(", error while mounting the share"); else - label += ", share not mounted"; + label += _(", share not mounted"); } break; case -ENETDOWN: - label = "Network down"; + label = _("Network down"); break; case -EBUSY: - label = "Initialising network"; + label = _("Initialising network"); break; case -ETIMEDOUT: - label = "Timeout while initialising network"; + label = _("Timeout while initialising network"); break; default: - label = String::printf("Network not initialsed (%d)", status); + label = String::printf(_("Network not initialsed (%d)"), status); break; } diff --git a/backends/platform/wii/osystem.h b/backends/platform/wii/osystem.h index d277aa38b1..8180d5727f 100644 --- a/backends/platform/wii/osystem.h +++ b/backends/platform/wii/osystem.h @@ -156,7 +156,7 @@ public: virtual bool setGraphicsMode(int mode); #ifdef USE_RGB_COLOR virtual Graphics::PixelFormat getScreenFormat() const; - virtual Common::List<Graphics::PixelFormat> getSupportedFormats(); + virtual Common::List<Graphics::PixelFormat> getSupportedFormats() const; #endif virtual int getGraphicsMode() const; virtual void initSize(uint width, uint height, diff --git a/backends/platform/wii/osystem_gfx.cpp b/backends/platform/wii/osystem_gfx.cpp index 3d4e75883b..19190048a0 100644 --- a/backends/platform/wii/osystem_gfx.cpp +++ b/backends/platform/wii/osystem_gfx.cpp @@ -209,7 +209,7 @@ Graphics::PixelFormat OSystem_Wii::getScreenFormat() const { return _pfGame; } -Common::List<Graphics::PixelFormat> OSystem_Wii::getSupportedFormats() { +Common::List<Graphics::PixelFormat> OSystem_Wii::getSupportedFormats() const { Common::List<Graphics::PixelFormat> res; res.push_back(_pfRGB565); res.push_back(Graphics::PixelFormat::createFormatCLUT8()); diff --git a/backends/platform/wince/CEActionsPocket.cpp b/backends/platform/wince/CEActionsPocket.cpp index ebe6981290..64abd0be3e 100644 --- a/backends/platform/wince/CEActionsPocket.cpp +++ b/backends/platform/wince/CEActionsPocket.cpp @@ -31,30 +31,32 @@ #include "common/config-manager.h" #include "gui/KeysDialog.h" +#include "common/translation.h" + #ifdef _WIN32_WCE #define KEY_ALL_SKIP 3457 #endif const String pocketActionNames[] = { - "Pause", - "Save", - "Quit", - "Skip", - "Hide Toolbar", - "Show Keyboard", - "Sound on/off", - "Right click", - "Show/Hide Cursor", - "Free look", - "Zoom up", - "Zoom down", - "Multi Function", - "Bind Keys", - "Cursor Up", - "Cursor Down", - "Cursor Left", - "Cursor Right", - "Left Click", + _s("Pause"), + _s("Save"), + _s("Quit"), + _s("Skip"), + _s("Hide Toolbar"), + _s("Show Keyboard"), + _s("Sound on/off"), + _s("Right click"), + _s("Show/Hide Cursor"), + _s("Free look"), + _s("Zoom up"), + _s("Zoom down"), + _s("Multi Function"), + _s("Bind Keys"), + _s("Cursor Up"), + _s("Cursor Down"), + _s("Cursor Left"), + _s("Cursor Right"), + _s("Left Click") }; void CEActionsPocket::init() { @@ -63,7 +65,7 @@ void CEActionsPocket::init() { String CEActionsPocket::actionName(GUI::ActionType action) { - return pocketActionNames[action]; + return _(pocketActionNames[action]); } int CEActionsPocket::size() { @@ -258,7 +260,7 @@ bool CEActionsPocket::perform(GUI::ActionType action, bool pushed) { if (action == POCKET_ACTION_SAVE && ConfMan.get("gameid") == "parallaction") { // FIXME: This is a temporary solution. The engine should handle its own menus. // Note that the user can accomplish this via the virtual keyboard as well, this is just for convenience - GUI::MessageDialog alert("Do you want to load or save the game?", "Load", "Save"); + GUI::MessageDialog alert(_("Do you want to load or save the game?"), _("Load"), _("Save")); if (alert.runModal() == GUI::kMessageOK) _key_action[action].setKey(SDLK_l); else @@ -308,7 +310,7 @@ bool CEActionsPocket::perform(GUI::ActionType action, bool pushed) { case POCKET_ACTION_QUIT: if (!quitdialog) { quitdialog = true; - GUI::MessageDialog alert(" Are you sure you want to quit ? ", "Yes", "No"); + GUI::MessageDialog alert(_(" Are you sure you want to quit ? "), _("Yes"), _("No")); if (alert.runModal() == GUI::kMessageOK) _mainSystem->quit(); quitdialog = false; diff --git a/backends/platform/wince/CEActionsSmartphone.cpp b/backends/platform/wince/CEActionsSmartphone.cpp index 47733ae317..af80bd2908 100644 --- a/backends/platform/wince/CEActionsSmartphone.cpp +++ b/backends/platform/wince/CEActionsSmartphone.cpp @@ -30,23 +30,25 @@ #include "common/config-manager.h" #include "gui/KeysDialog.h" +#include "common/translation.h" + #define KEY_ALL_SKIP 3457 const String smartphoneActionNames[] = { - "Up", - "Down", - "Left", - "Right", - "Left Click", - "Right Click", - "Save", - "Skip", - "Zone", - "Multi Function", - "Bind Keys", - "Keyboard", - "Rotate", - "Quit" + _s("Up"), + _s("Down"), + _s("Left"), + _s("Right"), + _s("Left Click"), + _s("Right Click"), + _s("Save"), + _s("Skip"), + _s("Zone"), + _s("Multi Function"), + _s("Bind Keys"), + _s("Keyboard"), + _s("Rotate"), + _s("Quit") }; const int ACTIONS_SMARTPHONE_DEFAULT[] = { SDLK_UP, SDLK_DOWN, SDLK_LEFT, SDLK_RIGHT, SDLK_F1, SDLK_F2, SDLK_F3, SDLK_ESCAPE, SDLK_9, SDLK_8, SDLK_F4, SDLK_RETURN, SDLK_5, SDLK_0 }; @@ -57,7 +59,7 @@ void CEActionsSmartphone::init() { String CEActionsSmartphone::actionName(GUI::ActionType action) { - return smartphoneActionNames[action]; + return _(smartphoneActionNames[action]); } int CEActionsSmartphone::size() { @@ -220,7 +222,7 @@ bool CEActionsSmartphone::perform(GUI::ActionType action, bool pushed) { if (action == SMARTPHONE_ACTION_SAVE && ConfMan.get("gameid") == "parallaction") { // FIXME: This is a temporary solution. The engine should handle its own menus. // Note that the user can accomplish this via the virtual keyboard as well, this is just for convenience - GUI::MessageDialog alert("Do you want to load or save the game?", "Load", "Save"); + GUI::MessageDialog alert(_("Do you want to load or save the game?"), _("Load"), _("Save")); if (alert.runModal() == GUI::kMessageOK) _key_action[action].setKey(SDLK_l); else @@ -267,7 +269,7 @@ bool CEActionsSmartphone::perform(GUI::ActionType action, bool pushed) { case SMARTPHONE_ACTION_QUIT: if (!quitdialog) { quitdialog = true; - GUI::MessageDialog alert(" Are you sure you want to quit ? ", "Yes", "No"); + GUI::MessageDialog alert(_(" Are you sure you want to quit ? "), _("Yes"), _("No")); if (alert.runModal() == GUI::kMessageOK) _mainSystem->quit(); quitdialog = false; diff --git a/backends/platform/wince/CELauncherDialog.cpp b/backends/platform/wince/CELauncherDialog.cpp index 21a967336e..11e4900c2d 100644 --- a/backends/platform/wince/CELauncherDialog.cpp +++ b/backends/platform/wince/CELauncherDialog.cpp @@ -38,6 +38,8 @@ #include "common/config-manager.h" +#include "common/translation.h" + using namespace GUI; using namespace Common; @@ -51,13 +53,13 @@ public: // needs fixing, or remove it! const int buttonWidth = g_gui.xmlEval()->getVar("Globals.Button.Width", 0); const int buttonHeight = g_gui.xmlEval()->getVar("Globals.Button.Height", 0); - new ButtonWidget(this, (_w - buttonWidth) / 2, 45, buttonWidth, buttonHeight, "OK", kCloseCmd, '\r'); // Close dialog - FIXME + new ButtonWidget(this, (_w - buttonWidth) / 2, 45, buttonWidth, buttonHeight, _("OK"), 0, kCloseCmd, '\r'); // Close dialog - FIXME - Common::String videoDriver("Using SDL driver "); + Common::String videoDriver(_("Using SDL driver ")); SDL_VideoDriverName(tempo, sizeof(tempo)); videoDriver += tempo; new StaticTextWidget(this, 0, 10, _w, kLineHeight, videoDriver, Graphics::kTextAlignCenter); - Common::String displayInfos("Display "); + Common::String displayInfos(_("Display ")); sprintf(tempo, "%dx%d (real %dx%d)", GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), OSystem_WINCE3::getScreenWidth(), OSystem_WINCE3::getScreenHeight()); displayInfos += tempo; new StaticTextWidget(this, 0, 20, _w, kLineHeight, displayInfos, Graphics::kTextAlignCenter); @@ -99,7 +101,7 @@ void CELauncherDialog::automaticScanDirectory(const Common::FSNode &node) { * returns some illegal paths atm. */ void CELauncherDialog::addGame() { - MessageDialog alert("Do you want to perform an automatic scan ?", "Yes", "No"); + MessageDialog alert(_("Do you want to perform an automatic scan ?"), _("Yes"), _("No")); if (alert.runModal() == kMessageOK && _browser->runModal() > 0) { // Clear existing domains ConfigManager::DomainMap &domains = (ConfigManager::DomainMap&)ConfMan.getGameDomains(); diff --git a/backends/platform/wince/wince-sdl.cpp b/backends/platform/wince/wince-sdl.cpp index b3480702b5..aef2117bd7 100644 --- a/backends/platform/wince/wince-sdl.cpp +++ b/backends/platform/wince/wince-sdl.cpp @@ -30,6 +30,7 @@ #include "common/events.h" #include "common/util.h" #include "common/timer.h" +#include "common/translation.h" #include "engines/engine.h" @@ -107,14 +108,14 @@ bool _hasSmartphoneResolution = false; // Low end devices 240x320 static const OSystem::GraphicsMode s_supportedGraphicsModesLow[] = { - {"1x", "Normal (no scaling)", GFX_NORMAL}, + {"1x", _s("Normal (no scaling)"), GFX_NORMAL}, {0, 0, 0} }; // High end device 480x640 static const OSystem::GraphicsMode s_supportedGraphicsModesHigh[] = { - {"1x", "Normal (no scaling)", GFX_NORMAL}, + {"1x", _s("Normal (no scaling)"), GFX_NORMAL}, {"2x", "2x", GFX_DOUBLESIZE}, #ifndef _MSC_VER // EVC breaks template functions, and I'm tired of fixing them :) {"2xsai", "2xSAI", GFX_2XSAI}, @@ -2263,6 +2264,7 @@ static int mapKeyCE(SDLKey key, SDLMod mod, Uint16 unicode, bool unfilter) { bool OSystem_WINCE3::pollEvent(Common::Event &event) { SDL_Event ev; + ev.type = SDL_NOEVENT; byte b = 0; DWORD currentTime; bool keyEvent = false; diff --git a/backends/plugins/psp/psp-provider.cpp b/backends/plugins/psp/psp-provider.cpp index f394916538..5760424cbf 100644 --- a/backends/plugins/psp/psp-provider.cpp +++ b/backends/plugins/psp/psp-provider.cpp @@ -31,6 +31,8 @@ #include "backends/platform/psp/psploader.h" +#include "backends/platform/psp/trace.h" + class PSPPlugin : public DynamicPlugin { protected: @@ -95,13 +97,13 @@ Plugin* PSPPluginProvider::createPlugin(const Common::FSNode &node) const { bool PSPPluginProvider::isPluginFilename(const Common::FSNode &node) const { // Check the plugin suffix Common::String filename = node.getName(); - fprintf(stderr, "Testing name %s", filename.c_str()); + PSP_DEBUG_PRINT("Testing name %s", filename.c_str()); if (!filename.hasSuffix(".PLG") && !filename.hasSuffix(".plg")) { - fprintf(stderr," fail.\n"); + PSP_DEBUG_PRINT(" fail.\n"); return false; } - fprintf(stderr," success!\n"); + PSP_DEBUG_PRINT(" success!\n"); return true; } diff --git a/backends/plugins/win32/win32-provider.cpp b/backends/plugins/win32/win32-provider.cpp index a39bdfe76a..65586249e8 100644 --- a/backends/plugins/win32/win32-provider.cpp +++ b/backends/plugins/win32/win32-provider.cpp @@ -30,6 +30,7 @@ #include "common/debug.h" #include "common/fs.h" +#define WIN32_LEAN_AND_MEAN #include <windows.h> diff --git a/backends/vkeybd/virtual-keyboard.cpp b/backends/vkeybd/virtual-keyboard.cpp index bd512fe3ad..2c88322191 100644 --- a/backends/vkeybd/virtual-keyboard.cpp +++ b/backends/vkeybd/virtual-keyboard.cpp @@ -90,7 +90,6 @@ bool VirtualKeyboard::openPack(const String &packName, const FSNode &node) { return true; } -#ifdef USE_ZLIB if (node.getChild(packName + ".zip").exists()) { // compressed keyboard pack _fileArchive = makeZipArchive(node.getChild(packName + ".zip")); @@ -109,7 +108,6 @@ bool VirtualKeyboard::openPack(const String &packName, const FSNode &node) { return true; } -#endif return false; } |