diff options
Diffstat (limited to 'src/emu/mame.cpp')
-rw-r--r-- | src/emu/mame.cpp | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/src/emu/mame.cpp b/src/emu/mame.cpp new file mode 100644 index 00000000000..220ced70a7a --- /dev/null +++ b/src/emu/mame.cpp @@ -0,0 +1,252 @@ +// license:BSD-3-Clause +// copyright-holders:Nicola Salmoria, Aaron Giles +/*************************************************************************** + + mame.c + + Controls execution of the core MAME system. +**************************************************************************** + + Since there has been confusion in the past over the order of + initialization and other such things, here it is, all spelled out + as of January, 2008: + + main() + - does platform-specific init + - calls mame_execute() [mame.c] + + mame_execute() [mame.c] + - calls mame_validitychecks() [validity.c] to perform validity checks on all compiled drivers + - begins resource tracking (level 1) + - calls create_machine [mame.c] to initialize the running_machine structure + - calls init_machine() [mame.c] + + init_machine() [mame.c] + - calls fileio_init() [fileio.c] to initialize file I/O info + - calls config_init() [config.c] to initialize configuration system + - calls input_init() [input.c] to initialize the input system + - calls output_init() [output.c] to initialize the output system + - calls state_init() [state.c] to initialize save state system + - calls state_save_allow_registration() [state.c] to allow registrations + - calls palette_init() [palette.c] to initialize palette system + - calls render_init() [render.c] to initialize the rendering system + - calls ui_init() [ui.c] to initialize the user interface + - calls generic_machine_init() [machine/generic.c] to initialize generic machine structures + - calls generic_video_init() [video/generic.c] to initialize generic video structures + - calls generic_sound_init() [audio/generic.c] to initialize generic sound structures + - calls timer_init() [timer.c] to reset the timer system + - calls osd_init() [osdepend.h] to do platform-specific initialization + - calls input_port_init() [inptport.c] to set up the input ports + - calls rom_init() [romload.c] to load the game's ROMs + - calls memory_init() [memory.c] to process the game's memory maps + - calls watchdog_init() [watchdog.c] to initialize the watchdog system + - calls the driver's DRIVER_INIT callback + - calls device_list_start() [devintrf.c] to start any devices + - calls video_init() [video.c] to start the video system + - calls tilemap_init() [tilemap.c] to start the tilemap system + - calls crosshair_init() [crsshair.c] to configure the crosshairs + - calls sound_init() [sound.c] to start the audio system + - calls debugger_init() [debugger.c] to set up the debugger + - calls the driver's MACHINE_START, SOUND_START, and VIDEO_START callbacks + - calls cheat_init() [cheat.c] to initialize the cheat system + - calls image_init() [image.c] to initialize the image system + + - calls config_load_settings() [config.c] to load the configuration file + - calls nvram_load [machine/generic.c] to load NVRAM + - calls ui_display_startup_screens() [ui.c] to display the startup screens + - begins resource tracking (level 2) + - calls soft_reset() [mame.c] to reset all systems + + -------------------( at this point, we're up and running )---------------------- + + - calls scheduler->timeslice() [schedule.c] over and over until we exit + - ends resource tracking (level 2), freeing all auto_mallocs and timers + - calls the nvram_save() [machine/generic.c] to save NVRAM + - calls config_save_settings() [config.c] to save the game's configuration + - calls all registered exit routines [mame.c] + - ends resource tracking (level 1), freeing all auto_mallocs and timers + + - exits the program + +***************************************************************************/ + +#include "emu.h" +#include "emuopts.h" +#include "osdepend.h" +#include "config.h" +#include "debugger.h" +#include "render.h" +#include "cheat.h" +#include "ui/ui.h" +#include "uiinput.h" +#include "crsshair.h" +#include "validity.h" +#include "debug/debugcon.h" +#include "luaengine.h" +#include <time.h> + +//************************************************************************** +// MACHINE MANAGER +//************************************************************************** + +machine_manager* machine_manager::m_manager = NULL; + +osd_interface &machine_manager::osd() const +{ + return m_osd; +} + + +machine_manager* machine_manager::instance(emu_options &options,osd_interface &osd) +{ + if(!m_manager) + { + m_manager = global_alloc(machine_manager(options,osd)); + } + return m_manager; +} + +machine_manager* machine_manager::instance() +{ + return m_manager; +} + +//------------------------------------------------- +// machine_manager - constructor +//------------------------------------------------- + +machine_manager::machine_manager(emu_options &options,osd_interface &osd) + : m_osd(osd), + m_options(options), + m_lua(global_alloc(lua_engine)), + m_new_driver_pending(NULL), + m_machine(NULL) +{ +} + + +//------------------------------------------------- +// ~machine_manager - destructor +//------------------------------------------------- + +machine_manager::~machine_manager() +{ + global_free(m_lua); + m_manager = NULL; +} + + +/*************************************************************************** + GLOBAL VARIABLES +***************************************************************************/ + +//------------------------------------------------- +// mame_schedule_new_driver - schedule a new game to +// be loaded +//------------------------------------------------- + +void machine_manager::schedule_new_driver(const game_driver &driver) +{ + m_new_driver_pending = &driver; +} + + +/*************************************************************************** + CORE IMPLEMENTATION +***************************************************************************/ +void machine_manager::update_machine() +{ + m_lua->set_machine(m_machine); +} + +/*------------------------------------------------- + execute - run the core emulation +-------------------------------------------------*/ + +int machine_manager::execute() +{ + bool started_empty = false; + + bool firstgame = true; + bool firstrun = true; + + // loop across multiple hard resets + bool exit_pending = false; + int error = MAMERR_NONE; + + m_lua->initialize(); + while (error == MAMERR_NONE && !exit_pending) + { + m_new_driver_pending = NULL; + + // if no driver, use the internal empty driver + const game_driver *system = m_options.system(); + if (system == NULL) + { + system = &GAME_NAME(___empty); + if (firstgame) + started_empty = true; + } + + firstgame = false; + + // parse any INI files as the first thing + if (m_options.read_config()) + { + m_options.revert(OPTION_PRIORITY_INI); + std::string errors; + m_options.parse_standard_inis(errors); + } + + // otherwise, perform validity checks before anything else + if (system != NULL) + { + validity_checker valid(m_options); + valid.check_shared_source(*system); + } + + // create the machine configuration + machine_config config(*system, m_options); + + // create the machine structure and driver + running_machine machine(config, *this); + + set_machine(&machine); + + // run the machine + error = machine.run(firstrun); + firstrun = false; + + // check the state of the machine + if (m_new_driver_pending) + { + std::string old_system_name(m_options.system_name()); + bool new_system = (old_system_name.compare(m_new_driver_pending->name)!=0); + // first: if we scheduled a new system, remove device options of the old system + // notice that, if we relaunch the same system, there is no effect on the emulation + if (new_system) + m_options.remove_device_options(); + // second: set up new system name (and the related device options) + m_options.set_system_name(m_new_driver_pending->name); + // third: if we scheduled a new system, take also care of ramsize options + if (new_system) + { + std::string error_string; + m_options.set_value(OPTION_RAMSIZE, "", OPTION_PRIORITY_CMDLINE, error_string); + } + firstrun = true; + } + else + { + if (machine.exit_pending()) m_options.set_system_name(""); + } + + if (machine.exit_pending() && (!started_empty || (system == &GAME_NAME(___empty)))) + exit_pending = true; + + // machine will go away when we exit scope + set_machine(NULL); + } + // return an error + return error; +} |