/* 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 #elif !defined(__MORPHOS__) #undef main #endif #if defined(UNIX) #include #ifndef MAXPATHLEN #define MAXPATHLEN 256 #endif #define DEFAULT_CONFIG_FILE ".scummvmrc" #else #define DEFAULT_CONFIG_FILE "scummvm.ini" #endif #if defined(UNIX) #include #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; }