diff options
Diffstat (limited to 'common/main.cpp')
-rw-r--r-- | common/main.cpp | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/common/main.cpp b/common/main.cpp new file mode 100644 index 0000000000..43fd2e4563 --- /dev/null +++ b/common/main.cpp @@ -0,0 +1,150 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001/2002 The ScummVM project + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + * + */ + +#include "stdafx.h" +#include "engine.h" +#include "scumm.h" +#include "sound/mididrv.h" +#include "gameDetector.h" +#include "simon/simon.h" +#include "config-file.h" + +GameDetector detector; + +Config *scummcfg = 0; + + +#if defined(QTOPIA) +// FIXME - why exactly is this needed? +extern "C" int main(int argc, char *argv[]); +#endif + +#if defined(MACOSX) || defined(QTOPIA) +#include <SDL.h> +#elif !defined(__MORPHOS__) +#undef main +#endif + +#if defined(UNIX) +#include <sys/param.h> +#ifndef MAXPATHLEN +#define MAXPATHLEN 256 +#endif +#define DEFAULT_CONFIG_FILE ".scummvmrc" +#else +#define DEFAULT_CONFIG_FILE "scummvm.ini" +#endif + +#if defined(UNIX) +#include <signal.h> + +#ifndef SCUMM_NEED_ALIGNMENT +static void handle_errors(int sig_num) { + error("Your system does not support unaligned memory accesses. Please rebuild with SCUMM_NEED_ALIGNMENT "); +} +#endif + +/* This function is here to test if the endianness / alignement compiled it is matching + with the one at run-time. */ +static void do_memory_test(void) { + unsigned char test[8] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 }; + unsigned int value; + /* First test endianness */ +#ifdef SCUMM_LITTLE_ENDIAN + if (*((int *) test) != 0x44332211) { + error("Compiled as LITTLE_ENDIAN on a big endian system. Please rebuild "); + } + value = 0x55443322; +#else + if (*((int *) test) != 0x11223344) { + error("Compiled as BIG_ENDIAN on a little endian system. Please rebuild "); + } + value = 0x22334455; +#endif + /* Then check if one really supports unaligned memory accesses */ +#ifndef SCUMM_NEED_ALIGNMENT + signal(SIGBUS, handle_errors); + signal(SIGABRT, handle_errors); + signal(SIGSEGV, handle_errors); + if (*((unsigned int *) ((char *) test + 1)) != value) { + error("Your system does not support unaligned memory accesses. Please rebuild with SCUMM_NEED_ALIGNMENT "); + } + signal(SIGBUS, SIG_DFL); + signal(SIGABRT, SIG_DFL); + signal(SIGSEGV, SIG_DFL); +#endif +} + +#endif + +int main(int argc, char *argv[]) +{ +#ifdef __DC__ + extern void dc_init_hardware(); + dc_init_hardware(); +#endif + +#if defined(UNIX) + /* On Unix, do a quick endian / alignement check before starting */ + do_memory_test(); + + char scummhome[MAXPATHLEN]; + if(getenv("HOME") != NULL) + sprintf(scummhome,"%s/%s", getenv("HOME"), DEFAULT_CONFIG_FILE); + else strcpy(scummhome,DEFAULT_CONFIG_FILE); +#else + char scummhome[255]; + #if defined (WIN32) && !defined(_WIN32_WCE) + GetWindowsDirectory(scummhome, 255); + strcat(scummhome, "\\"); + strcat(scummhome, DEFAULT_CONFIG_FILE); + #else + strcpy(scummhome,DEFAULT_CONFIG_FILE); + #endif +#endif + + scummcfg = new Config(scummhome, "scummvm"); + scummcfg->set("versioninfo", SCUMMVM_VERSION); + if (detector.detectMain(argc, argv)) + return (-1); + + OSystem *system = detector.createSystem(); + + { + char *s = detector.getGameName(); + OSystem::Property prop; + + prop.caption = s; + system->property(OSystem::PROP_SET_WINDOW_CAPTION, &prop); + free(s); + } + + // Create the game engine + Engine *engine = Engine::createFromDetector(&detector, system); + + // Run the game engine + engine->go(); + + delete scummcfg; + + return 0; +} |