diff options
| author | Chris Apers | 2006-02-12 20:13:08 +0000 | 
|---|---|---|
| committer | Chris Apers | 2006-02-12 20:13:08 +0000 | 
| commit | adc73b773a861b2bc99aa8066e136312031b65eb (patch) | |
| tree | bf94a05293fdf45750768ae56d1f454e28639f5b /backends/PalmOS | |
| parent | 8935cac6dad9e5628efb00224075ffd5e09100bd (diff) | |
| download | scummvm-rg350-adc73b773a861b2bc99aa8066e136312031b65eb.tar.gz scummvm-rg350-adc73b773a861b2bc99aa8066e136312031b65eb.tar.bz2 scummvm-rg350-adc73b773a861b2bc99aa8066e136312031b65eb.zip  | |
Revamped launcher code
+ more user freindly error message with ModImport
+ New direct mode code with some default option
+ Games data can now be directly in the Games folder using . as path
+ Added missing scummvm languages option
+ Added --render-mode option
+ Removed gfxMode, now only normal(1x) or wide
+ Added missing scummvm platforms option
+ Fixed per engine command line options
+ Alpha. ordered music drivers
+ Added 44khz (mainly for Zodiac) and FM Quality option
+ global command line options are now also used in direct mode
+ Added stylusClick, autoSave, advanced OS5 mode, optional led indicator, GoLCD API support
+ New feature to set ARM stack size
+ Fixed rotation problem
svn-id: r20656
Diffstat (limited to 'backends/PalmOS')
| -rw-r--r-- | backends/PalmOS/Src/launch.cpp | 350 | 
1 files changed, 225 insertions, 125 deletions
diff --git a/backends/PalmOS/Src/launch.cpp b/backends/PalmOS/Src/launch.cpp index 36e7555941..9b1b6be0b4 100644 --- a/backends/PalmOS/Src/launch.cpp +++ b/backends/PalmOS/Src/launch.cpp @@ -1,3 +1,27 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001  Ludvig Strigeus + * Copyright (C) 2001-2006 The ScummVM project + * Copyright (C) 2002-2006 Chris Apers - PalmOS Backend + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ +  #include <PalmOS.h>  #include "StarterRsc.h" @@ -8,34 +32,37 @@  #include "globals.h"  #include "features.h"  #include "formUtil.h" +#include "formCards.h" +#include "palmdefs.h" + +#include "init_palmos.h" +#include "init_stuffs.h"  #include "modules.h"  #include "args.h" -/* -static Boolean checkPath(const Char *pathP) { -	FILE *tmpRef; -	if (!(tmpRef = fopen(pathP, "r"))) { -		return false; -	} else { -		fclose(tmpRef); -		return true; -	} -} -*/ +#define BUILD_ERROR(m)	\ +	{	StrCopy(msg, m);	\ +		StrCat(msg, "\n\nPlease check that all required files are installed on your card, and you have enough free storage memory.");	\ +		goto onError; }  #define BUILD_FILE(h,m)	\  	StrCopy(filename, "/Palm/Programs/ScummVM/Mods/");	\  	StrCat(filename, h);	\  	StrCat(filename, m); -#define CHECK_FILE() \ +#define CHECK_FILE(m) \  	e = VFSFileOpen(volRefNum, filename, vfsModeRead, &file);	\  	if (e)	\ -		goto onError;	\ +		BUILD_ERROR(m)	\  	else	\ -	VFSFileClose(file); +		VFSFileClose(file); + +#define IMPRT_FILE(m) \ +	e = VFSImportDatabaseFromFile(volRefNum, filename, &cardNo, &dbID);	\ +	if (e)	\ +		BUILD_ERROR(m)  #define DELET_FILE(f) \  	del_dbID = DmFindDatabase(0, f);	\ @@ -56,7 +83,7 @@ static void ModSetStack(UInt32 newSize, UInt16 cardNo, LocalID dbID) {  	if (dbRef) {  		MemHandle pref = DmGetResource('pref',0);  		UInt32 size = 0; - +		  		if (pref) {  			SysAppPrefsType *data = (SysAppPrefsType *)MemHandleLock(pref);  			size = data->stackSize; @@ -76,19 +103,15 @@ static void ModSetStack(UInt32 newSize, UInt16 cardNo, LocalID dbID) {  	}  } -static Err ModImport(UInt16 volRefNum, UInt8 engine) { -	const Char *files[] = { -		{ "scumm" }, -		{ "simon" }, -		{ "queen" }, -		{ "sword1" }, -		{ "sky" } -	}; - +static Err ModImport(UInt16 volRefNum, UInt8 engine, Boolean *armP) { +#ifndef _DEBUG_ENGINE  	char filename[256]; -	UInt16 dum1; -	UInt32 dum2; +	UInt16 cardNo; +	LocalID dbID; +	UInt32 result;  	FileRef file; +#endif +	char msg[256];  	FormPtr ofmP, frmP;  	Err e = errNone; @@ -97,21 +120,30 @@ static Err ModImport(UInt16 volRefNum, UInt8 engine) {  	FrmSetActiveForm(frmP);  	FrmDrawForm(frmP); -#ifndef _DEBUG_ENGINE  	// In debug mode, the engine files are directly uploaded to the simulator -	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); +#ifndef _DEBUG_ENGINE +	// engine file ? +	BUILD_FILE(engines[engine].fileP, ".engine"); +	CHECK_FILE("ScummVM engine file was not found !"); +	IMPRT_FILE("Cannot import engine file !"); + +	// need more files ? +	dbID = DmFindDatabase(0, "ScummVM-Engine");	// be sure to have the correct dbID +	e = SysAppLaunch(cardNo, dbID, 0, sysAppLaunchCustomEngineGetInfo, 0, &result); +	*armP = ((result & GET_MODEARM) == GET_MODEARM); + +	// common file ? +	if (!e && (result & GET_DATACOMMON)) { +		BUILD_FILE("common", ".data"); +		CHECK_FILE("Common data file was not found !"); +		IMPRT_FILE("Cannot import common data file !"); +	} +	// data file ? +	if (!e && (result & GET_DATAENGINE)) { +		BUILD_FILE(engines[engine].fileP, ".data"); +		CHECK_FILE("Engine data file was not found !"); +		IMPRT_FILE("Cannot import engine data file !"); +	}  #endif  	// if error, cleanup  	if (e) ModDelete(); @@ -119,7 +151,10 @@ static Err ModImport(UInt16 volRefNum, UInt8 engine) {  onError:  	FrmEraseForm(frmP);  	FrmDeleteForm(frmP); -	if (e && ofmP) FrmSetActiveForm(ofmP); +	if (e) { +		if (ofmP) FrmSetActiveForm(ofmP); +		FrmCustomAlert(FrmErrorAlert, msg, 0, 0); +	}  	return e;  } @@ -132,7 +167,7 @@ Boolean StartScummVM() {  	Char **argvP;  	UInt8 lightspeed, argc	= 0;  	UInt32 stackSize; -	Boolean toLauncher; +	Boolean toLauncher, direct, isARM;  	UInt8 engine;  	UInt16 musicDriver = sysInvalidRefNum; // for launch call @@ -141,18 +176,57 @@ Boolean StartScummVM() {  	Char num[6];  	argvP = ArgsInit(); +	direct = false; +	// start command line (exec name) +	ArgsAdd(&argvP[argc], "-", NULL, &argc); + +	// no game selected  	if (index == dmMaxRecordIndex) { +		ListPtr listP;  		UInt16 whichButton; +		 +		// init form  		FormPtr frmP = FrmInitForm(EngineForm); +		listP = (ListType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, EngineListList)); +		itemsText = (Char **)MemPtrNew(ENGINE_COUNT * sizeof(Char *)); +		 +		for (int i = 0; i < ENGINE_COUNT; i++) +			itemsText[i] = (Char *)engines[i].nameP; +			 +		LstSetListChoices (listP, itemsText, ENGINE_COUNT); +		LstSetSelection(listP, 0);	 +		  		whichButton = FrmDoDialog(frmP); -		FrmDeleteForm(frmP); +		engine = LstGetSelection(listP); -		if (whichButton == EngineCancelButton) +		FrmDeleteForm(frmP); +		MemPtrFree(itemsText); +		itemsText = NULL; +		 +		if (whichButton == EngineCancelButton) { +			if (bDirectMode) { +				// and force exit if nothing selected +				EventType event; +				event.eType = keyDownEvent; +				event.data.keyDown.chr = vchrLaunch; +				event.data.keyDown.modifiers = commandKeyMask; +				EvtAddUniqueEventToQueue(&event, 0, true); +			} +			// free args +			ArgsFree(argvP);  			return false; +		} -		engine = (whichButton - Engine0Button); +		// default values +		if (bDirectMode) +			gPrefs->card.volRefNum = parseCards();	// always use the first removable card available (?) +		gVars->filter		= true; +		gVars->palmVolume	= 50; +		gVars->fmQuality	= FM_QUALITY_INI; +		direct = true; +	// somthing selected  	} else {  		Char pathP[256];  		MemHandle recordH; @@ -165,28 +239,16 @@ Boolean StartScummVM() {  		// build path  		StrCopy(pathP,"/Palm/Programs/ScummVM/Games/");  		if (gameInfoP->pathP[0] == '/') -			StrCopy(pathP,gameInfoP->pathP); -		else -			StrCat(pathP,gameInfoP->pathP); - -/*		// path exists ? -		if (!checkPath(pathP)) { -			MemHandleUnlock(recordH); -			FrmCustomAlert(FrmErrorAlert,"The specified path was not found !",0,0); -			ArgsFree(argvP); -			return false; -		} -*/ - -		// ScummVM -		ArgsAdd(&argvP[argc], "-", NULL, &argc); +			StrCopy(pathP, gameInfoP->pathP); +		else if (!(gameInfoP->pathP[0] == '.' && StrLen(gameInfoP->pathP) == 1)) +			StrCat(pathP, gameInfoP->pathP);  		// path  		ArgsAdd(&argvP[argc], "-p", pathP, &argc);  		// language  		if (gameInfoP->language > 0) { -			const Char *lang = "en\0de\0fr\0it\0pt\0es\0jp\0zh\0kr\0hb\0ru\0cz\0nl\0"; +			const Char *lang = "zh\0cz\0gb\0en\0fr\0de\0hb\0it\0jp\0kr\0pl\0pt\0ru\0es\0se\0";  			ArgsAdd(&argvP[argc], "-q", (lang + (gameInfoP->language - 1) * 3), &argc);  		} @@ -198,23 +260,29 @@ Boolean StartScummVM() {  		ArgsAdd(&argvP[argc], (gameInfoP->aspectRatio ? "--aspect-ratio" : "--no-aspect-ratio"), NULL, &argc);  		// gfx mode -		gVars->flipping.pageAddr1 = (UInt8 *)(BmpGetBits(WinGetBitmap(WinGetDisplayWindow()))); -		gVars->flipping.pageAddr2 = gVars->flipping.pageAddr1; // default if not flipping mode  		gVars->filter = gameInfoP->filter; -		switch (gameInfoP->gfxMode)	{ +		switch (gameInfoP->renderMode) {  			case 1: -				ArgsAdd(&argvP[argc], "-g", "flipping", &argc); -				gVars->flipping.pageAddr1 = (UInt8 *)WinScreenLock(winLockDontCare); -				WinScreenUnlock(); +				ArgsAdd(&argvP[argc], "--render-mode=", "amiga", &argc);  				break;  			case 2: -				ArgsAdd(&argvP[argc], "-g", "buffered", &argc); +				ArgsAdd(&argvP[argc], "--render-mode=", "cga", &argc);  				break;  			case 3: +				ArgsAdd(&argvP[argc], "--render-mode=", "ega", &argc); +				break; +			case 4: +				ArgsAdd(&argvP[argc], "--render-mode=", "hercAmber", &argc); +				break; +			case 5: +				ArgsAdd(&argvP[argc], "--render-mode=", "hercGreen", &argc); +				break; +		}		 + +		switch (gameInfoP->gfxMode)	{ +			case 1:  				ArgsAdd(&argvP[argc], "-g", "wide", &argc); -				gVars->flipping.pageAddr1 = (UInt8 *)WinScreenLock(winLockDontCare); -				WinScreenUnlock();  				break;  			default:  				ArgsAdd(&argvP[argc], "-g", "normal", &argc); @@ -233,26 +301,20 @@ Boolean StartScummVM() {  		}  		// not a PC version  		if (gameInfoP->setPlatform) { -			switch (gameInfoP->platform) { -				case 0: -					ArgsAdd(&argvP[argc], "--platform=", "amiga", &argc); -					break; -				case 1: -					ArgsAdd(&argvP[argc], "--platform=", "atari", &argc); -					break; -				case 2: -					ArgsAdd(&argvP[argc], "--platform=", "mac", &argc); -					break; -				case 3: -					ArgsAdd(&argvP[argc], "--platform=", "pc", &argc); -					break; -				case 4: -					ArgsAdd(&argvP[argc], "--platform=", "fmtowns", &argc); -					break; -				case 5: -					ArgsAdd(&argvP[argc], "--platform=", "windows", &argc); -					break; -			} +			static const char *platform[] = { +				"acorn", +				"amiga", +				"atari", +				"c64", +				"pc", +				"fmtowns", +				"linux", +				"mac", +				"nes", +				"segacd", +				"windows" +			}; +			ArgsAdd(&argvP[argc], "--platform=", platform[gameInfoP->platform], &argc);	  		}  		// subtitles @@ -267,6 +329,9 @@ Boolean StartScummVM() {  			// music tempo  			StrIToA(num, gameInfoP->musicInfo.sound.tempo);  			ArgsAdd(&argvP[argc], "--tempo=", num, &argc); +		} + +		if (engine == ENGINE_SCUMM || engine == ENGINE_SAGA) {  			// talk speed  			if (gameInfoP->talkSpeed) {  				StrIToA(num, gameInfoP->talkValue); @@ -275,14 +340,26 @@ Boolean StartScummVM() {  		}  		// music driver -		musicDriver =gameInfoP->musicInfo.sound.music; +		musicDriver = gameInfoP->musicInfo.sound.music;  		if (musicDriver) {  			switch (gameInfoP->musicInfo.sound.drvMusic) {  				case 0:	// NULL  					ArgsAdd(&argvP[argc], "-e", "null", &argc);  					break; -				case 1:	// built-in MIDI +				case 1: // AdLib +					ArgsAdd(&argvP[argc], "-e", "adlib", &argc); +					break; + +				case 2: // FM Towns +					ArgsAdd(&argvP[argc], "-e", "towns", &argc); +					break; + +				case 3: // IBM PCjr +					ArgsAdd(&argvP[argc], "-e", "pcjr", &argc); +					break; + +				case 4:	// built-in MIDI  					if (OPTIONS_TST(kOptDeviceZodiac))  						ArgsAdd(&argvP[argc], "-e", "zodiac", &argc);	// Tapwave Zodiac  					else if (OPTIONS_TST(kOptSonyPa1LibAPI)) @@ -291,23 +368,15 @@ Boolean StartScummVM() {  						ArgsAdd(&argvP[argc], "-e", "null", &argc);		// error, no music driver  					break; -				case 2: // PC Speaker +				case 5: // PC Speaker  					ArgsAdd(&argvP[argc], "-e", "pcspk", &argc);  					break; -				case 3: // IBM PCjr -					ArgsAdd(&argvP[argc], "-e", "pcjr", &argc); -				case 4: // FM Towns -					ArgsAdd(&argvP[argc], "-e", "towns", &argc); -				case 5: // AdLib -					ArgsAdd(&argvP[argc], "-e", "adlib", &argc); -			} +			}		  		}  		else	// NULL as default  			ArgsAdd(&argvP[argc], "-e", "null", &argc);  		// volume control -		StrIToA(num, gameInfoP->musicInfo.volume.master); -		ArgsAdd(&argvP[argc], "-o", num, &argc);  		StrIToA(num, gameInfoP->musicInfo.volume.sfx);  		ArgsAdd(&argvP[argc], "-s", num, &argc);  		StrIToA(num, gameInfoP->musicInfo.volume.music); @@ -317,18 +386,21 @@ Boolean StartScummVM() {  		// output rate  		if (gameInfoP->musicInfo.sound.sfx) { -			UInt32 rates[] = {8000, 11025, 22050}; +			UInt32 rates[] = {4000, 8000, 11025, 22050, 44100};  			StrIToA(num, rates[gameInfoP->musicInfo.sound.rate]);  			ArgsAdd(&argvP[argc], "--output-rate=", num, &argc);  		} +		// FM quality +		gVars->fmQuality = gameInfoP->fmQuality; +  		// game name  		ArgsAdd(&argvP[argc], gameInfoP->gameP, NULL, &argc);  		// use sound -		if (!gameInfoP->musicInfo.sound.sfx) { -			OPTIONS_RST(kOptSonyPa1LibAPI); -			OPTIONS_RST(kOptPalmSoundAPI); +		if (!gameInfoP->musicInfo.sound.sfx) { // FIXME : not the good way to do it +//			OPTIONS_RST(kOptSonyPa1LibAPI); +//			OPTIONS_RST(kOptPalmSoundAPI);  		}  		// others globals data @@ -338,9 +410,12 @@ Boolean StartScummVM() {  		gVars->CD.volume = gameInfoP->musicInfo.volume.audiocd;  		gVars->CD.defaultTrackLength = gameInfoP->musicInfo.sound.defaultTrackLength;  		gVars->CD.firstTrack = gameInfoP->musicInfo.sound.firstTrack; +		gVars->palmVolume = musicDriver ? gameInfoP->musicInfo.volume.palm : 0;  		MemHandleUnlock(recordH); -	} +	} // end no game / game selected + +	// common command line options  	// debug level  	if (gPrefs->debug) { @@ -353,43 +428,50 @@ Boolean StartScummVM() {  		if (gPrefs->altIntro)  			ArgsAdd(&argvP[argc], "--alt-intro", NULL, &argc);  	} - -	if (engine == ENGINE_SCUMM) { +	 +	if (engine == ENGINE_SCUMM || engine == ENGINE_SAGA) {  		// copy protection ?  		if (gPrefs->copyProtection)  			ArgsAdd(&argvP[argc], "--copy-protection", NULL, &argc); +	} +	 +	if (engine == ENGINE_SCUMM) {  		// demo mode ?  		if (gPrefs->demoMode)  			ArgsAdd(&argvP[argc], "--demo-mode", NULL, &argc);  	} +	// exceed max args ?  	if (argc > MAX_ARG)  		FrmCustomAlert(FrmErrorAlert, "Too many parameters.",0,0); +	// set some common options  	stackSize = (gPrefs->setStack ? STACK_LARGER : STACK_DEFAULT);  	lightspeed= (gPrefs->lightspeed.enable ? gPrefs->lightspeed.mode : 255);  	toLauncher= (gPrefs->exitLauncher); -	// gVars values +	// 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->VFS.volRefNum	= gPrefs->card.volRefNum; +	gVars->vibrator			= gPrefs->vibrator; +	gVars->stdPalette		= gPrefs->stdPalette; +	gVars->VFS.cacheSize	= (gPrefs->card.useCache ? gPrefs->card.cacheSize : 0); +	gVars->indicator.showLED= gPrefs->card.showLED; +	gVars->stylusClick		= gPrefs->stylusClick; +	gVars->autoSave			= (gPrefs->autoSave ? gPrefs->autoSavePeriod : -1); +	gVars->advancedMode		= gPrefs->advancedMode;  	// user params  	HWR_RSTALL(); - +	 +	if (gPrefs->goLCD) +		HWR_SET(INIT_GOLCD); +	else +		OPTIONS_RST(kOptGoLcdAPI); +	  	if (!gPrefs->autoOff)  		HWR_SET(INIT_AUTOOFF); -	if (!gPrefs->arm) { -		OPTIONS_RST(kOptDeviceARM); -		OPTIONS_RST(kOptDeviceProcX86); -	} else { -		HWR_SET(INIT_ARM); -	} -  	if (gVars->vibrator)  		HWR_SET(INIT_VIBRATOR); @@ -400,12 +482,26 @@ Boolean StartScummVM() {  		HWR_SET(INIT_PA1LIB);  	} -	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); +	if (ModImport(gVars->VFS.volRefNum, engine, &isARM) != errNone) { +		if (bDirectMode) { +			// and force exit if nothing selected +			EventType event; +			event.eType = keyDownEvent; +			event.data.keyDown.chr = vchrLaunch; +			event.data.keyDown.modifiers = commandKeyMask; +			EvtAddUniqueEventToQueue(&event, 0, true); +		}  		ArgsFree(argvP);  		return false;  	} +	// reset mode if screen rotation occured (DIA only) +	if (!direct && OPTIONS_TST(kOptCollapsible)) { +		UInt8 mode = PalmScreenSize(0,0, &(gVars->screenFullWidth), &(gVars->screenFullHeight)); +		OPTIONS_RST(kOptModeLandscape); +		OPTIONS_SET((mode == PALM_LANDSCAPE) ? kOptModeLandscape : kOptNone); +	} +  	// free and save globals pref memory  	GamCloseDatabase(false);  	FrmCloseAllForms(); @@ -423,7 +519,11 @@ Boolean StartScummVM() {  		cardNo = 0;  		dbID = DmFindDatabase(0, "ScummVM-Engine"); -		ModSetStack(stackSize, cardNo, dbID); + +		if (isARM) +			FtrSet(appFileCreator, ftrStack , (stackSize * 4)); +		else +			ModSetStack(stackSize, cardNo, dbID);  		cmdPBP->args.argc = argc;  		cmdPBP->args.argv = argvP;  | 
