diff options
author | Max Horn | 2009-03-19 09:51:40 +0000 |
---|---|---|
committer | Max Horn | 2009-03-19 09:51:40 +0000 |
commit | b5bcc1a23af73761f6ff40f79db0a5beb8ae82f1 (patch) | |
tree | 6ddd0d5b8e01a63fdcbc1b1c9d1a1a0739a1966d | |
parent | 8dc12da206cc850b3bd2bd456e4607ded695704d (diff) | |
download | scummvm-rg350-b5bcc1a23af73761f6ff40f79db0a5beb8ae82f1.tar.gz scummvm-rg350-b5bcc1a23af73761f6ff40f79db0a5beb8ae82f1.tar.bz2 scummvm-rg350-b5bcc1a23af73761f6ff40f79db0a5beb8ae82f1.zip |
Merged Neil's NDS changes into trunk
svn-id: r39526
20 files changed, 551 insertions, 902 deletions
diff --git a/backends/fs/ds/ds-fs.cpp b/backends/fs/ds/ds-fs.cpp index 79f10fdb62..92bdba0650 100644 --- a/backends/fs/ds/ds-fs.cpp +++ b/backends/fs/ds/ds-fs.cpp @@ -197,11 +197,11 @@ AbstractFSNode* DSFileSystemNode::getParent() const { } Common::SeekableReadStream *DSFileSystemNode::createReadStream() { - return StdioStream::makeFromPath(getPath().c_str(), false); + return DSFileStream::makeFromPath(getPath().c_str(), false); } Common::WriteStream *DSFileSystemNode::createWriteStream() { - return StdioStream::makeFromPath(getPath().c_str(), true); + return DSFileStream::makeFromPath(getPath().c_str(), true); } ////////////////////////////////////////////////////////////////////////// @@ -211,9 +211,8 @@ Common::WriteStream *DSFileSystemNode::createWriteStream() { GBAMPFileSystemNode::GBAMPFileSystemNode() { _displayName = "mp:/"; _path = "mp:/"; - _isValid = true; + _isValid = false; _isDirectory = true; - _path = "mp:/"; } GBAMPFileSystemNode::GBAMPFileSystemNode(const Common::String& path) { @@ -283,9 +282,9 @@ GBAMPFileSystemNode::GBAMPFileSystemNode(const GBAMPFileSystemNode* node) { AbstractFSNode *GBAMPFileSystemNode::getChild(const Common::String& n) const { if (_path.lastChar() == '\\') { - return new DSFileSystemNode(_path + n); + return new GBAMPFileSystemNode(_path + n); } else { - return new DSFileSystemNode(_path + "\\" + n); + return new GBAMPFileSystemNode(_path + "\\" + n); } return NULL; @@ -376,16 +375,113 @@ Common::SeekableReadStream *GBAMPFileSystemNode::createReadStream() { // consolePrintf("Opening: %s\n", getPath().c_str()); if (!strncmp(getPath().c_str(), "mp:/", 4)) { - return StdioStream::makeFromPath(getPath().c_str() + 3, false); + return DSFileStream::makeFromPath(getPath().c_str() + 3, false); } else { - return StdioStream::makeFromPath(getPath().c_str(), false); + return DSFileStream::makeFromPath(getPath().c_str(), false); } } Common::WriteStream *GBAMPFileSystemNode::createWriteStream() { - return StdioStream::makeFromPath(getPath().c_str(), true); + return DSFileStream::makeFromPath(getPath().c_str(), true); +} + + + + +DSFileStream::DSFileStream(void *handle) : _handle(handle) { + assert(handle); + _writeBufferPos = 0; +} + +DSFileStream::~DSFileStream() { + if (_writeBufferPos > 0) { + flush(); + } + std_fclose((FILE *)_handle); +} + +bool DSFileStream::err() const { + return std_ferror((FILE *)_handle) != 0; +} + +void DSFileStream::clearErr() { + std_clearerr((FILE *)_handle); +} + +bool DSFileStream::eos() const { + return std_feof((FILE *)_handle) != 0; +} + +int32 DSFileStream::pos() const { + if (_writeBufferPos > 0) { + // Discard constness. Bad, but I can't see another way. + ((DSFileStream *) (this))->flush(); + } + 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(); + } + int32 oldPos = std_ftell((FILE *)_handle); + std_fseek((FILE *)_handle, 0, SEEK_END); + int32 length = std_ftell((FILE *)_handle); + std_fseek((FILE *)_handle, oldPos, SEEK_SET); + + return length; +} + +bool DSFileStream::seek(int32 offs, int whence) { + if (_writeBufferPos > 0) { + flush(); + } + return std_fseek((FILE *)_handle, offs, whence) == 0; +} + +uint32 DSFileStream::read(void *ptr, uint32 len) { + if (_writeBufferPos > 0) { + flush(); + } + return std_fread((byte *)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 + { + if (_writeBufferPos > 0) { + flush(); + } + return std_fwrite(ptr, 1, len, (FILE *)_handle); + } } +bool DSFileStream::flush() { + + if (_writeBufferPos > 0) { + std_fwrite(_writeBuffer, 1, _writeBufferPos, (FILE *) _handle); + _writeBufferPos = 0; + } + + return std_fflush((FILE *)_handle) == 0; +} + +DSFileStream *DSFileStream::makeFromPath(const Common::String &path, bool writeMode) { + FILE *handle = std_fopen(path.c_str(), writeMode ? "wb" : "rb"); + + if (handle) + return new DSFileStream(handle); + return 0; +} + + + + // Stdio replacements #define MAX_FILE_HANDLES 32 diff --git a/backends/fs/ds/ds-fs.h b/backends/fs/ds/ds-fs.h index beea422a14..c8bf7d6cf2 100644 --- a/backends/fs/ds/ds-fs.h +++ b/backends/fs/ds/ds-fs.h @@ -27,7 +27,6 @@ #include "common/fs.h" #include "zipreader.h" #include "ramsave.h" -#include "scummconsole.h" #include "fat/gba_nds_fat.h" #include "backends/fs/abstract-fs.h" @@ -168,6 +167,41 @@ struct fileHandle { DSSaveFile* sramFile; }; + +class DSFileStream : public Common::SeekableReadStream, public Common::WriteStream, public Common::NonCopyable { +protected: + static const int WRITE_BUFFER_SIZE = 512; + + /** File handle to the actual file. */ + void *_handle; + + char _writeBuffer[WRITE_BUFFER_SIZE]; + int _writeBufferPos; + +public: + /** + * Given a path, invokes fopen on that path and wrap the result in a + * StdioStream instance. + */ + static DSFileStream *makeFromPath(const Common::String &path, bool writeMode); + + DSFileStream(void *handle); + virtual ~DSFileStream(); + + bool err() const; + void clearErr(); + bool eos() const; + + virtual uint32 write(const void *dataPtr, uint32 dataSize); + virtual bool flush(); + + virtual int32 pos() const; + virtual int32 size() const; + bool seek(int32 offs, int whence = SEEK_SET); + uint32 read(void *dataPtr, uint32 dataSize); +}; + + #undef stderr #undef stdout #undef stdin diff --git a/backends/platform/ds/arm7/source/main.cpp b/backends/platform/ds/arm7/source/main.cpp index d252ed44de..7029d96405 100644 --- a/backends/platform/ds/arm7/source/main.cpp +++ b/backends/platform/ds/arm7/source/main.cpp @@ -34,6 +34,8 @@ #include <bios.h> #include <arm7/touch.h> #include <arm7/clock.h> +#include <arm7/audio.h> +#include <system.h> #include <stdlib.h> #include <string.h> //#include <registers_alt.h> // not needed in current libnds @@ -135,13 +137,13 @@ void startSound(int sampleRate, const void* data, uint32 bytes, u8 channel=0, u8 switch (format) { case 1: { - flags |= SOUND_8BIT; + flags |= SOUND_FORMAT_8BIT; flags |= SOUND_REPEAT;// | (1 << 15); break; } case 0: { - flags |= SOUND_16BIT; + flags |= SOUND_FORMAT_16BIT; flags |= SOUND_REPEAT;// | (1 << 15); break; } @@ -433,13 +435,14 @@ void InterruptTimer3() { but = REG_KEYXY; if (!(but & 0x40)) { // Read the touch screen - touchPosition p = touchReadXY(); + touchPosition p; + touchReadXY(&p); // x = touchRead(TSC_MEASURE_X); // y = touchRead(TSC_MEASURE_Y); - x = p.x; - y = p.y; + x = p.rawx; + y = p.rawy; xpx = p.px; ypx = p.py; @@ -581,13 +584,13 @@ int main(int argc, char ** argv) { rtcReset(); //enable sound - powerON(POWER_SOUND); +// powerOn(POWER_SOUND); SOUND_CR = SOUND_ENABLE | SOUND_VOL(0x7F); IPC->soundData = 0; IPC->reset = false; - + fifoInit(); for (int r = 0; r < 8; r++) { IPC->adpcm.arm7Buffer[r] = (u8 *) malloc(512); diff --git a/backends/platform/ds/arm9/makefile b/backends/platform/ds/arm9/makefile index 8f191d1f7e..09359f3ccd 100644 --- a/backends/platform/ds/arm9/makefile +++ b/backends/platform/ds/arm9/makefile @@ -8,36 +8,39 @@ libndsdir = $(DEVKITPRO)/libnds # Select the build by setting SCUMM_BUILD to a,b,c,d,e,f or g. # Anything else gets build a. -ifeq ($(SCUMM_BUILD),h) - DS_BUILD_H = 1 - else - ifeq ($(SCUMM_BUILD),g) - DS_BUILD_G = 1 - else - ifeq ($(SCUMM_BUILD),f) - DS_BUILD_F = 1 +ifeq ($(SCUMM_BUILD),i) + DS_BUILD_I = 1 +else + ifeq ($(SCUMM_BUILD),h) + DS_BUILD_H = 1 else - ifeq ($(SCUMM_BUILD),e) - DS_BUILD_E = 1 + ifeq ($(SCUMM_BUILD),g) + DS_BUILD_G = 1 else - ifeq ($(SCUMM_BUILD),d) - DS_BUILD_D = 1 + ifeq ($(SCUMM_BUILD),f) + DS_BUILD_F = 1 else - ifeq ($(SCUMM_BUILD),c) - DS_BUILD_C = 1 + ifeq ($(SCUMM_BUILD),e) + DS_BUILD_E = 1 else - ifeq ($(SCUMM_BUILD),b) - DS_BUILD_B = 1 + ifeq ($(SCUMM_BUILD),d) + DS_BUILD_D = 1 else - DS_BUILD_A = 1 + ifeq ($(SCUMM_BUILD),c) + DS_BUILD_C = 1 + else + ifeq ($(SCUMM_BUILD),b) + DS_BUILD_B = 1 + else + DS_BUILD_A = 1 + endif + endif endif endif endif endif endif endif -endif - # To do: # - FAT cache? @@ -151,6 +154,12 @@ ifdef DS_BUILD_H BUILD=scummvm-H endif +ifdef DS_BUILD_I + DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_H + LOGO = logog.bmp + ENABLE_TUCKER = STATIC_PLUGIN + BUILD=scummvm-H +endif ARM7BIN := -7 $(CURDIR)/../../arm7/arm7.bin ICON := -b ../../../logo.bmp "ScummVM;By Neil Millstone;" @@ -196,9 +205,12 @@ ifdef USE_MAD DEFINES += -DUSE_MAD endif -DEFINES += -DDISABLE_TEXT_CONSOLE -DDISABLE_COMMAND_LINE -DREDUCE_MEMORY_USAGE +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 -Wl,--wrap,time -mno-fpu -Wl,-Map,map.txt -Wl,--gc-sections +LDFLAGS = -specs=ds_arm9.specs -mthumb-interwork -mno-fpu -Wl,-Map,map.txt -Wl,--gc-sections INCLUDES= -I$(portdir)/$(BUILD) -I$(srcdir) -I$(srcdir)/engines \ -I$(portdir)/data -I$(portdir)/../commoninclude \ @@ -239,8 +251,9 @@ 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/scummconsole.o $(portdir)/source/touchkeyboard.o $(portdir)/source/zipreader.o\ - $(portdir)/source/dsoptions.o $(portdir)/source/keys.o $(portdir)/source/wordcompletion.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 @@ -281,7 +294,7 @@ OPTLIST := actor.cpp ds_main.cpp osystem_ds.cpp blitters.cpp fmopl.cpp rate.cpp OPT_SPEED := -O3 # Compiler options for files which should be optimised for space -OPT_SIZE := -Os +OPT_SIZE := -Os -mthumb #-mthumb -fno-gcse -fno-schedule-insns2 diff --git a/backends/platform/ds/arm9/source/blitters_arm.s b/backends/platform/ds/arm9/source/blitters_arm.s index 48ec316675..4f18639dec 100644 --- a/backends/platform/ds/arm9/source/blitters_arm.s +++ b/backends/platform/ds/arm9/source/blitters_arm.s @@ -20,9 +20,17 @@ @ @ @author Robin Watts (robin@wss.co.uk) +@ .global timerTickHandler +@ .align 2 +@ .code 32 + +@timerTickHandler: +@ bx lr + + .global Rescale_320x256xPAL8_To_256x256x1555 .global Rescale_320x256x1555_To_256x256x1555 - .section .itcm,"ax", %progbits +@ .section .itcm,"ax", %progbits .align 2 .code 32 diff --git a/backends/platform/ds/arm9/source/cdaudio.cpp b/backends/platform/ds/arm9/source/cdaudio.cpp index 4f66401b53..140c709a8c 100644 --- a/backends/platform/ds/arm9/source/cdaudio.cpp +++ b/backends/platform/ds/arm9/source/cdaudio.cpp @@ -25,7 +25,6 @@ #include "common/config-manager.h" #include "dsmain.h" #include "NDS/scummvm_ipc.h" -#include "console2.h" #define WAV_FORMAT_IMA_ADPCM 0x14 #define BUFFER_SIZE 8192 diff --git a/backends/platform/ds/arm9/source/console2.h b/backends/platform/ds/arm9/source/console2.h deleted file mode 100644 index 86434dcb93..0000000000 --- a/backends/platform/ds/arm9/source/console2.h +++ /dev/null @@ -1,124 +0,0 @@ -////////////////////////////////////////////////////////////////////// -// -// consol.h --provides basic consol type print functionality -// -// version 0.1, February 14, 2005 -// -// Copyright (C) 2005 Michael Noland (joat) and Jason Rogers (dovoto) -// -// 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. -// -// Changelog: -// 0.1: First version -// 0.2: Fixed sprite mapping bug. 1D mapping should work now. -// Changed some register defines for consistency. -// -////////////////////////////////////////////////////////////////////// -#ifndef CONSOLE_H2 -#define CONSOLE_H2 - -#define CONSOLE_USE_COLOR255 16 - -#ifdef __cplusplus -extern "C" { -#endif - -void consoleInit(u16* font, u16* charBase, u16 numCharacters, u8 charStart, u16* map, u8 pal, u8 bitDepth); -void consoleInitDefault(u16* map, u16* charBase, u8 bitDepth); - -void consolePrintf(const char* s, ...); - -void consolePrintSet(int x, int y); - -void consolePrintChar(char c); - -void consolePutString(int x, int y, char* s); -void consolePutInt(int x, int y, int d); -void consolePutX(int x, int y, int d); -void consolePutChar(int x, int y, char c); -void consolePutBin(int x, int y, int b); - -void consoleClear(void); - -#ifdef __cplusplus -} -#endif - -#endif -////////////////////////////////////////////////////////////////////// -// -// consol.h --provides basic consol type print functionality -// -// version 0.1, February 14, 2005 -// -// Copyright (C) 2005 Michael Noland (joat) and Jason Rogers (dovoto) -// -// 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. -// -// Changelog: -// 0.1: First version -// 0.2: Fixed sprite mapping bug. 1D mapping should work now. -// Changed some register defines for consistency. -// -////////////////////////////////////////////////////////////////////// -#ifndef CONSOLE_H2 -#define CONSOLE_H2 - -#define CONSOLE_USE_COLOR255 16 - -#ifdef __cplusplus -extern "C" { -#endif - -void consoleInit(u16* font, u16* charBase, u16 numCharacters, u8 charStart, u16* map, u8 pal, u8 bitDepth); -void consoleInitDefault(u16* map, u16* charBase, u8 bitDepth); - -void consolePrintf(const char* s, ...); - -void consolePrintSet(int x, int y); - -void consolePrintChar(char c); - -void consolePutString(int x, int y, char* s); -void consolePutInt(int x, int y, int d); -void consolePutX(int x, int y, int d); -void consolePutChar(int x, int y, char c); -void consolePutBin(int x, int y, int b); - -void consoleClear(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index 297e2c6037..621a2af082 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -67,6 +67,7 @@ #include <nds.h> #include <nds/registers_alt.h> #include <nds/arm9/exceptions.h> +#include <nds/arm9/console.h> //#include <ARM9/console.h> //basic print funcionality @@ -94,8 +95,11 @@ #include "profiler/cyg-profile.h" #endif #include "backends/fs/ds/ds-fs.h" +#include "engine.h" +extern "C" void OurIntrMain(void); extern "C" u32 getExceptionAddress( u32 opcodeAddress, u32 thumbState); + extern const char __itcm_start[]; static const char *registerNames[] = { "r0","r1","r2","r3","r4","r5","r6","r7", @@ -115,6 +119,7 @@ extern "C" void* __wrap_malloc(size_t size) { } */ + namespace DS { // From console.c in NDSLib @@ -556,22 +561,18 @@ void displayMode8Bit() { #endif u16 buffer[32 * 32]; + initGame(); + setKeyboardEnable(false); if (!displayModeIs8Bit) { for (int r = 0; r < 32 * 32; r++) { buffer[r] = ((u16 *) SCREEN_BASE_BLOCK_SUB(4))[r]; } - } - - consoleInitDefault((u16*)SCREEN_BASE_BLOCK(2), (u16*)CHAR_BASE_BLOCK(0), 16); - consolePrintSet(0, 23); - - if (!displayModeIs8Bit) { + } else { for (int r = 0; r < 32 * 32; r++) { - ((u16 *) SCREEN_BASE_BLOCK(2))[r] = buffer[r]; + buffer[r] = ((u16 *) SCREEN_BASE_BLOCK(2))[r]; } -// dmaCopyHalfWords(3, (u16 *) SCREEN_BASE_BLOCK(0), buffer, 32 * 32 * 2); } displayModeIs8Bit = true; @@ -618,16 +619,42 @@ void displayMode8Bit() { SUB_BG3_CR = BG_BMP8_512x256; SUB_BG3_XDX = (int) (subScreenWidth / 256.0f * 256); - SUB_BG3_XDY = 0; - SUB_BG3_YDX = 0; - SUB_BG3_YDY = (int) (subScreenHeight / 192.0f * 256); + SUB_BG3_XDY = 0; + SUB_BG3_YDX = 0; + SUB_BG3_YDY = (int) (subScreenHeight / 192.0f * 256); + + + + if (consoleEnable) + { + consoleInit(NULL, 0, BgType_Text4bpp, BgSize_T_256x256, 2, 0, true); + + // Move the cursor to the bottom of the screen using ANSI escape code + consolePrintf("\033[23;0f"); + } +// consoleInitDefault((u16*)SCREEN_BASE_BLOCK(2), (u16*)CHAR_BASE_BLOCK(0), 16); +// consoleSetWindow(NULL, 0, 0, 32, 24); +// consolePrintSet(0, 23); +/* while (1) { + printf("Hello world"); + }*/ + for (int r = 0; r < 32 * 32; r++) { + ((u16 *) SCREEN_BASE_BLOCK(2))[r] = buffer[r]; +// dmaCopyHalfWords(3, (u16 *) SCREEN_BASE_BLOCK(0), buffer, 32 * 32 * 2); + } + + // ConsoleInit destroys the hardware palette :-( + OSystem_DS::instance()->restoreHardwarePalette(); + +// BG_PALETTE_SUB[255] = RGB15(31,31,31);//by default font will be rendered with color 255 + // Do text stuff // console chars at 1C000 (7), map at 1D000 (74) - BG0_CR = BG_MAP_BASE(2) | BG_TILE_BASE(0); - BG0_Y0 = 0; +// BG0_CR = BG_MAP_BASE(2) | BG_TILE_BASE(0); +// BG0_Y0 = 0; // Restore palette entry used by text in the front-end // PALETTE_SUB[255] = savedPalEntry255; @@ -635,7 +662,6 @@ void displayMode8Bit() { - initGame(); #ifdef HEAVY_LOGGING consolePrintf("done\n"); @@ -808,9 +834,11 @@ void displayMode16Bit() { releaseAllKeys(); - if (displayModeIs8Bit) { -// static int test = 0; -// consolePrintf("saving buffer... %d\n", test++); + if (!displayModeIs8Bit) { + for (int r = 0; r < 32 * 32; r++) { + buffer[r] = ((u16 *) SCREEN_BASE_BLOCK_SUB(4))[r]; + } + } else { saveGameBackBuffer(); for (int r = 0; r < 32 * 32; r++) { buffer[r] = ((u16 *) SCREEN_BASE_BLOCK(2))[r]; @@ -833,24 +861,24 @@ void displayMode16Bit() { memset(BG_GFX, 0, 512 * 256 * 2); - savedPalEntry255 = PALETTE_SUB[255]; - PALETTE_SUB[255] = RGB15(31,31,31);//by default font will be rendered with color 255 + savedPalEntry255 = BG_PALETTE_SUB[255]; + BG_PALETTE_SUB[255] = RGB15(31,31,31);//by default font will be rendered with color 255 // Do text stuff SUB_BG0_CR = BG_MAP_BASE(4) | BG_TILE_BASE(0); SUB_BG0_Y0 = 0; - consoleInitDefault((u16*)SCREEN_BASE_BLOCK_SUB(4), (u16*)CHAR_BASE_BLOCK_SUB(0), 16); + consoleInit(NULL, 0, BgType_Text4bpp, BgSize_T_256x256, 4, 0, false); +// consoleInitDefault((u16*)SCREEN_BASE_BLOCK_SUB(4), (u16*)CHAR_BASE_BLOCK_SUB(0), 16); - if (displayModeIs8Bit) { - //dmaCopyHalfWords(3, (u16 *) SCREEN_BASE_BLOCK_SUB(0), buffer, 32 * 32 * 2); - for (int r = 0; r < 32 * 32; r++) { - ((u16 *) SCREEN_BASE_BLOCK_SUB(4))[r] = buffer[r]; - } + for (int r = 0; r < 32 * 32; r++) { + ((u16 *) SCREEN_BASE_BLOCK_SUB(4))[r] = buffer[r]; } - consolePrintSet(0, 23); - consolePrintf("\n"); + consoleSetWindow(NULL, 0, 0, 32, 24); +// consolePrintSet(0, 23); +// consolePrintf("Hello world!\n\n"); +// consolePrintf("\n"); // Show keyboard SUB_BG1_CR = BG_TILE_BASE(1) | BG_MAP_BASE(12); @@ -860,15 +888,20 @@ void displayMode16Bit() { displayModeIs8Bit = false; + // ConsoleInit destroys the hardware palette :-( + OSystem_DS::instance()->restoreHardwarePalette(); + BG3_XDX = isCpuScalerEnabled() ? 256 : (int) (1.25f * 256); - BG3_XDY = 0; - BG3_YDX = 0; - BG3_YDY = (int) ((200.0f / 192.0f) * 256); + BG3_XDY = 0; + BG3_YDX = 0; + BG3_YDY = (int) ((200.0f / 192.0f) * 256); #ifdef HEAVY_LOGGING consolePrintf("done\n"); #endif + BG_PALETTE_SUB[255] = RGB15(31,31,31);//by default font will be rendered with color 255 + } @@ -1470,6 +1503,7 @@ void addEventsToQueue() { if ((!getIndyFightState()) && (getKeysDown() & KEY_Y)) { consoleEnable = !consoleEnable; + consolePrintf("Console enable: %d\n", consoleEnable); if (displayModeIs8Bit) { displayMode8Bit(); } else { @@ -1536,10 +1570,28 @@ void addEventsToQueue() { } - if ((getKeysDown() & KEY_SELECT)) { - //scaledMode = !scaledMode; - //scY = 4; - showOptionsDialog(); + + static int selectHoldCount = 0; + static const int SELECT_HOLD_TIME = 60; + + if ((getKeysHeld() & KEY_SELECT)) { + selectHoldCount++; + + if (selectHoldCount == SELECT_HOLD_TIME) { + // Hold select down for one second - show GMM + g_engine->openMainMenuDialog(); + } + } else { + selectHoldCount = 0; + } + + + + if (getKeysReleased() & KEY_SELECT) { + if (selectHoldCount < SELECT_HOLD_TIME) { + // Just pressed select - show DS options screen + showOptionsDialog(); + } } @@ -1654,6 +1706,7 @@ void addEventsToQueue() { if ((getKeysChanged() & KEY_START)) { + event.kbd.flags = 0; event.type = getKeyEvent(KEY_START); if (currentGame->control == CONT_FUTURE_WARS) { event.kbd.keycode = Common::KEYCODE_F10; @@ -1670,7 +1723,6 @@ void addEventsToQueue() { event.kbd.ascii = Common::ASCII_F5; // consolePrintf("!!!!!F5!!!!!"); } - event.kbd.flags = 0; system->addEvent(event); } @@ -1780,6 +1832,13 @@ void soundBufferEmptyHandler() { // bufferFirstHalf = true; } +// TIMER0 + if ((callback) && (callbackTimer > 0)) { + callbackTimer--; + } + currentTimeMillis++; +// TIMER0 end + soundHiPart = !soundHiPart; } @@ -1879,16 +1938,22 @@ void VBlankHandler(void) { // } //consolePrintf("X:%d Y:%d\n", getPenX(), getPenY()); - - static bool firstTime = true; +/* + if ((callback) && (callbackTimer > 0)) { + callbackTimer--; + } + currentTimeMillis++; +*/ +/* static int firstTime = 1; // This is to ensure that the ARM7 vblank handler runs before this one. // Fixes the problem with the MMD when the screens swap over on load. - if (firstTime) { - firstTime = false; + if (firstTime > 0) { + REG_IF = IRQ_VBLANK; + firstTime--; return; } - +*/ IPC->tweak = tweak; soundUpdate(); @@ -2165,7 +2230,7 @@ void VBlankHandler(void) { updateOAM(); //PALETTE[0] = RGB15(0, 0, 0); - REG_IF = IRQ_VBLANK; + //REG_IF = IRQ_VBLANK; } int getMillis() { @@ -2181,13 +2246,17 @@ void setTimerCallback(OSystem_DS::TimerProc proc, int interval) { } void timerTickHandler() { - REG_IF = IRQ_TIMER0; +// REG_IF = IRQ_TIMER0; if ((callback) && (callbackTimer > 0)) { callbackTimer--; } currentTimeMillis++; } + + + + void setTalkPos(int x, int y) { // if (gameID != Scumm::GID_SAMNMAX) { // setTopScreenTarget(x, 0); @@ -2238,7 +2307,7 @@ void initHardware() { penInit(); - powerON(POWER_ALL); + powerOn(POWER_ALL); /* vramSetBankA(VRAM_A_MAIN_BG); vramSetBankB(VRAM_B_MAIN_BG); vramSetBankC(VRAM_C_SUB_BG); */ @@ -2257,17 +2326,17 @@ void initHardware() { for (int r = 0; r < 255; r++) { - PALETTE[r] = 0; + BG_PALETTE[r] = 0; } - PALETTE[255] = RGB15(0,31,0); + BG_PALETTE[255] = RGB15(0,31,0); for (int r = 0; r < 255; r++) { - PALETTE_SUB[r] = 0; + BG_PALETTE_SUB[r] = 0; } - PALETTE_SUB[255] = RGB15(0,31,0); + BG_PALETTE_SUB[255] = RGB15(0,31,0); // Allocate save buffer for game screen // savedBuffer = new u8[320 * 200]; @@ -2295,7 +2364,7 @@ void initHardware() { //BG0_CR = BG_MAP_BASE(0) | BG_TILE_BASE(1); // BG0_Y0 = 48; - PALETTE[255] = RGB15(31,31,31);//by default font will be rendered with color 255 + BG_PALETTE[255] = RGB15(31,31,31);//by default font will be rendered with color 255 //consoleInit() is a lot more flexible but this gets you up and running quick // consoleInitDefault((u16*)SCREEN_BASE_BLOCK(0), (u16*)CHAR_BASE_BLOCK(1), 16); @@ -2303,14 +2372,14 @@ void initHardware() { //irqs are nice irqInit(); -// irqInitHandler(); + irqInitHandler(OurIntrMain); irqSet(IRQ_VBLANK, VBlankHandler); irqSet(IRQ_TIMER0, timerTickHandler); irqSet(IRQ_TIMER2, soundBufferEmptyHandler); irqEnable(IRQ_VBLANK); irqEnable(IRQ_TIMER0); - irqEnable(IRQ_TIMER2); +// irqEnable(IRQ_TIMER2); #ifdef USE_PROFILER irqSet(IRQ_HBLANK, hBlankHandler); @@ -2330,7 +2399,7 @@ void initHardware() { consolePrintf("done\n"); #endif - PALETTE[255] = RGB15(0,0,31); + BG_PALETTE[255] = RGB15(0,0,31); initSprites(); @@ -2682,17 +2751,15 @@ gameListType* getCurrentGame() { /////////////////// #define FAST_RAM_SIZE (24000) - u8* fastRamPointer; u8 fastRamData[FAST_RAM_SIZE] ITCM_DATA; void* fastRamAlloc(int size) { -// return malloc(size); void* result = (void *) fastRamPointer; fastRamPointer += size; if(fastRamPointer > fastRamData + FAST_RAM_SIZE) { consolePrintf("FastRam (ITCM) allocation failed!\n"); - return NULL; + return malloc(size); } return result; } @@ -2839,7 +2906,7 @@ void powerOff() { void dsExceptionHandler() { consolePrintf("Blue screen of death"); setExceptionHandler(NULL); - + while(1); u32 currentMode = getCPSR() & 0x1f; u32 thumbState = ((*(u32*)0x027FFD90) & 0x20); @@ -2875,10 +2942,10 @@ void dsExceptionHandler() { registerNames[i], exceptionRegisters[i], registerNames[i+8],exceptionRegisters[i+8]); } -// u32 *stack = (u32 *)exceptionRegisters[13]; -// for ( i=0; i<10; i++ ) { -// consolePrintf( "\x1b[%d;2H%08X: %08X %08X", i + 14, (u32)&stack[i*2],stack[i*2], stack[(i*2)+1] ); -// } + u32 *stack = (u32 *)exceptionRegisters[13]; + for ( i=0; i<10; i++ ) { + consolePrintf("%08X %08X %08X\n", stack[i*3], stack[i*3+1], stack[(i*3)+2] ); + } memoryReport(); @@ -2978,7 +3045,7 @@ int main(void) { consolePrintf("-------------------------------\n"); consolePrintf("ScummVM DS\n"); consolePrintf("Ported by Neil Millstone\n"); - consolePrintf("Version 0.13.0 SVN "); + consolePrintf("Version 0.13.1 beta1 "); #if defined(DS_BUILD_A) consolePrintf("build A\n"); consolePrintf("Lucasarts SCUMM games (SCUMM)\n"); diff --git a/backends/platform/ds/arm9/source/dsmain.h b/backends/platform/ds/arm9/source/dsmain.h index 7efd4a9365..49501a1fdf 100644 --- a/backends/platform/ds/arm9/source/dsmain.h +++ b/backends/platform/ds/arm9/source/dsmain.h @@ -25,7 +25,6 @@ #include <nds.h> #include "osystem_ds.h" -#include "scummconsole.h" #include "NDS/scummvm_ipc.h" namespace DS { diff --git a/backends/platform/ds/arm9/source/dsoptions.cpp b/backends/platform/ds/arm9/source/dsoptions.cpp index 38d28bcb53..52027f3a15 100644 --- a/backends/platform/ds/arm9/source/dsoptions.cpp +++ b/backends/platform/ds/arm9/source/dsoptions.cpp @@ -52,7 +52,9 @@ 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'); - _tab = new GUI::TabWidget(this, 5, 5, 300, 230 - 20 - 40 - 10); + new GUI::ButtonWidget(this, 320 - 10 - 130, 170, 120, 16, "ScummVM Main Menu", 0x40000000, 'M'); + + _tab = new GUI::TabWidget(this, 10, 5, 300, 230 - 20 - 40 - 20); _tab->addTab("Controls"); @@ -264,8 +266,8 @@ void DSOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint } - if ((!guard) && (_radioButtonMode)) - { + + if ((!guard) && (_radioButtonMode)) { guard = true; if ((sender == _touchPadStyle) && (cmd == 0x20000001)) { @@ -332,30 +334,17 @@ void DSOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint updateConfigManager(); close(); } -} - -void togglePause() { - // Toggle pause mode by simulating pressing 'p'. Not a good way of doing things! - // FIXME: What is this code meant to do ?!? - if (getCurrentGame()->control == CONT_SCUMM_ORIGINAL) { - Common::Event event; - OSystem_DS* system = OSystem_DS::instance(); - - event.type = Common::EVENT_KEYDOWN; - event.kbd.keycode = Common::KEYCODE_p; - event.kbd.ascii = 'p'; - event.kbd.flags = 0; - system->addEvent(event); - - event.type = Common::EVENT_KEYUP; - system->addEvent(event); + + if ((!guard) && (cmd == 0x40000000)) { + close(); + g_engine->openMainMenuDialog(); } } + void showOptionsDialog() { - togglePause(); DS::displayMode16Bit(); @@ -366,7 +355,6 @@ void showOptionsDialog() { DS::displayMode8Bit(); - togglePause(); } void setOptions() { diff --git a/backends/platform/ds/arm9/source/dsoptions.h b/backends/platform/ds/arm9/source/dsoptions.h index 229b27ebbb..d29dd9d8ac 100644 --- a/backends/platform/ds/arm9/source/dsoptions.h +++ b/backends/platform/ds/arm9/source/dsoptions.h @@ -44,7 +44,6 @@ public: protected: virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data); - void togglePause(); void updateConfigManager(); GUI::TabWidget* _tab; diff --git a/backends/platform/ds/arm9/source/fat/disc_io.c b/backends/platform/ds/arm9/source/fat/disc_io.c index 9a65812f89..5896cbb750 100644 --- a/backends/platform/ds/arm9/source/fat/disc_io.c +++ b/backends/platform/ds/arm9/source/fat/disc_io.c @@ -33,7 +33,6 @@ #endif #include "disc_io.h" -#include "scummconsole.h" // Include known io-interfaces: diff --git a/backends/platform/ds/arm9/source/interrupt.s b/backends/platform/ds/arm9/source/interrupt.s new file mode 100644 index 0000000000..e04a5c686b --- /dev/null +++ b/backends/platform/ds/arm9/source/interrupt.s @@ -0,0 +1,154 @@ +/*--------------------------------------------------------------------------------- + $Id: interruptDispatcher.s,v 1.10 2007/08/11 06:00:23 wntrmute Exp $ + + Copyright (C) 2005 + Dave Murphy (WinterMute) + + 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. + + $Log: interruptDispatcher.s,v $ + Revision 1.10 2007/08/11 06:00:23 wntrmute + make nesting really work + + Revision 1.9 2007/01/10 15:48:27 wntrmute + remove unused code + + Revision 1.8 2006/12/16 09:10:02 wntrmute + acknowledge interrupt before calling handler + + Revision 1.7 2006/04/26 05:11:31 wntrmute + rebase dtcm, take __irq_flags and __irq_vector from linker script + move arm7 irq vector & irq flags to actual locations + + Revision 1.6 2006/04/23 18:19:15 wntrmute + reworked interrupt code to allow dtcm moving + + Revision 1.5 2005/12/12 13:01:55 wntrmute + disable interrupts on return from user handler + + Revision 1.4 2005/10/21 22:43:42 wntrmute + restore REG_IME on exit from null handler + + Revision 1.3 2005/09/27 18:21:53 wntrmute + safer nested interrupt support + + Revision 1.2 2005/09/04 16:37:01 wntrmute + check for NULL handler + + Revision 1.1 2005/09/03 17:09:35 wntrmute + added interworking aware interrupt dispatcher + + +---------------------------------------------------------------------------------*/ + +#ifdef ARM7 + .text +#endif + +#ifdef ARM9 + .section .itcm,"ax",%progbits +#endif + + .extern irqTable + .code 32 + + .global OurIntrMain +@--------------------------------------------------------------------------------- +OurIntrMain: +@--------------------------------------------------------------------------------- + mov r3, #0x4000000 @ REG_BASE + + ldr r1, [r3, #0x208] @ r1 = IME + str r3, [r3, #0x208] @ disable IME + mrs r0, spsr + stmfd sp!, {r0-r1,r3,lr} @ {spsr, IME, REG_BASE, lr_irq} + + ldr r1, [r3,#0x210] @ REG_IE + ldr r2, [r3,#0x214] @ REG_IF + and r1,r1,r2 + + ldr r0,=__irq_flags @ defined by linker script + + ldr r2,[r0] + orr r2,r2,r1 + str r2,[r0] + + ldr r2,=irqTable +@--------------------------------------------------------------------------------- +findIRQ: +@--------------------------------------------------------------------------------- + ldr r0, [r2, #4] + cmp r0,#0 + beq no_handler + ands r0, r0, r1 + bne jump_intr + add r2, r2, #8 + b findIRQ + +@--------------------------------------------------------------------------------- +no_handler: +@--------------------------------------------------------------------------------- + str r1, [r3, #0x0214] @ IF Clear + ldmfd sp!, {r0-r1,r3,lr} @ {spsr, IME, REG_BASE, lr_irq} + str r1, [r3, #0x208] @ restore REG_IME + mov pc,lr + +@--------------------------------------------------------------------------------- +jump_intr: +@--------------------------------------------------------------------------------- + ldr r1, [r2] @ user IRQ handler address + cmp r1, #0 + bne got_handler + mov r1, r0 + b no_handler +@--------------------------------------------------------------------------------- +got_handler: +@--------------------------------------------------------------------------------- + + mrs r2, cpsr + bic r2, r2, #0xdf @ \__ + orr r2, r2, #0x1f @ / --> Enable IRQ & FIQ. Set CPU mode to System. + msr cpsr,r2 + + str r0, [r3, #0x0214] @ IF Clear + + sub r13,r13,#256 + push {lr} + adr lr, IntrRet + bx r1 + +@--------------------------------------------------------------------------------- +IntrRet: +@--------------------------------------------------------------------------------- + mov r3, #0x4000000 @ REG_BASE + str r3, [r3, #0x208] @ disable IME + pop {lr} + add r13,r13,#256 + + mrs r3, cpsr + bic r3, r3, #0xdf @ \__ + orr r3, r3, #0x92 @ / --> Disable IRQ. Enable FIQ. Set CPU mode to IRQ. + msr cpsr, r3 + + ldmfd sp!, {r0-r1,r3,lr} @ {spsr, IME, REG_BASE, lr_irq} + msr spsr, r0 @ restore spsr + str r1, [r3, #0x208] @ restore REG_IME + mov pc,lr + + .pool + .end diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp index 992124dd73..057e107bb6 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.cpp +++ b/backends/platform/ds/arm9/source/osystem_ds.cpp @@ -156,7 +156,7 @@ void OSystem_DS::setPalette(const byte *colors, uint start, uint num) { green >>= 3; blue >>= 3; -// if (r != 255) + //if (r != 255) { u16 paletteValue = red | (green << 5) | (blue << 10); @@ -175,6 +175,19 @@ void OSystem_DS::setPalette(const byte *colors, uint start, uint num) { } } +void OSystem_DS::restoreHardwarePalette() +{ + // Set the hardware palette up based on the stored palette + + for (int r = 0; r < 255; r++) { + BG_PALETTE[r] = _palette[r]; + + if (!DS::getKeyboardEnable()) { + BG_PALETTE_SUB[r] = _palette[r]; + } + } +} + void OSystem_DS::setCursorPalette(const byte *colors, uint start, uint num) { // consolePrintf("Cursor palette set: start: %d, cols: %d\n", start, num); @@ -213,13 +226,14 @@ bool OSystem_DS::grabRawScreen(Graphics::Surface* surf) { return true; } -void OSystem_DS::grabPalette(unsigned char *colors, uint start, uint num) { +void OSystem_DS::grabPalette(unsigned char *colours, uint start, uint num) { // consolePrintf("Grabpalette"); for (unsigned int r = start; r < start + num; r++) { - *colors++ = (BG_PALETTE[r] & 0x001F) << 3; - *colors++ = (BG_PALETTE[r] & 0x03E0) >> 5 << 3; - *colors++ = (BG_PALETTE[r] & 0x7C00) >> 10 << 3; + *colours++ = (BG_PALETTE[r] & 0x001F) << 3; + *colours++ = (BG_PALETTE[r] & 0x03E0) >> 5 << 3; + *colours++ = (BG_PALETTE[r] & 0x7C00) >> 10 << 3; + colours++; } } @@ -248,12 +262,21 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int stride = DS::get8BitBackBufferStride(); } + if (((pitch & 1) != 0) || ((w & 1) != 0) || (((int) (buf) & 1) != 0)) { // Something is misaligned, so we have to use the slow but sure method int by = 0; + if (DS::getKeyboardEnable()) { + // When they keyboard is on screen, we don't update the subscreen because + // the keyboard image uses the same VRAM addresses. In order to do this, + // I'm going to update the main screen twice. This avoids putting a compare + // in the loop and slowing down the common case. + bgSub = bg; + } + for (int dy = y; dy < y + h; dy++) { u8* dest = ((u8 *) (bg)) + (dy * stride) + x; u8* destSub = ((u8 *) (bgSub)) + (dy * 512) + x; @@ -395,8 +418,19 @@ void OSystem_DS::clearOverlay() { // consolePrintf("clearovl\n"); } -void OSystem_DS::grabOverlay(OverlayColor *buf, int pitch) { -// consolePrintf("grabovl\n"); +void OSystem_DS::grabOverlay(OverlayColor* buf, int pitch) { +// consolePrintf("grabovl\n") + u16* start = DS::get16BitBackBuffer(); + + for (int y = 0; y < 200; y++) { + u16* src = start + (y * 320); + u16* dest = ((u16 *) (buf)) + (y * pitch); + + for (int x = 0; x < 320; x++) { + *dest++ = *src++; + } + } + } void OSystem_DS::copyRectToOverlay(const OverlayColor *buf, int pitch, int x, int y, int w, int h) { diff --git a/backends/platform/ds/arm9/source/osystem_ds.h b/backends/platform/ds/arm9/source/osystem_ds.h index b5802803d0..5a26a25c8b 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.h +++ b/backends/platform/ds/arm9/source/osystem_ds.h @@ -93,6 +93,7 @@ public: virtual int16 getWidth(); virtual void setPalette(const byte *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); virtual void updateScreen(); diff --git a/backends/platform/ds/arm9/source/portdefs.h b/backends/platform/ds/arm9/source/portdefs.h index 58d4df9020..7f22709206 100644 --- a/backends/platform/ds/arm9/source/portdefs.h +++ b/backends/platform/ds/arm9/source/portdefs.h @@ -38,6 +38,7 @@ typedef signed int s32; #include "nds/jtypes.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. #include <stdio.h> @@ -51,6 +52,8 @@ typedef signed int s32; #define CT_NO_TRANSPARENCY +#define DISABLE_TEXT_CONSOLE +#define DISABLE_COMMAND_LINE #ifdef __cplusplus extern "C" { @@ -64,6 +67,8 @@ int consolePrintf(const char* s, ...); //#define assert(expr) consolePrintf("Asserted!") #define NO_DEBUG_MSGS +#define consolePrintf iprintf + #ifdef assert #undef assert #endif diff --git a/backends/platform/ds/arm9/source/scummconsole.c b/backends/platform/ds/arm9/source/scummconsole.c deleted file mode 100644 index aafa0f7744..0000000000 --- a/backends/platform/ds/arm9/source/scummconsole.c +++ /dev/null @@ -1,568 +0,0 @@ -////////////////////////////////////////////////////////////////////// -// -// console.cpp -- provides basic print functionality -// -// version 0.1, February 14, 2005 -// -// Copyright (C) 2005 Michael Noland (joat) and Jason Rogers (dovoto) -// -// 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. -// -// Changelog: -// 0.1: First version -// 0.2: Fixed sprite mapping bug. 1D mapping should work now. -// Changed some register defines for consistency. -// -////////////////////////////////////////////////////////////////////// - - -#include <nds.h> -#include "scummconsole.h" - -#include <stdarg.h> - -#include <default_font_bin.h> - -///////////////////////////////////////// -//global console variables - -#define CONSOLE_WIDTH 32 -#define CONSOLE_HEIGHT 24 -#define TAB_SIZE 3 - -//map to print to -u16* fontMap; - -//location of cursor -u8 row, col; - -//font may not start on a character base boundry -u16 fontOffset; - -//the first character in the set (0 if you have a full set) -u16 fontStart; - -//the 16-color palette to use -u16 fontPal; - - - - -/////////////////////////////////////////////////////////// -//consoleInit -// param: -// font: 16 color font -// charBase: the location the font data will be loaded to -// numCharacters: count of characters in the font -// charStart: The ascii number of the first character in the font set -// if you have a full set this will be zero -// map: pointer to the map you will be printing to. -// pal: specifies the 16 color palette to use, if > 15 it will change all non-zero -// entries in the font to use palette index 255 -void consoleInit(u16* font, u16* charBase, u16 numCharacters, u8 charStart, u16* map, u8 pal, u8 bitDepth) -{ - int i; - - row = col = 0; - - fontStart = charStart; - - fontOffset = 0; - - fontMap = map; - - if(bitDepth == 16) - { - if(pal < 16) - { - fontPal = pal << 12; - - for (i = 0; i < numCharacters * 16; i++) - charBase[i] = font[i]; - } - else - { - fontPal = 15 << 12; - - for (i = 0; i < numCharacters * 16; i++) - { - u16 temp = 0; - - if(font[i] & 0xF) - temp |= 0xF; - if(font[i] & 0xF0) - temp |= 0xF0; - if(font[i] & 0xF00) - temp |= 0xF00; - if(font[i] & 0xF000) - temp |= 0xF000; - - charBase[i] = temp; - } - } - }//end if bitdepth - else - { - fontPal = 0; - for(i = 0; i < numCharacters * 16; i++) - { - u32 temp = 0; - - if(font[i] & 0xF) - temp = 255; - if(font[i] & 0xF0) - temp |= 255 << 8; - if(font[i] & 0xF00) - temp |= 255 << 16; - if(font[i] & 0xF000) - temp |= 255 << 24; - - ((u32*)charBase)[i] = temp; - - } - } -} - -void consoleInitDefault(u16* map, u16* charBase, u8 bitDepth) -{ - consoleInit((u16 *) default_font_bin, charBase, 128, 0, map, CONSOLE_USE_COLOR255, bitDepth); -} - -void consolePrintSet(int x, int y) -{ - if(y < CONSOLE_HEIGHT) - row = y; - else - row = CONSOLE_HEIGHT - 1; - - if(x < CONSOLE_WIDTH) - col = x; - else - col = CONSOLE_WIDTH - 1; -} - -void consolePrintChar(char c) -{ - int i; - - if(col >= CONSOLE_WIDTH) - { - col = 0; - - row++; - } - - if(row >= CONSOLE_HEIGHT) - { - row--; - - for(i = CONSOLE_WIDTH; i < CONSOLE_HEIGHT * CONSOLE_WIDTH; i++) - fontMap[i - CONSOLE_WIDTH] = fontMap[i]; - for(i = 0; i < CONSOLE_WIDTH; i++) - fontMap[i + (CONSOLE_HEIGHT-1)*CONSOLE_WIDTH] = fontPal | (u16)(' ' + fontOffset - fontStart); - - - } - - switch(c) - { - - case 10: - case 11: - case 12: - case 13: - row++; - col = 0; - break; - case 9: - col += TAB_SIZE; - break; - default: - fontMap[col + row * CONSOLE_WIDTH] = fontPal | (u16)(c + fontOffset - fontStart); - col++; - break; - - } - - -} - - -void printX(int w, unsigned d) -{ - int loop = 0; - int i = 0; - - char buf[20] = {0}; - - - while(d > 0) - { - buf[loop++] = d & 0xF; - d = d>>4; - } - - for (i = 7; i >= 0; i--) - { - if(buf[i] || i < loop) - { - if(buf[i] < 10) - consolePrintChar(buf[i] + '0'); - else - consolePrintChar(buf[i] + 'A' - 10); - } - else if(i < w) - consolePrintChar(' '); - } -} - -void printx(int w, unsigned int d) -{ - int loop = 0; - int i = 0; - - char buf[20] = {0}; - - while(d > 0) - { - buf[loop++] = d & 0xF; - d = d>>4; - } - - for (i = 7; i >= 0; i--) - { - if(buf[i] || i < loop) - { - if(buf[i] < 10) - consolePrintChar(buf[i] + '0'); - else - consolePrintChar(buf[i] + 'a' - 10); - } - else if(i < w) - consolePrintChar(' '); - } -} - -void printInt(int w, int d) -{ - int loop = 0; - int i = 0; - - char buf[20] = {0}; - - if(d < 0) - { - consolePrintChar('-'); - d *= -1; - } - - if (d == 0) - buf[loop++] = 0; - else while (d > 0) - { - buf[loop++] = d % 10; - d /= 10; - } - - for (i = 7; i >= 0; i--) - { - if(buf[i] || i < loop) - consolePrintChar(buf[i] + '0'); - else if(i < w) - consolePrintChar(' '); - } -} - -void printBin(int w, int d) -{ - int i; - int first = 0; - for (i = 31; i >= 0; i--) - { - if(d & BIT(i)) - { - first = 1; - consolePrintChar('1'); - } - else if (first || i == 0) - consolePrintChar('0'); - else if (i < w) - consolePrintChar(' '); - } -} - -void print0X(int w, unsigned d) -{ - int loop = 0; - int i = 0; - - char buf[] = {0,0,0,0,0,0,0,0}; //set to zero cause I may add formatted output someday - - - while(d > 0) - { - buf[loop++] = d & 0xF; - d = d>>4; - } - - for (i = 7; i >= 0; i--) - { - if(buf[i] || i < w || i < loop) - { - if(buf[i] < 10) - consolePrintChar(buf[i] + '0'); - else - consolePrintChar(buf[i] + 'A' - 10); - } - } -} - -void print0x(int w, unsigned int d) -{ - int loop = 0; - int i = 0; - - char buf[] = {0,0,0,0,0,0,0,0}; //set to zero cause I may add formatted output someday - - - while(d > 0) - { - buf[loop++] = d & 0xF; - d = d>>4; - } - - for (i = 7; i >= 0; i--) - { - if(buf[i] || i < w || i < loop) - { - if(buf[i] < 10) - consolePrintChar(buf[i] + '0'); - else - consolePrintChar(buf[i] + 'a' - 10); - } - } -} - -void print0Int(int w, int d) -{ - int loop = 0; - int i = 0; - - char buf[] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; //set to zero cause I may add formatted output someday - - if(d < 0) - { - consolePrintChar('-'); - d *= -1; - } - - while(d > 0) - { - buf[loop++] = d % 10; - d /= 10; - } - - for (i = 15; i >= 0; i--) - if(buf[i] || i < w || i < loop) - consolePrintChar(buf[i] + '0'); - -} - -void print0Bin(int w, int d) -{ - int i; - int first = 0; - for (i = 31; i >= 0; i--) - { - if(d & BIT(i)) - { - first = 1; - consolePrintChar('1'); - } - else if (first || i == 0) - consolePrintChar('0'); - else if (i < w) - consolePrintChar('0'); - } -} - -void print(const char* s) -{ - for(; *s; s++) consolePrintChar(*s); -} - -void printF(int w, float f) -{ - unsigned int* t = (unsigned int*)&f; - unsigned int fraction = (*t) & 0x007FFFFF; - int exp = ((*t) >> 23) & 0xFF; - - if(*t & BIT(31)) - consolePrintChar('-'); - - - print0Bin(32, fraction); - - printInt(1, fraction); - consolePrintChar('e'); - printInt(1, exp - 127); - - /* - if(exp == 0 && fraction == 0) - { - printInt(1,0); - } - else if(exp == 0xFF && fraction == 0) - { - print("Inifinite"); - } - else - { - printInt(w,fraction); - consolePrintChar('e'); - printInt(1,exp - 127); - } - */ -} - -int consolePrintf(const char* s, ...) -{ - int w = 1, z = 0; - - va_list argp; - - va_start(argp, s); - - - while(*s) - { - w = 1; - z = 0; - - switch(*s) - { - case '%': - s++; - if(*s == '0') - { - z = 1; - s++; - } - if(*s > '0' && *s <= '9') - { - w = *s - '0'; - s++; - } - switch (*s) - { - case 'i': - case 'I': - case 'd': - case 'D': - if(z)print0Int(w, va_arg(argp, int)); - else printInt(w, va_arg(argp, int)); - s++; - break; - case 'X': - if(z)print0X(w, va_arg(argp, int)); - else printX(w, va_arg(argp, int)); - s++; - break; - - case 'x': - if(z)print0x(w, va_arg(argp, int)); - else printx(w, va_arg(argp, int)); - s++; - break; - - case 'b': - case 'B': - if(z)print0Bin(w, va_arg(argp, int)); - else printBin(w, va_arg(argp, int)); - s++; - break; - case 'f': - case 'F': -/* Need to undo our 'all doubles are floats' definition */ -#define TEMP_DEF double -#undef double - printF(w,va_arg(argp, double)); -#define double TEMP_DEF -#undef TEMP_DEF - s++; - break; - case 's': - case 'S': - print(va_arg(argp, char*)); - s++; - break; - default: - consolePrintChar('%'); - break; - } - default: - consolePrintChar(*s); - break; - } - - s++; - } - va_end(argp); - - return 0; -} - -void consolePutString(int x, int y, char* s) -{ - consolePrintSet(x, y); - consolePrintf(s); -} - -void consolePutInt(int x, int y, int d) -{ - consolePrintSet(x,y); - printInt(1,d); -} - -void consolePutX(int x, int y, int d) -{ - consolePrintSet(x, y); - printX(1,d); -} - -void consolePutChar(int x, int y, char c) -{ - consolePrintSet(x, y); - consolePrintChar(c); -} - -void consolePutBin(int x, int y, int b) -{ - consolePrintSet(x, y); - printBin(1,b); -} -void consoleClear(void) -{ - int i = 0; - consolePrintSet(0,0); - - while(i++ < CONSOLE_HEIGHT * CONSOLE_WIDTH) - consolePrintChar(' '); - - consolePrintSet(0,0); -} diff --git a/backends/platform/ds/arm9/source/scummconsole.h b/backends/platform/ds/arm9/source/scummconsole.h deleted file mode 100644 index f7aa30f125..0000000000 --- a/backends/platform/ds/arm9/source/scummconsole.h +++ /dev/null @@ -1,67 +0,0 @@ -////////////////////////////////////////////////////////////////////// -// -// consol.h --provides basic consol type print functionality -// -// version 0.1, February 14, 2005 -// -// Copyright (C) 2005 Michael Noland (joat) and Jason Rogers (dovoto) -// -// 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. -// -// Changelog: -// 0.1: First version -// 0.2: Fixed sprite mapping bug. 1D mapping should work now. -// Changed some register defines for consistency. -// -////////////////////////////////////////////////////////////////////// -#ifndef CONSOLE_H2 -#define CONSOLE_H2 - -#define CONSOLE_USE_COLOR255 16 - -#include "portdefs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -void poo(u8 p); - -void consoleInit(u16* font, u16* charBase, u16 numCharacters, u8 charStart, u16* map, u8 pal, u8 bitDepth); -void consoleInitDefault(u16* map, u16* charBase, u8 bitDepth); - -int consolePrintf(const char* s, ...); - -void consolePrintSet(int x, int y); - -void consolePrintChar(char c); - -void consolePutString(int x, int y, char* s); -void consolePutInt(int x, int y, int d); -void consolePutX(int x, int y, int d); -void consolePutChar(int x, int y, char c); -void consolePutBin(int x, int y, int b); - -void consoleClear(void); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/backends/platform/ds/arm9/source/scummhelp.cpp b/backends/platform/ds/arm9/source/scummhelp.cpp index f9efd58276..e1ddaecc2c 100644 --- a/backends/platform/ds/arm9/source/scummhelp.cpp +++ b/backends/platform/ds/arm9/source/scummhelp.cpp @@ -48,8 +48,8 @@ void updateStrings(byte gameId, byte version, Common::Platform platform, ADD_BIND("A", "Switch screens"); ADD_BIND("Y", "Show/hide debug console"); ADD_BIND("X", "Show/hide keyboard"); - ADD_BIND("L + Pad/Pen", "Scroll current touch screen view"); - ADD_BIND("L + B/A", "Zoom in/out"); + ADD_BIND("L+Pad/Pen", "Scroll current touch screen view"); + ADD_BIND("L+B/A", "Zoom in/out"); break; } @@ -65,13 +65,13 @@ void updateStrings(byte gameId, byte version, Common::Platform platform, ADD_BIND("Pad Up", "Show/hide keyboard"); ADD_BIND("Pad Left", "Show/hide debug console"); ADD_BIND("Pad Right", "Swap screens"); - ADD_BIND("R + Pad/Pen", "Scroll current touch screen view"); - ADD_BIND("R+down/right", "Zoom in/out"); + ADD_BIND("R+Pad/Pen", "Scroll current touch screen view"); + ADD_BIND("R+dwn/rgt", "Zoom in/out"); break; } case 3: { - title = "Indiana Jones Fighting controls:"; + title = "Indiana Jones Fight controls:"; ADD_BIND("Pad Left", "Move left"); ADD_BIND("Pad Right", "Move right"); ADD_BIND("Pad Up", "High guard"); @@ -80,9 +80,6 @@ void updateStrings(byte gameId, byte version, Common::Platform platform, ADD_BIND("X", "Punch high"); ADD_BIND("A", "Punch middle"); ADD_BIND("B", "Punch low"); - - ADD_BIND("L+R", "Hold during bootup to clear SRAM"); - ADD_BIND("", "(flash cart only)"); break; } } diff --git a/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h b/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h index 6a20f775c6..743d158d34 100644 --- a/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h +++ b/backends/platform/ds/commoninclude/NDS/scummvm_ipc.h @@ -33,6 +33,18 @@ ////////////////////////////////////////////////////////////////////// + + +//--------------------------------------------------------------------------------- +typedef struct sTransferSound { +//--------------------------------------------------------------------------------- + TransferSoundData data[16]; + u8 count; + u8 PADDING[3]; +} TransferSound, * pTransferSound; + + + typedef struct _adpcmBuffer { u8* buffer[8]; bool filled[8]; |