diff options
-rw-r--r-- | backends/PalmOS/Src/launch.cpp | 455 |
1 files changed, 247 insertions, 208 deletions
diff --git a/backends/PalmOS/Src/launch.cpp b/backends/PalmOS/Src/launch.cpp index bff3de1452..4f2a654f12 100644 --- a/backends/PalmOS/Src/launch.cpp +++ b/backends/PalmOS/Src/launch.cpp @@ -1,53 +1,18 @@ #include <PalmOS.h> -#include <Sonyclie.h> #include "StarterRsc.h" -#include <stdio.h> -#include <unistd.h> -#include <stdlib.h> - #include "games.h" #include "start.h" #include "rumble.h" -#include "pa1lib.h" #include "extend.h" #include "globals.h" #include "features.h" +#include "formUtil.h" +#include "modules.h" +#include "args.h" -// need to move this on a .h file -#define sonySysFileCSystem 'SsYs' /* Sony overall System */ -#define sonySysFtrCreatorSystem sonySysFileCSystem - -#define sonySysFtrNumSystemBase 10000 -#define sonySysFtrNumSystemAOutSndStateOnHandlerP (sonySysFtrNumSystemBase + 4) -#define sonySysFtrNumSystemAOutSndStateOffHandlerP (sonySysFtrNumSystemBase + 5) - -typedef void (*sndStateOnType)(UInt8 /* kind */, UInt8 /* L volume 0-31 */, UInt8 /* R volume 0-31 */); -typedef void (*sndStateOffType)(UInt8 /* kind */); - -/* kind */ -#define aOutSndKindSp (0) /* Speaker volume */ -#define aOutSndKindHp (2) /* HeadPhone volume */ -//////////////////////////////////////////////////////////// -#define MAX_ARG 25 - -static void initARM() { - // init global ARM only - MemSet(gVars->arm, sizeof(gVars->arm), 0); - ARM(PNO_COPYRECT ).pnoPtr = _PnoInit(RSC_COPYRECT, &ARM(PNO_COPYRECT).pnoDesc); - ARM(PNO_COSTUMEPROC3).pnoPtr = _PceInit(RSC_COSTUMEPROC3); - ARM(PNO_DRAWSTRIP ).pnoPtr = _PceInit(RSC_DRAWSTRIP); - ARM(PNO_BLIT ).pnoPtr = _PnoInit(RSC_BLIT, &ARM(PNO_BLIT).pnoDesc); -} - -static void releaseARM() { - _PnoFree(&ARM(PNO_BLIT ).pnoDesc, ARM(PNO_BLIT).pnoPtr); - _PceFree(ARM(PNO_DRAWSTRIP ).pnoPtr); - _PceFree(ARM(PNO_COSTUMEPROC3 ).pnoPtr); - _PnoFree(&ARM(PNO_COPYRECT ).pnoDesc, ARM(PNO_COPYRECT).pnoPtr); -} - +/* static Boolean checkPath(const Char *pathP) { FILE *tmpRef; @@ -58,51 +23,144 @@ static Boolean checkPath(const Char *pathP) { return true; } } +*/ + +#define BUILD_FILE(h,m) \ + StrCopy(filename, "/Palm/Programs/ScummVM/Mods/"); \ + StrCat(filename, h); \ + StrCat(filename, m); + +#define CHECK_FILE() \ + e = VFSFileOpen(volRefNum, filename, vfsModeRead, &file); \ + if (e) \ + goto onError; \ + else \ + VFSFileClose(file); + +#define DELET_FILE(f) \ + del_dbID = DmFindDatabase(0, f); \ + if (del_dbID) \ + DmDeleteDatabase(0, del_dbID); + +void ModDelete() { + LocalID del_dbID; + + DELET_FILE("Glbs::Common"); + DELET_FILE("Glbs::Scumm"); + DELET_FILE("Glbs::Simon"); + DELET_FILE("Glbs::Queen"); + DELET_FILE("Glbs::Sword1"); + DELET_FILE("ScummVM-Engine"); +} -static void AddArg(Char **argvP, const Char *argP, const Char *parmP, UInt8 *countArgP) -{ - if (argP) - { - UInt16 len2 = 0; - UInt16 len1 = StrLen(argP); - - if (len1 > 0) - { - if (parmP) - len2 = StrLen(parmP); - - (*countArgP)++; - *argvP = (Char *)MemPtrNew(len1 + len2 + 1); - StrCopy(*argvP, argP); - - if (parmP) - StrCat(*argvP, parmP); +static void ModSetStack(UInt32 newSize, UInt16 cardNo, LocalID dbID) { + DmOpenRef dbRef = DmOpenDatabase(cardNo, dbID, dmModeReadWrite); + + if (dbRef) { + MemHandle pref = DmGetResource('pref',0); + UInt32 size = 0; + + if (pref) { + SysAppPrefsType *data = (SysAppPrefsType *)MemHandleLock(pref); + size = data->stackSize; + + if (newSize) { + SysAppPrefsType newData; + MemMove(&newData, data, sizeof(SysAppPrefsType)); + newData.stackSize = newSize; + DmWrite(data, 0, &newData, sizeof(SysAppPrefsType)); + } + + MemPtrUnlock(data); + DmReleaseResource(pref); } + + DmCloseDatabase(dbRef); } } +static Err ModImport(UInt16 volRefNum, UInt8 engine) { + const Char *files[] = { + { "scumm" }, + { "simon" }, + { "queen" }, + { "sword1" } + }; + + char filename[256]; + UInt16 dum1; + UInt32 dum2; + FileRef file; + Err e; + FormPtr ofmP, frmP; + + ofmP = FrmGetActiveForm(); + frmP = FrmInitForm(ImportForm); + FrmSetActiveForm(frmP); + FrmDrawForm(frmP); + + BUILD_FILE(files[engine], ".engine"); // engine file ? + CHECK_FILE(); + BUILD_FILE(files[engine], ".data"); // data file ? + CHECK_FILE(); + BUILD_FILE("common", ".data") // common data ? + CHECK_FILE(); + + BUILD_FILE("common", ".data"); + e = (e) ? e : VFSImportDatabaseFromFile(volRefNum, filename, &dum1, &dum2); + BUILD_FILE(files[engine], ".data"); + e = (e) ? e : VFSImportDatabaseFromFile(volRefNum, filename, &dum1, &dum2); + BUILD_FILE(files[engine], ".engine"); + e = (e) ? e : VFSImportDatabaseFromFile(volRefNum, filename, &dum1, &dum2); + + // if error, cleanup + if (e) ModDelete(); + +onError: + FrmEraseForm(frmP); + FrmDeleteForm(frmP); + if (e && ofmP) FrmSetActiveForm(ofmP); + + return e; +} + +#undef DELET_FILE +#undef CHECK_FILE +#undef BUILD_FILE + Boolean StartScummVM() { - Char *argvP[MAX_ARG]; - UInt8 argc = 0; - UInt8 count; + Char **argvP; + UInt8 lightspeed, argc = 0; + UInt32 stackSize; + Boolean toLauncher; + UInt8 engine; - Boolean autoOff; - UInt16 autoOffDelay; UInt16 musicDriver = sysInvalidRefNum; // for launch call - UInt16 index = GamGetSelected(); - for(count = 0; count < MAX_ARG; count++) - argvP[count] = NULL; + Char num[6]; + + argvP = ArgsInit(); + + if (index == dmMaxRecordIndex) { + UInt16 whichButton; + FormPtr frmP = FrmInitForm(EngineForm); + whichButton = FrmDoDialog(frmP); + FrmDeleteForm(frmP); + + if (whichButton == EngineCancelButton) + return false; + + engine = (whichButton - Engine0Button); - if (index != dmMaxRecordIndex) { + } else { Char pathP[256]; - Char num[6]; MemHandle recordH; GameInfoType *gameInfoP; recordH = DmQueryRecord(gameDB,index); gameInfoP = (GameInfoType *)MemHandleLock(recordH); + engine = gameInfoP->engine; // build path StrCopy(pathP,"/Palm/Programs/ScummVM/Games/"); @@ -115,31 +173,29 @@ Boolean StartScummVM() { if (!checkPath(pathP)) { MemHandleUnlock(recordH); FrmCustomAlert(FrmErrorAlert,"The specified path was not found !",0,0); + ArgsFree(argvP); return false; } */ + // ScummVM - AddArg(&argvP[argc], "-", NULL, &argc); + ArgsAdd(&argvP[argc], "-", NULL, &argc); // path - AddArg(&argvP[argc], "-p", pathP, &argc); + ArgsAdd(&argvP[argc], "-p", pathP, &argc); // language if (gameInfoP->language > 0) { const Char *lang = "en\0de\0fr\0it\0p\0es\0jp\0z\0kr\0hb\0ru\0cz\0nl\0"; - AddArg(&argvP[argc], "-q", (lang + (gameInfoP->language - 1) * 3), &argc); + ArgsAdd(&argvP[argc], "-q", (lang + (gameInfoP->language - 1) * 3), &argc); } // fullscreen ? if (gameInfoP->fullscreen) - AddArg(&argvP[argc], "-f", NULL, &argc); + ArgsAdd(&argvP[argc], "-f", NULL, &argc); // aspect-ratio ? - AddArg(&argvP[argc], (gameInfoP->aspectRatio ? "--aspect-ratio" : "--no-aspect-ratio"), NULL, &argc); - - // copy protection ? - if (gPrefs->copyProtection) - AddArg(&argvP[argc], "--copy-protection", NULL, &argc); + ArgsAdd(&argvP[argc], (gameInfoP->aspectRatio ? "--aspect-ratio" : "--no-aspect-ratio"), NULL, &argc); // gfx mode gVars->flipping.pageAddr1 = (UInt8 *)(BmpGetBits(WinGetBitmap(WinGetDisplayWindow()))); @@ -148,135 +204,126 @@ Boolean StartScummVM() { switch (gameInfoP->gfxMode) { case 1: - AddArg(&argvP[argc], "-g", "flipping", &argc); + ArgsAdd(&argvP[argc], "-g", "flipping", &argc); gVars->flipping.pageAddr1 = (UInt8 *)WinScreenLock(winLockDontCare); WinScreenUnlock(); break; case 2: - AddArg(&argvP[argc], "-g", "buffered", &argc); + ArgsAdd(&argvP[argc], "-g", "buffered", &argc); break; case 3: - AddArg(&argvP[argc], "-g", "wide", &argc); + ArgsAdd(&argvP[argc], "-g", "wide", &argc); gVars->flipping.pageAddr1 = (UInt8 *)WinScreenLock(winLockDontCare); WinScreenUnlock(); break; default: - AddArg(&argvP[argc], "-g", "normal", &argc); + ArgsAdd(&argvP[argc], "-g", "normal", &argc); break; } // load state if (gameInfoP->autoLoad) { StrIToA(num, gameInfoP->loadSlot); - AddArg(&argvP[argc], "-x", num, &argc); + ArgsAdd(&argvP[argc], "-x", num, &argc); } // boot script parameter if (gameInfoP->bootParam) { StrIToA(num, gameInfoP->bootValue); - AddArg(&argvP[argc], "-b", num, &argc); + ArgsAdd(&argvP[argc], "-b", num, &argc); } // not a PC version if (gameInfoP->setPlatform) { switch (gameInfoP->platform) { case 0: - AddArg(&argvP[argc], "--platform=", "amiga", &argc); + ArgsAdd(&argvP[argc], "--platform=", "amiga", &argc); break; case 1: - AddArg(&argvP[argc], "--platform=", "atari", &argc); + ArgsAdd(&argvP[argc], "--platform=", "atari", &argc); break; case 2: - AddArg(&argvP[argc], "--platform=", "mac", &argc); + ArgsAdd(&argvP[argc], "--platform=", "mac", &argc); break; case 3: - AddArg(&argvP[argc], "--platform=", "pc", &argc); + ArgsAdd(&argvP[argc], "--platform=", "pc", &argc); break; case 4: - AddArg(&argvP[argc], "--platform=", "fmtowns", &argc); + ArgsAdd(&argvP[argc], "--platform=", "fmtowns", &argc); break; case 5: - AddArg(&argvP[argc], "--platform=", "windows", &argc); + ArgsAdd(&argvP[argc], "--platform=", "windows", &argc); break; } } // subtitles if (gameInfoP->subtitles) - AddArg(&argvP[argc], "-n", NULL, &argc); - - // talk speed - if (gameInfoP->talkSpeed) { - StrIToA(num, gameInfoP->talkValue); - AddArg(&argvP[argc], "--talkspeed=", num, &argc); - } - // debug level - if (gPrefs->debug) { - StrIToA(num, gPrefs->debugLevel); - AddArg(&argvP[argc], "-d", num, &argc); - } - // demo mode ? - if (gPrefs->demoMode) - AddArg(&argvP[argc], "--demo-mode", NULL, &argc); - - // alternative intro ? - if (gPrefs->altIntro) - AddArg(&argvP[argc], "--alt-intro", NULL, &argc); + ArgsAdd(&argvP[argc], "-n", NULL, &argc); // multi midi ? if (gameInfoP->musicInfo.sound.multiMidi) - AddArg(&argvP[argc], "--multi-midi", NULL, &argc); + ArgsAdd(&argvP[argc], "--multi-midi", NULL, &argc); + + if (engine == ENGINE_SCUMM) { + // music tempo + StrIToA(num, gameInfoP->musicInfo.sound.tempo); + ArgsAdd(&argvP[argc], "--tempo=", num, &argc); + // talk speed + if (gameInfoP->talkSpeed) { + StrIToA(num, gameInfoP->talkValue); + ArgsAdd(&argvP[argc], "--talkspeed=", num, &argc); + } + } // music driver musicDriver =gameInfoP->musicInfo.sound.music; if (musicDriver) { switch (gameInfoP->musicInfo.sound.drvMusic) { case 0: // NULL - AddArg(&argvP[argc], "-e", "null", &argc); + ArgsAdd(&argvP[argc], "-e", "null", &argc); break; case 1: // built-in MIDI if (OPTIONS_TST(kOptDeviceZodiac)) - AddArg(&argvP[argc], "-e", "zodiac", &argc); // Tapwave Zodiac + ArgsAdd(&argvP[argc], "-e", "zodiac", &argc); // Tapwave Zodiac else if (OPTIONS_TST(kOptSonyPa1LibAPI)) - AddArg(&argvP[argc], "-e", "ypa1", &argc); // Pa1Lib devices + ArgsAdd(&argvP[argc], "-e", "ypa1", &argc); // Pa1Lib devices else - AddArg(&argvP[argc], "-e", "null", &argc); // error, no music driver + ArgsAdd(&argvP[argc], "-e", "null", &argc); // error, no music driver break; case 2: // PC Speaker - AddArg(&argvP[argc], "-e", "pcspk", &argc); + ArgsAdd(&argvP[argc], "-e", "pcspk", &argc); break; case 3: // IBM PCjr - AddArg(&argvP[argc], "-e", "pcjr", &argc); + ArgsAdd(&argvP[argc], "-e", "pcjr", &argc); case 4: // FM Towns - AddArg(&argvP[argc], "-e", "towns", &argc); + ArgsAdd(&argvP[argc], "-e", "towns", &argc); + case 5: // AdLib + ArgsAdd(&argvP[argc], "-e", "adlib", &argc); } } else // NULL as default - AddArg(&argvP[argc], "-e", "null", &argc); - - // music tempo - StrIToA(num, gameInfoP->musicInfo.sound.tempo); - AddArg(&argvP[argc], "--tempo=", num, &argc); + ArgsAdd(&argvP[argc], "-e", "null", &argc); // volume control StrIToA(num, gameInfoP->musicInfo.volume.master); - AddArg(&argvP[argc], "-o", num, &argc); + ArgsAdd(&argvP[argc], "-o", num, &argc); StrIToA(num, gameInfoP->musicInfo.volume.sfx); - AddArg(&argvP[argc], "-s", num, &argc); + ArgsAdd(&argvP[argc], "-s", num, &argc); StrIToA(num, gameInfoP->musicInfo.volume.music); - AddArg(&argvP[argc], "-m", num, &argc); + ArgsAdd(&argvP[argc], "-m", num, &argc); StrIToA(num, gameInfoP->musicInfo.volume.speech); - AddArg(&argvP[argc], "-r", num, &argc); + ArgsAdd(&argvP[argc], "-r", num, &argc); // output rate if (gameInfoP->musicInfo.sound.sfx) { UInt32 rates[] = {8000, 11025, 22050}; StrIToA(num, rates[gameInfoP->musicInfo.sound.rate]); - AddArg(&argvP[argc], "--output-rate=", num, &argc); + ArgsAdd(&argvP[argc], "--output-rate=", num, &argc); } // game name - AddArg(&argvP[argc], gameInfoP->gameP, NULL, &argc); + ArgsAdd(&argvP[argc], gameInfoP->gameP, NULL, &argc); // use sound if (!gameInfoP->musicInfo.sound.sfx) { @@ -295,108 +342,100 @@ Boolean StartScummVM() { MemHandleUnlock(recordH); } - if (argc > MAX_ARG) - FrmCustomAlert(FrmErrorAlert, "Too many parameters.",0,0); + // debug level + if (gPrefs->debug) { + StrIToA(num, gPrefs->debugLevel); + ArgsAdd(&argvP[argc], "-d", num, &argc); + } + + if (engine == ENGINE_QUEEN) { + // alternative intro ? + if (gPrefs->altIntro) + ArgsAdd(&argvP[argc], "--alt-intro", NULL, &argc); + } + + if (engine == ENGINE_SCUMM) { + // copy protection ? + if (gPrefs->copyProtection) + ArgsAdd(&argvP[argc], "--copy-protection", NULL, &argc); + // demo mode ? + if (gPrefs->demoMode) + ArgsAdd(&argvP[argc], "--demo-mode", NULL, &argc); + } + +// if (argc > MAX_ARG) +// FrmCustomAlert(FrmErrorAlert, "Too many parameters.",0,0); - gVars->skinSet = false; - gVars->pinUpdate = false; - GamCloseDatabase(false); - FrmCloseAllForms(); + gVars->skinSet = false; + gVars->pinUpdate= false; - autoOff = gPrefs->autoOff; - if (!autoOff) { - autoOffDelay = SysSetAutoOffTime(0); - EvtResetAutoOffTimer(); - } + stackSize = (gPrefs->setStack ? STACK_LARGER : STACK_DEFAULT); + lightspeed= (gPrefs->lightspeed.enable ? gPrefs->lightspeed.mode : 255); + toLauncher= (gPrefs->exitLauncher); + + // gVars values + // (gVars->HRrefNum defined in checkHRmode on Clié) + gVars->screenLocked = false; + gVars->volRefNum = gPrefs->card.volRefNum; + gVars->vibrator = gPrefs->vibrator; + gVars->stdPalette = gPrefs->stdPalette; - // gVars values - //gVars->HRrefNum defined in checkHRmode on Clié OS4 - gVars->screenLocked = false; - gVars->volRefNum = gPrefs->card.volRefNum; - gVars->vibrator = gPrefs->vibrator; - gVars->stdPalette = gPrefs->stdPalette; - gVars->autoReset = gPrefs->autoReset; - // user params + HWR_RSTALL(); + + if (!gPrefs->autoOff) + HWR_SET(INIT_AUTOOFF); + if (!gPrefs->arm) { OPTIONS_RST(kOptDeviceARM); OPTIONS_RST(kOptDeviceProcX86); + } else { + HWR_SET(INIT_ARM); } if (gVars->vibrator) - gVars->vibrator = RumbleInit(); - - // create file for printf, warnings, etc... - void DrawStatus(Boolean show); - StdioInit(gVars->volRefNum, "/PALM/Programs/ScummVM/scumm.log", DrawStatus); - gUnistdCWD = SCUMMVM_SAVEPATH; - - // TODO : move this to ypa1.cpp (?) - void *sndStateOnFuncP = NULL, - *sndStateOffFuncP = NULL; - - if (musicDriver == 1 || musicDriver == 3 || musicDriver == 4 || musicDriver == sysInvalidRefNum) { - - Pa1Lib_Open(); + HWR_SET(INIT_VIBRATOR); - // Don't work on T4xx and T6xx series ? - FtrGet(sonySysFtrCreatorSystem, sonySysFtrNumSystemAOutSndStateOnHandlerP, (UInt32*) &sndStateOnFuncP); - FtrGet(sonySysFtrCreatorSystem, sonySysFtrNumSystemAOutSndStateOffHandlerP, (UInt32*) &sndStateOffFuncP); - - if (sndStateOnFuncP && sndStateOffFuncP) { - ((sndStateOnType)(sndStateOnFuncP))(aOutSndKindSp, 31, 31); - ((sndStateOnType)(sndStateOnFuncP))(aOutSndKindHp, 31, 31); - } + if ( musicDriver == 1 || + musicDriver == 3 || + musicDriver == 4 || + musicDriver == sysInvalidRefNum) { + HWR_SET(INIT_PA1LIB); + } - Pa1Lib_devHpVolume(31, 31); - Pa1Lib_devSpVolume(31); + if (ModImport(gVars->volRefNum, engine) != errNone) { + FrmCustomAlert(FrmErrorAlert, "Error importing files:\nplease check that all required files are installed on the selected memory card, and you have enough free storage memory.", 0, 0); + ArgsFree(argvP); + return false; } - // ------------- - SavePrefs(); // free globals pref memory - GlbOpen(); - initARM(); - - // reset screen depth + // free and save globals pref memory + GamCloseDatabase(false); + FrmCloseAllForms(); + SavePrefs(); + { - UInt32 depth = 8; - WinScreenMode(winScreenModeSet, NULL, NULL, &depth, NULL); - } + UInt16 cardNo; + UInt32 dbID; - DO_EXIT( main(argc, argvP); ) - - // be sure to release feature memory - FREE_FTR(ftrBufferOverlay) - FREE_FTR(ftrBufferBackup) - FREE_FTR(ftrBufferHotSwap) - - releaseARM(); - GlbClose(); - - // TODO : move this to ypa1.cpp (?) - if (musicDriver == 1 || musicDriver == 3 || musicDriver == 4 || musicDriver == sysInvalidRefNum) { - if (sndStateOnFuncP && sndStateOffFuncP) { - ((sndStateOffType)(sndStateOffFuncP))(aOutSndKindSp); - ((sndStateOffType)(sndStateOffFuncP))(aOutSndKindHp); - } + LaunchParamType *cmdPBP = (LaunchParamType *)MemPtrNew(sizeof(LaunchParamType)); - Pa1Lib_Close(); - } - // ------------- + MemPtrSetOwner(cmdPBP, 0); + MemPtrSetOwner(gVars, 0); + ArgsSetOwner(argvP, 0); - // close log file - StdioRelease(); + cardNo = 0; + dbID = DmFindDatabase(0, "ScummVM-Engine"); + ModSetStack(stackSize, cardNo, dbID); - for(count = 0; count < MAX_ARG; count++) - if (argvP[count]) - MemPtrFree(argvP[count]); - - if (gVars->vibrator) - RumbleRelease(); + cmdPBP->args.argc = argc; + cmdPBP->args.argv = argvP; + cmdPBP->gVars = gVars; + cmdPBP->lightspeed = lightspeed; + cmdPBP->exitLauncher = toLauncher; - if (!autoOff) { - SysSetAutoOffTime(autoOffDelay);SystemPreferencesChoice - EvtResetAutoOffTimer(); + SysUIAppSwitch(cardNo, dbID, sysAppLaunchCmdNormalLaunch, cmdPBP); + bLaunched = true; } return false; |