[Scummvm-cvs-logs] SF.net SVN: scummvm: [20656] scummvm/trunk/backends/PalmOS/Src/launch.cpp

chrilith at users.sourceforge.net chrilith at users.sourceforge.net
Sun Feb 12 12:14:03 CET 2006


Revision: 20656
Author:   chrilith
Date:     2006-02-12 12:13:08 -0800 (Sun, 12 Feb 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm?rev=20656&view=rev

Log Message:
-----------
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

Modified Paths:
--------------
    scummvm/trunk/backends/PalmOS/Src/launch.cpp
Modified: scummvm/trunk/backends/PalmOS/Src/launch.cpp
===================================================================
--- scummvm/trunk/backends/PalmOS/Src/launch.cpp	2006-02-12 19:57:23 UTC (rev 20655)
+++ scummvm/trunk/backends/PalmOS/Src/launch.cpp	2006-02-12 20:13:08 UTC (rev 20656)
@@ -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,35 +32,38 @@
 #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);	\
 	if (del_dbID)	\
@@ -56,7 +83,7 @@
 	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 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 @@
 	FrmSetActiveForm(frmP);
 	FrmDrawForm(frmP);
 
+	// In debug mode, the engine files are directly uploaded to the simulator
 #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();
+	// engine file ?
+	BUILD_FILE(engines[engine].fileP, ".engine");
+	CHECK_FILE("ScummVM engine file was not found !");
+	IMPRT_FILE("Cannot import engine 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);
+	// 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 @@
 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 @@
 	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 @@
 	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);
+		engine = LstGetSelection(listP);
+
 		FrmDeleteForm(frmP);
-
-		if (whichButton == EngineCancelButton)
+		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 @@
 		// build path
 		StrCopy(pathP,"/Palm/Programs/ScummVM/Games/");
 		if (gameInfoP->pathP[0] == '/')
-			StrCopy(pathP,gameInfoP->pathP);
-		else
-			StrCat(pathP,gameInfoP->pathP);
+			StrCopy(pathP, gameInfoP->pathP);
+		else if (!(gameInfoP->pathP[0] == '.' && StrLen(gameInfoP->pathP) == 1))
+			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);
-
 		// 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 @@
 		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 @@
 		}
 		// 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 @@
 			// 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 @@
 		}
 
 		// 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 @@
 						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 @@
 
 		// 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,10 +410,13 @@
 		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) {
 		StrIToA(num, gPrefs->debugLevel);
@@ -353,43 +428,50 @@
 		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 @@
 		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,8 +519,12 @@
 
 		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;
 		cmdPBP->gVars = gVars;







More information about the Scummvm-git-logs mailing list