diff options
19 files changed, 383 insertions, 146 deletions
diff --git a/backends/platform/ds/Makefile b/backends/platform/ds/Makefile index 46467b9058..58d6fd4c02 100644 --- a/backends/platform/ds/Makefile +++ b/backends/platform/ds/Makefile @@ -38,6 +38,10 @@ allbuilds: $(MAKE) all SCUMM_BUILD=g $(MAKE) semiclean $(MAKE) all SCUMM_BUILD=h + $(MAKE) semiclean + $(MAKE) all SCUMM_BUILD=i + $(MAKE) semiclean + $(MAKE) all SCUMM_BUILD=k allbuildssafe: $(MAKE) clean SCUMM_BUILD=a @@ -56,3 +60,7 @@ allbuildssafe: $(MAKE) all SCUMM_BUILD=g $(MAKE) clean SCUMM_BUILD=h $(MAKE) all SCUMM_BUILD=h + $(MAKE) clean SCUMM_BUILD=i + $(MAKE) all SCUMM_BUILD=i + $(MAKE) clean SCUMM_BUILD=k + $(MAKE) all SCUMM_BUILD=k diff --git a/backends/platform/ds/arm9/Makefile b/backends/platform/ds/arm9/Makefile index 225278d579..86e40c7e2f 100644 --- a/backends/platform/ds/arm9/Makefile +++ b/backends/platform/ds/arm9/Makefile @@ -8,31 +8,38 @@ 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),i) - DS_BUILD_I = 1 +ifeq ($(SCUMM_BUILD),k) + DS_BUILD_K = 1 else - ifeq ($(SCUMM_BUILD),h) - DS_BUILD_H = 1 + ifeq ($(SCUMM_BUILD),j) + DS_BUILD_J = 1 + else + ifeq ($(SCUMM_BUILD),i) + DS_BUILD_I = 1 else - ifeq ($(SCUMM_BUILD),g) - DS_BUILD_G = 1 + ifeq ($(SCUMM_BUILD),h) + DS_BUILD_H = 1 else - ifeq ($(SCUMM_BUILD),f) - DS_BUILD_F = 1 + ifeq ($(SCUMM_BUILD),g) + DS_BUILD_G = 1 else - ifeq ($(SCUMM_BUILD),e) - DS_BUILD_E = 1 + ifeq ($(SCUMM_BUILD),f) + DS_BUILD_F = 1 else - ifeq ($(SCUMM_BUILD),d) - DS_BUILD_D = 1 + ifeq ($(SCUMM_BUILD),e) + DS_BUILD_E = 1 else - ifeq ($(SCUMM_BUILD),c) - DS_BUILD_C = 1 + ifeq ($(SCUMM_BUILD),d) + DS_BUILD_D = 1 else - ifeq ($(SCUMM_BUILD),b) - DS_BUILD_B = 1 + ifeq ($(SCUMM_BUILD),c) + DS_BUILD_C = 1 else - DS_BUILD_A = 1 + ifeq ($(SCUMM_BUILD),b) + DS_BUILD_B = 1 + else + DS_BUILD_A = 1 + endif endif endif endif @@ -41,6 +48,7 @@ else endif endif endif +endif # To do: # - FAT cache? @@ -58,9 +66,18 @@ else # TODO: Inherit the earth uses so much RAM that I have removed libmad in order to # claw some back. + else - USE_MAD = 1 + ifdef DS_BUILD_I + + else + ifdef DS_BUILD_K + + else + USE_MAD = 1 + endif + endif endif endif @@ -150,28 +167,51 @@ endif ifdef DS_BUILD_H DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_H - LOGO = logog.bmp + LOGO = logoh.bmp ENABLE_PARALLACTION = STATIC_PLUGIN 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 + DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_I + LOGO = logoi.bmp + ENABLE_MADE = STATIC_PLUGIN + BUILD=scummvm-I +endif + +ifdef DS_BUILD_K + DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_K + LOGO = logok.bmp + ENABLE_CRUISE = STATIC_PLUGIN + BUILD=scummvm-K endif + +#ifdef DS_BUILD_L +# DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_L +# LOGO = logog.bmp +# ENABLE_DRASCULA = STATIC_PLUGIN +# BUILD=scummvm-K +#endif + +#ifdef DS_BUILD_M +# DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_M +# LOGO = logog.bmp +# ENABLE_TUCKER = STATIC_PLUGIN +# BUILD=scummvm-K +#endif + ARM7BIN := -7 $(CURDIR)/../../arm7/arm7.bin ICON := -b ../../../logo.bmp "ScummVM;By Neil Millstone;" CC = arm-eabi-gcc CXX = arm-eabi-g++ +LD = arm-eabi-g++ CFLAGS = -Wno-multichar -Wall\ -Wno-multichar -mcpu=arm9tdmi -mtune=arm9tdmi \ -mcpu=arm9tdmi -mtune=arm9tdmi -fomit-frame-pointer\ - -mthumb-interwork -DUSE_ARM_COSTUME_ASM=1 + -mthumb-interwork -DUSE_ARM_COSTUME_ASM=1 -DDISABLE_SID # -ffast-math @@ -187,7 +227,7 @@ ifdef USE_PROFILER endif CXXFLAGS= $(CFLAGS) -Wno-non-virtual-dtor -Wno-unknown-pragmas -Wno-reorder \ - -fno-exceptions -fno-rtti -mthumb-interwork -ffunction-sections -fdata-sections + -fno-exceptions -fno-rtti -mthumb-interwork -ffunction-sections -fdata-sections -fno-strict-aliasing # -mthumb @@ -293,12 +333,19 @@ 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 +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 := # Compiler options for files which should be optimised for speed -OPT_SPEED := -O3 -#OPT_SPEED := -Os -mthumb +ifdef DS_BUILD_E +# Another attempt to save some RAM in ITE +OPT_SPEED := -O3 -mthumb +else +#OPT_SPEED := -O3 + +OPT_SPEED := -Os -mthumb + +endif # Compiler options for files which should be optimised for space OPT_SIZE := -Os -mthumb @@ -315,7 +362,7 @@ MODULE_DIRS += . ndsall: @[ -d $(BUILD) ] || mkdir -p $(BUILD) - $(MAKE) -C ./$(BUILD) -f ../Makefile scummvm.nds + make -C ./$(BUILD) -f ../makefile scummvm.nds include $(srcdir)/Makefile.common diff --git a/backends/platform/ds/arm9/source/cdaudio.cpp b/backends/platform/ds/arm9/source/cdaudio.cpp index 140c709a8c..7756286117 100644 --- a/backends/platform/ds/arm9/source/cdaudio.cpp +++ b/backends/platform/ds/arm9/source/cdaudio.cpp @@ -137,18 +137,21 @@ void playTrack(int track, int numLoops, int startFrame, int duration) { char str[100]; - if (path[strlen(path.c_str()) - 1] == '/') { - sprintf(str, "track%d.wav", track); - path = path + str; - } else { - sprintf(str, "/track%d.wav", track); - path = path + str; + if (path[strlen(path.c_str()) - 1] != '/') { + path = path + "/"; } + Common::String fname; - //1820160 + sprintf(str, "track%d.wav", track); + fname = path + str; + file = DS::std_fopen(fname.c_str(), "rb"); - file = DS::std_fopen(path.c_str(), "rb"); + if (!file) { + sprintf(str, "track%02d.wav", track); + fname = path + str; + file = DS::std_fopen(fname.c_str(), "rb"); + } if (!file) { consolePrintf("Failed to open %s!\n", path.c_str()); @@ -158,6 +161,8 @@ void playTrack(int track, int numLoops, int startFrame, int duration) { DS::std_fread((const void *) &waveHeader, sizeof(waveHeader), 1, file); + consolePrintf("File: %s\n", fname.c_str()); + consolePrintf("Playing track %d\n", track); consolePrintf("Format: %d\n", waveHeader.fmtFormatTag); consolePrintf("Rate : %d\n", waveHeader.fmtSamPerSec); @@ -496,6 +501,26 @@ bool trackExists(int num) { setActive(true); DS::std_fclose(file); return true; + } + + sprintf(fname, "track%02d.wav", num); + + path = ConfMan.get("path"); + + if (path[strlen(path.c_str()) - 1] == '/') { + path = path + fname; + } else { + path = path + "/" + fname; + } + + consolePrintf("Looking for %s...", path.c_str()); + + + if ((file = DS::std_fopen(path.c_str(), "r"))) { + consolePrintf("Success!\n"); + setActive(true); + DS::std_fclose(file); + return true; } else { setActive(false); consolePrintf("Failed!\n"); diff --git a/backends/platform/ds/arm9/source/dsmain.cpp b/backends/platform/ds/arm9/source/dsmain.cpp index f959074d49..4132f4b138 100644 --- a/backends/platform/ds/arm9/source/dsmain.cpp +++ b/backends/platform/ds/arm9/source/dsmain.cpp @@ -117,17 +117,20 @@ static const char *registerNames[] = extern "C" void* __real_malloc(size_t size); +int total = 0; + void* operator new (size_t size) { register unsigned int reg asm("lr"); volatile unsigned int poo = reg; void* res = __real_malloc(size); + total += size; if (!res) { // *((u8 *) NULL) = 0; - consolePrintf("Failed alloc (new) %d (%x)\n", size, poo); + consolePrintf("Failed alloc (new) %d (%d)\n", size, total); return NULL; } @@ -155,18 +158,20 @@ extern "C" void* __wrap_malloc(size_t size) { void* res = __real_malloc(size); if (res) { - if (size > 100 * 1024) { - consolePrintf("Allocated %d (%d)\n", size, poo); + if (size > 50 * 1024) { + consolePrintf("Allocated %d (%x)\n", size, poo); } + total += size; return res; } else { // *((u8 *) NULL) = 0; - consolePrintf("Failed alloc %d (%x)\n", size, poo); + consolePrintf("Failed alloc %d (%d)\n", size, total); return NULL; } } + #endif namespace DS { @@ -545,6 +550,22 @@ 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; +} void initGame() { // This is a good time to check for left handed mode since the mode change is done as the game starts. @@ -558,15 +579,18 @@ void initGame() { setOptions(); //strcpy(gameName, ConfMan.getActiveDomain().c_str()); - strcpy(gameName, ConfMan.get("gameid").c_str()); -// consolePrintf("\n\n\n\nCurrent game: '%s' %d\n", gameName, gameName[0]); - - 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); + if (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 + + 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); + } } } @@ -879,6 +903,8 @@ void displayMode16Bit() { releaseAllKeys(); + setKeyboardEnable(false); + if (!displayModeIs8Bit) { for (int r = 0; r < 32 * 32; r++) { buffer[r] = ((u16 *) SCREEN_BASE_BLOCK_SUB(4))[r]; @@ -1326,32 +1352,34 @@ void doScreenTapMode(OSystem_DS* system) right = true; } - - if (getKeysDown() & KEY_LEFT) { - event.type = Common::EVENT_LBUTTONDOWN; - event.mouse = Common::Point(getPenX(), getPenY()); - system->addEvent(event); - } - - if (getKeysReleased() & KEY_LEFT) { - event.type = Common::EVENT_LBUTTONUP; - event.mouse = Common::Point(getPenX(), getPenY()); - system->addEvent(event); - } - - - if (getKeysDown() & KEY_RIGHT) { - event.type = Common::EVENT_RBUTTONDOWN; - event.mouse = Common::Point(getPenX(), getPenY()); - system->addEvent(event); - } - - if (getKeysReleased() & KEY_RIGHT) { - event.type = Common::EVENT_RBUTTONUP; - event.mouse = Common::Point(getPenX(), getPenY()); - system->addEvent(event); + if (!(getKeysHeld() & (KEY_L | KEY_R))) { + + if (getKeysDown() & KEY_LEFT) { + event.type = Common::EVENT_LBUTTONDOWN; + event.mouse = Common::Point(getPenX(), getPenY()); + system->addEvent(event); + } + + if (getKeysReleased() & KEY_LEFT) { + event.type = Common::EVENT_LBUTTONUP; + event.mouse = Common::Point(getPenX(), getPenY()); + system->addEvent(event); + } + + + if (getKeysDown() & KEY_RIGHT) { + event.type = Common::EVENT_RBUTTONDOWN; + event.mouse = Common::Point(getPenX(), getPenY()); + system->addEvent(event); + } + + if (getKeysReleased() & KEY_RIGHT) { + event.type = Common::EVENT_RBUTTONUP; + event.mouse = Common::Point(getPenX(), getPenY()); + system->addEvent(event); + } } - + event.type = Common::EVENT_MOUSEMOVE; event.mouse = Common::Point(getPenX(), getPenY()); system->addEvent(event); @@ -1487,8 +1515,8 @@ void addEventsToQueue() { OSystem_DS* system = OSystem_DS::instance(); Common::Event event; - #ifdef USE_PROFILER +/* if (keysDown() & KEY_R) { cygprofile_begin(); cygprofile_enable(); @@ -1497,9 +1525,11 @@ void addEventsToQueue() { cygprofile_disable(); cygprofile_end(); } +*/ #endif + if (system->isEventQueueEmpty()) { /* @@ -1645,18 +1675,27 @@ void addEventsToQueue() { Common::Event event; - if (!keyboardEnable) { - - if ((tapScreenClicks) && (getIsDisplayMode8Bit())) { + if ((tapScreenClicks) && (getIsDisplayMode8Bit())) { + if ((!keyboardEnable) || (!isInsideKeyboard(penDownX, penDownY))) { doScreenTapMode(system); - } else { + } + } else { + if (!keyboardEnable) { doButtonSelectMode(system); + } else if ((!keyboardEnable) || (!isInsideKeyboard(penDownX, penDownY))) { + doScreenTapMode(system); } + } + + + if (!keyboardEnable) { + if (((!(getKeysHeld() & KEY_L)) && (!(getKeysHeld() & KEY_R)) || (indyFightState)) && (displayModeIs8Bit)) { // Controls specific to the control method + if (currentGame->control == CONT_SKY) { // Extra controls for Beneath a Steel Sky if ((getKeysDown() & KEY_DOWN)) { @@ -1665,6 +1704,26 @@ void addEventsToQueue() { } } + if (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"); + event.type = Common::EVENT_KEYDOWN; + event.kbd.keycode = (Common::KeyCode)'X'; // Skip age test in LSL + event.kbd.ascii = 'X'; + event.kbd.flags = Common::KBD_ALT; + system->addEvent(event); + + event.type = Common::EVENT_KEYUP; + system->addEvent(event); + } + + } + + + if (currentGame->control == CONT_SIMON) { // Extra controls for Simon the Sorcerer if ((getKeysDown() & KEY_DOWN)) { @@ -2019,10 +2078,8 @@ void VBlankHandler(void) { frameCount++; if ((cursorEnable) && (mouseCursorVisible)) { - if (!keyboardEnable) { - storedMouseX = penX; - storedMouseY = penY; - } + storedMouseX = penX; + storedMouseY = penY; if (gameScreenSwap) { setIcon(3, storedMouseX - mouseHotspotX, storedMouseY - mouseHotspotY, 8, 0, true); @@ -2177,20 +2234,20 @@ void VBlankHandler(void) { int offsX = 0, offsY = 0; - if (getKeysHeld() & KEY_LEFT) { - offsX -= 1; + if ((getKeysHeld() & KEY_LEFT)) { + offsX -= 2; } - if (getKeysHeld() & KEY_RIGHT) { - offsX += 1; + if ((getKeysHeld() & KEY_RIGHT)) { + offsX += 2; } - if (getKeysHeld() & KEY_UP) { - offsY -= 1; + if ((getKeysHeld() & KEY_UP)) { + offsY -= 2; } - if (getKeysHeld() & KEY_DOWN) { - offsY += 1; + if ((getKeysHeld() & KEY_DOWN)) { + offsY += 2; } if (((gameScreenSwap) && (getKeysHeld() & KEY_L)) || ((!gameScreenSwap) && (getKeysHeld() & KEY_R))) { @@ -2491,7 +2548,8 @@ void penUpdate() { bool penDownThisFrame = (IPC->touchZ1 > 0) && (IPC->touchXpx > 0) && (IPC->touchYpx > 0); static bool moved = false; - if ((tapScreenClicks) && (!getKeyboardEnable()) && (getIsDisplayMode8Bit())) { + if (( (tapScreenClicks) || getKeyboardEnable() ) && (getIsDisplayMode8Bit())) { + if ((tapTimeout >= 0)) { tapTimeout++; @@ -2506,7 +2564,7 @@ void penUpdate() { if ((penHeld) && (!penDownThisFrame)) { - if ((touchPadStyle) || (moved) || (tapCount == 1)) { + if ((touchPadStyle) || (getKeyboardEnable() && (!isInsideKeyboard(penDownX, penDownY))) || (moved) || (tapCount == 1)) { if ((penDownFrames > 0) && (penDownFrames < 6) && ((tapTimeout == -1) || (tapTimeout > 2))) { tapCount++; tapTimeout = 0; @@ -2518,40 +2576,56 @@ void penUpdate() { } + if ( ((keyboardEnable) || (touchPadStyle)) && (getIsDisplayMode8Bit()) ) { + // Relative positioning mode - if ((touchPadStyle) && (getIsDisplayMode8Bit())) { - - if ((penDownFrames > 0)) { + if ((penDownFrames > 0) ) { if ((penHeld)) { - if (penDownThisFrame) - { + if (penDownThisFrame) { if (penDownFrames >= 2) { - int diffX = IPC->touchXpx - penDownX; - int diffY = IPC->touchYpx - penDownY; - int speed = ABS(diffX) + ABS(diffY); - - if ((ABS(diffX) < 35) && (ABS(diffY) < 35)) - { - - if (speed >= 8) - { - diffX *= ((speed >> 3) * touchPadSensitivity) >> 3; - diffY *= ((speed >> 3) * touchPadSensitivity) >> 3; + if ((!keyboardEnable) || (!isInsideKeyboard(IPC->touchXpx, IPC->touchYpx))) { + int diffX = IPC->touchXpx - penDownX; + int diffY = IPC->touchYpx - penDownY; + + int speed = ABS(diffX) + ABS(diffY); + + if ((ABS(diffX) < 35) && (ABS(diffY) < 35)) { + + if (speed >= 8) { + diffX *= ((speed >> 3) * touchPadSensitivity) >> 3; + diffY *= ((speed >> 3) * touchPadSensitivity) >> 3; + } + + penX += diffX; + penY += diffY; + + if (penX > 255) { + scX -= 255 - penX; + penX = 255; + } + + if (penX < 0) { + scX -= -penX; + penX = 0; + } + + if (penY > 191) { + scY += penY - 191; + penY = 191; + } + + if (penY < 0) { + scY -= -penY; + penY = 0; + } } - - penX += diffX; - penY += diffY; - if (penX > 255) penX = 255; - if (penX < 0) penX = 0; - if (penY > 191) penY = 191; - if (penY < 0) penY = 0; + + // consolePrintf("x: %d y: %d\n", IPC->touchYpx - penDownY, IPC->touchYpx - penDownY); } - -// consolePrintf("x: %d y: %d\n", IPC->touchYpx - penDownY, IPC->touchYpx - penDownY); penDownX = IPC->touchXpx; penDownY = IPC->touchYpx; @@ -2561,7 +2635,6 @@ void penUpdate() { { } - } else { penDown = true; penHeld = true; @@ -2573,7 +2646,6 @@ void penUpdate() { penDownY = IPC->touchYpx; } } - } else { if (penHeld) { penReleased = true; @@ -2585,13 +2657,19 @@ void penUpdate() { penDown = false; penHeld = false; } - } else { + + + } else { // Absolute positioning mode if ((penDownFrames > 1)) { // Is this right? Dunno, but it works for me. if ((penHeld)) { penHeld = true; penDown = false; } else { + if (penDownFrames == 2) { + penDownX = IPC->touchXpx; + penDownY = IPC->touchYpx; + } penDown = true; penHeld = true; penDownSaved = true; @@ -2604,7 +2682,6 @@ void penUpdate() { } - } else { if (penHeld) { penReleased = true; @@ -2616,8 +2693,6 @@ void penUpdate() { penDown = false; penHeld = false; } - - } @@ -2971,13 +3046,17 @@ void dsExceptionHandler() { consolePrintf(" pc: %08X addr: %08X\n\n",codeAddress,exceptionAddress); + int 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); 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] ); } @@ -3007,6 +3086,7 @@ int main(void) { } #endif + // Let arm9 read cartridge *((u16 *) (0x04000204)) &= ~0x0080; @@ -3080,7 +3160,7 @@ int main(void) { consolePrintf("-------------------------------\n"); consolePrintf("ScummVM DS\n"); consolePrintf("Ported by Neil Millstone\n"); - consolePrintf("Version 1.0.0 RC1 "); + consolePrintf("Version 1.0.0 "); #if defined(DS_BUILD_A) consolePrintf("build A\n"); consolePrintf("Lucasarts SCUMM games (SCUMM)\n"); @@ -3105,6 +3185,12 @@ int main(void) { #elif defined(DS_BUILD_H) consolePrintf("build H\n"); consolePrintf("Nippon Safes (PARALLATION)\n"); +#elif defined(DS_BUILD_I) + consolePrintf("build I\n"); + consolePrintf("Activision Games (MADE)\n"); +#elif defined(DS_BUILD_K) + consolePrintf("build K\n"); + consolePrintf("Cruise for a Corpse (Cruise)\n"); #endif consolePrintf("-------------------------------\n"); consolePrintf("L/R + D-pad/pen: Scroll view\n"); @@ -3249,13 +3335,21 @@ int main(void) { const char *argv[] = {"/scummvmds", "--config=scummvmg.ini"}; #elif defined(DS_BUILD_H) const char *argv[] = {"/scummvmds", "--config=scummvmh.ini"}; +#elif defined(DS_BUILD_I) + const char *argv[] = {"/scummvmds", "--config=scummvmi.ini"}; +#elif defined(DS_BUILD_J) + const char *argv[] = {"/scummvmds", "--config=scummvmj.ini"}; +#elif defined(DS_BUILD_K) + const char *argv[] = {"/scummvmds", "--config=scummvmk.ini"}; #endif + while (1) { scummvm_main(ARRAYSIZE(argv), (char **) &argv); powerOff(); } + return 0; } @@ -3273,6 +3367,9 @@ int cygprofile_getHBlanks() __attribute__ ((no_instrument_function)); int cygprofile_getHBlanks() { return DS::hBlankCount; } + + +extern "C" void consolePrintf(char * format, ...) __attribute__ ((no_instrument_function)); #endif diff --git a/backends/platform/ds/arm9/source/dsmain.h b/backends/platform/ds/arm9/source/dsmain.h index 223221d80e..beda592ba2 100644 --- a/backends/platform/ds/arm9/source/dsmain.h +++ b/backends/platform/ds/arm9/source/dsmain.h @@ -68,6 +68,9 @@ 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 @@ -151,7 +154,7 @@ int getGameHeight(); void fastRamReset(); void* fastRamAlloc(int size); - +void exitGame(); gameListType* getCurrentGame(); diff --git a/backends/platform/ds/arm9/source/osystem_ds.cpp b/backends/platform/ds/arm9/source/osystem_ds.cpp index 8ea9b06b23..111f3a888b 100644 --- a/backends/platform/ds/arm9/source/osystem_ds.cpp +++ b/backends/platform/ds/arm9/source/osystem_ds.cpp @@ -60,6 +60,12 @@ #define DEFAULT_CONFIG_FILE "scummvmg.ini" #elif defined(DS_BUILD_H) #define DEFAULT_CONFIG_FILE "scummvmh.ini" +#elif defined(DS_BUILD_I) +#define DEFAULT_CONFIG_FILE "scummvmi.ini" +#elif defined(DS_BUILD_J) +#define DEFAULT_CONFIG_FILE "scummvmj.ini" +#elif defined(DS_BUILD_K) +#define DEFAULT_CONFIG_FILE "scummvmk.ini" #endif OSystem_DS* OSystem_DS::_instance = NULL; @@ -177,7 +183,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); @@ -265,12 +271,13 @@ void OSystem_DS::grabPalette(unsigned char *colours, uint start, uint num) { #define MISALIGNED16(ptr) (((u32) (ptr) & 1) != 0) void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) { - //consolePrintf("Copy rect %d, %d %d, %d ", x, y, w, h); if (!_graphicsEnable) return; if (w <= 1) return; if (h < 0) return; if (!DS::getIsDisplayMode8Bit()) return; +// consolePrintf("CopyRectToScreen %d\n", w * h); + u16* bg; s32 stride; u16* bgSub = (u16 *)BG_GFX_SUB; @@ -452,6 +459,8 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int } void OSystem_DS::updateScreen() { + static int cnt = 0; +// consolePrintf("updatescr %d\n", cnt++); if ((_frameBufferExists) && (DS::getIsDisplayMode8Bit())) { _frameBufferExists = false; @@ -883,6 +892,7 @@ u16 OSystem_DS::applyGamma(u16 colour) { void OSystem_DS::engineDone() { // Scumm games appear not to stop their CD audio, so I stop the CD here. stopCD(); + DS::exitGame(); #ifdef ENABLE_AGI DS::clearAutoCompleteWordList(); diff --git a/backends/platform/ds/arm9/source/touchkeyboard.cpp b/backends/platform/ds/arm9/source/touchkeyboard.cpp index ddf182950d..2d4b6a94f4 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.cpp +++ b/backends/platform/ds/arm9/source/touchkeyboard.cpp @@ -156,6 +156,29 @@ char autoCompleteBuffer[128]; int selectedCompletion = -1; int charactersEntered = 0; +int typingTimeout = 0; + +// Render text onto the tiled screen + +void drawText(int tx, int ty, char* string, bool highlight) { + + u16 baseValue = 0; + + if (highlight) { + baseValue |= 0x1000; + } + + for (int p = 0; *string; string++, p++) { + char c = *string; + + if (c != ' ') { + int tile = c - 33 + (KEYBOARD_DATA_SIZE / 32); + baseAddress[ty * 32 + tx + p] = baseValue | tile; + } + } + +} + void restoreVRAM(int tileBase, int mapBase, u16* saveSpace) { @@ -246,12 +269,16 @@ void drawKeyboard(int tileBase, int mapBase, u16* saveSpace) { keys[r].pressed = false; } + closed = false; clearAutoComplete(); + } + void drawAutoComplete() { + // Clear the auto complete area at the bottom of the screen. for (int y = 12; y < 24; y++) { for (int x = 0; x < 32; x++) { baseAddress[y * 32 + x] = 0; @@ -259,23 +286,26 @@ void drawAutoComplete() { } - for (int r = 0; r < autoCompleteCount; r++) { - int y = 12 + (r % 6) * 2; - int x = 0 + ((r / 6) * 16); - - for (int p = 0; autoCompleteWord[r][p] != 0; p++) { - char c = autoCompleteWord[r][p]; - - int tile = c - 33 + (KEYBOARD_DATA_SIZE / 32); + if ((autoCompleteCount == 0) || (typingTimeout > 0)) { - if (selectedCompletion == r) { - tile |= 0x1000; - } + // When there's no completions on the bottom of the screen, it acts like a mouse pad + // so this text indicates that + drawText(11, 18, "MOUSE AREA", true); + - baseAddress[y * 32 + x + p] = tile; + } else { + consolePrintf("time: %d\n", typingTimeout); + // Otherwise, draw autocompletions if one isn't being entered and there are + // some available. + for (int r = 0; r < autoCompleteCount; r++) { + int y = 12 + (r % 6) * 2; + int x = 0 + ((r / 6) * 16); + + drawText(x, y, autoCompleteWord[r], selectedCompletion == r); } + } } @@ -309,6 +339,12 @@ void setCharactersEntered(int count) { charactersEntered = count; } +bool isInsideKeyboard(int x, int y) { + // When completions are available, keyboard covers the whole screen. + // otherwise, it only covers the area above KEYBOARD_BOTTOM_Y + return (autoCompleteCount > 0) || (y < KEYBOARD_BOTTOM_Y); +} + void clearAutoComplete() { autoCompleteCount = 0; selectedCompletion = -1; @@ -345,10 +381,8 @@ void typeCompletion(int current) { system->addEvent(event);*/ } -void updateTypeEvents() -{ - if (autoCompleteBuffer[0] != '\0') - { +void updateTypeEvents() { + if (autoCompleteBuffer[0] != '\0') { Common::Event event; OSystem_DS* system = OSystem_DS::instance(); @@ -365,6 +399,8 @@ void updateTypeEvents() { autoCompleteBuffer[r] = autoCompleteBuffer[r + 1]; } + + typingTimeout = 100; } } @@ -424,6 +460,13 @@ void addKeyboardEvents() { updateTypeEvents(); + if (typingTimeout > 0) { + typingTimeout--; + if (typingTimeout == 0) { + drawAutoComplete(); + } + } + if (DS::getPenDown()) { int x = IPC->touchXpx; int y = IPC->touchYpx; @@ -443,7 +486,9 @@ void addKeyboardEvents() { if (selectedCompletion == current) { typeCompletion(current); } else { - selectedCompletion = current; + if (current < autoCompleteCount) { + selectedCompletion = current; + } } drawAutoComplete(); diff --git a/backends/platform/ds/arm9/source/touchkeyboard.h b/backends/platform/ds/arm9/source/touchkeyboard.h index 2894281962..6ceb83bfc7 100644 --- a/backends/platform/ds/arm9/source/touchkeyboard.h +++ b/backends/platform/ds/arm9/source/touchkeyboard.h @@ -29,6 +29,7 @@ namespace DS { static const int NUM_WORDS = 12; static const int KEYBOARD_DATA_SIZE = 4736 * 2; +static const int KEYBOARD_BOTTOM_Y = 105; void createKeyEvent(int keyNum, Common::Event& event); @@ -36,6 +37,7 @@ 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 clearAutoComplete(); diff --git a/backends/platform/ds/logoa.bmp b/backends/platform/ds/logoa.bmp Binary files differindex 8bee29bc17..acac9b2272 100644 --- a/backends/platform/ds/logoa.bmp +++ b/backends/platform/ds/logoa.bmp diff --git a/backends/platform/ds/logob.bmp b/backends/platform/ds/logob.bmp Binary files differindex d5ee10d221..64cb1044e5 100644 --- a/backends/platform/ds/logob.bmp +++ b/backends/platform/ds/logob.bmp diff --git a/backends/platform/ds/logoc.bmp b/backends/platform/ds/logoc.bmp Binary files differindex 2ecb388db3..ca82c5d083 100644 --- a/backends/platform/ds/logoc.bmp +++ b/backends/platform/ds/logoc.bmp diff --git a/backends/platform/ds/logod.bmp b/backends/platform/ds/logod.bmp Binary files differindex c1ddb5e72d..02f8765d33 100644 --- a/backends/platform/ds/logod.bmp +++ b/backends/platform/ds/logod.bmp diff --git a/backends/platform/ds/logoe.bmp b/backends/platform/ds/logoe.bmp Binary files differindex 9d9aec6049..2f6a2b720d 100644 --- a/backends/platform/ds/logoe.bmp +++ b/backends/platform/ds/logoe.bmp diff --git a/backends/platform/ds/logof.bmp b/backends/platform/ds/logof.bmp Binary files differindex 7706155b56..5f22f164f2 100644 --- a/backends/platform/ds/logof.bmp +++ b/backends/platform/ds/logof.bmp diff --git a/backends/platform/ds/logog.bmp b/backends/platform/ds/logog.bmp Binary files differindex 9c194d3f82..fe7447058c 100644 --- a/backends/platform/ds/logog.bmp +++ b/backends/platform/ds/logog.bmp diff --git a/backends/platform/ds/logoh.bmp b/backends/platform/ds/logoh.bmp Binary files differnew file mode 100644 index 0000000000..5441bed5c9 --- /dev/null +++ b/backends/platform/ds/logoh.bmp diff --git a/backends/platform/ds/logoi.bmp b/backends/platform/ds/logoi.bmp Binary files differnew file mode 100644 index 0000000000..07c5d8c71d --- /dev/null +++ b/backends/platform/ds/logoi.bmp diff --git a/backends/platform/ds/logoj.bmp b/backends/platform/ds/logoj.bmp Binary files differnew file mode 100644 index 0000000000..fb1c1a397a --- /dev/null +++ b/backends/platform/ds/logoj.bmp diff --git a/backends/platform/ds/logok.bmp b/backends/platform/ds/logok.bmp Binary files differnew file mode 100644 index 0000000000..95130d6da2 --- /dev/null +++ b/backends/platform/ds/logok.bmp |