//============================================================================ // // SSSS tt lll lll // SS SS tt ll ll // SS tttttt eeee ll ll aaaa // SSSS tt ee ee ll ll aa // SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" // SS SS tt ee ll ll aa aa // SSSS ttt eeeee llll llll aaaaa // // Copyright (c) 1995-2010 by Bradford W. Mott and the Stella Team // // See the file "License.txt" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // // $Id$ //============================================================================ #ifndef OSYSTEM_HXX #define OSYSTEM_HXX class Cartridge; class CheatManager; class CommandMenu; class Console; class Debugger; class Launcher; class Menu; class Properties; class PropertiesSet; class SerialPort; class Settings; class Sound; class StateManager; class VideoDialog; namespace GUI { class Font; } #include "Array.hxx" #include "EventHandler.hxx" #include "FrameBuffer.hxx" #include "bspf.hxx" struct Resolution { uInt32 width; uInt32 height; string name; }; typedef Common::Array ResolutionList; /** This class provides an interface for accessing operating system specific functions. It also comprises an overall parent object, to which all the other objects belong. @author Stephen Anthony @version $Id$ */ class OSystem { friend class EventHandler; friend class VideoDialog; public: /** Create a new OSystem abstract class */ OSystem(); /** Destructor */ virtual ~OSystem(); /** Create all child objects which belong to this OSystem */ virtual bool create(); public: /** Adds the specified settings object to the system. @param settings The settings object to add */ void attach(Settings* settings) { mySettings = settings; } /** Get the event handler of the system @return The event handler */ inline EventHandler& eventHandler() const { return *myEventHandler; } /** Get the frame buffer of the system @return The frame buffer */ inline FrameBuffer& frameBuffer() const { return *myFrameBuffer; } /** Get the sound object of the system @return The sound object */ inline Sound& sound() const { return *mySound; } /** Get the settings object of the system @return The settings object */ inline Settings& settings() const { return *mySettings; } /** Get the set of game properties for the system @return The properties set object */ inline PropertiesSet& propSet() const { return *myPropSet; } /** Get the console of the system. @return The console object */ inline Console& console() const { return *myConsole; } /** Get the serial port of the system. @return The serial port object */ inline SerialPort& serialPort() const { return *mySerialPort; } /** Get the settings menu of the system. @return The settings menu object */ inline Menu& menu() const { return *myMenu; } /** Get the command menu of the system. @return The command menu object */ inline CommandMenu& commandMenu() const { return *myCommandMenu; } /** Get the ROM launcher of the system. @return The launcher object */ inline Launcher& launcher() const { return *myLauncher; } /** Get the state manager of the system. @return The statemanager object */ inline StateManager& state() const { return *myStateManager; } #ifdef DEBUGGER_SUPPORT /** Get the ROM debugger of the system. @return The debugger object */ inline Debugger& debugger() const { return *myDebugger; } #endif #ifdef CHEATCODE_SUPPORT /** Get the cheat manager of the system. @return The cheatmanager object */ inline CheatManager& cheat() const { return *myCheatManager; } #endif /** Get the small font object of the system @return The font reference */ inline const GUI::Font& smallFont() const { return *mySmallFont; } /** Get the font object of the system @return The font reference */ inline const GUI::Font& font() const { return *myFont; } /** Get the launcher font object of the system @return The font reference */ inline const GUI::Font& launcherFont() const { return *myLauncherFont; } /** Get the console font object of the system @return The console font reference */ inline const GUI::Font& consoleFont() const { return *myConsoleFont; } /** Set the framerate for the video system. It's placed in this class since the mainLoop() method is defined here. @param framerate The video framerate to use */ virtual void setFramerate(float framerate); /** Set all config file paths for the OSystem. */ void setConfigPaths(); /** Set the user-interface palette which is specified in current settings. */ void setUIPalette(); /** Get the current framerate for the video system. @return The video framerate currently in use */ inline float frameRate() const { return myDisplayFrameRate; } /** Get the maximum dimensions of a window for the video hardware. */ inline uInt32 desktopWidth() const { return myDesktopWidth; } inline uInt32 desktopHeight() const { return myDesktopHeight; } /** Get the supported fullscreen resolutions for the video hardware. @return An array of supported resolutions */ const ResolutionList& supportedResolutions() const { return myResolutions; } /** Return the default full/complete directory name for storing data. */ const string& baseDir() const { return myBaseDir; } /** Return the full/complete directory name for storing state files. */ const string& stateDir() const { return myStateDir; } /** Return the full/complete directory name for storing PNG snapshots. */ const string& snapshotDir() const { return mySnapshotDir; } /** Return the full/complete directory name for storing EEPROM files. */ const string& eepromDir() const { return myEEPROMDir; } /** This method should be called to get the full path of the cheat file. @return String representing the full path of the cheat filename. */ const string& cheatFile() const { return myCheatFile; } /** This method should be called to get the full path of the config file. @return String representing the full path of the config filename. */ const string& configFile() const { return myConfigFile; } /** This method should be called to get the full path of the (optional) palette file. @return String representing the full path of the properties filename. */ const string& paletteFile() const { return myPaletteFile; } /** This method should be called to get the full path of the properties file (stella.pro). @return String representing the full path of the properties filename. */ const string& propertiesFile() const { return myPropertiesFile; } /** This method should be called to get the full path of the currently loaded ROM. @return String representing the full path of the ROM file. */ const string& romFile() const { return myRomFile; } /** Creates a new game console from the specified romfile, and correctly initializes the system state to start emulation of the Console. @param romfile The full pathname of the ROM to use @param md5 The MD5sum of the ROM @return True on successful creation, otherwise false */ bool createConsole(const string& romfile = "", const string& md5 = ""); /** Deletes the currently defined console, if it exists. Also prints some statistics (fps, total frames, etc). */ void deleteConsole(); /** Creates a new ROM launcher, to select a new ROM to emulate. @return True on successful creation, otherwise false */ bool createLauncher(); /** Gets all possible info about the ROM by creating a temporary Console object and querying it. @param romfile The full pathname of the ROM to use @return Some information about this ROM */ string getROMInfo(const string& romfile); /** The features which are conditionally compiled into Stella. @return The supported features */ const string& features() const { return myFeatures; } /** The build information for Stella (SDL version, architecture, etc). @return The build info */ const string& buildInfo() const { return myBuildInfo; } /** Calculate the MD5sum of the given file. @param filename Filename of potential ROM file */ string MD5FromFile(const string& filename); /** Issue a quit event to the OSystem. */ void quit() { myQuitLoop = true; } public: ////////////////////////////////////////////////////////////////////// // The following methods are system-specific and must be implemented // in derived classes. ////////////////////////////////////////////////////////////////////// /** This method returns number of ticks in microseconds. @return Current time in microseconds. */ virtual uInt64 getTicks() const; ////////////////////////////////////////////////////////////////////// // The following methods are system-specific and can be overrided in // derived classes. Otherwise, the base methods will be used. ////////////////////////////////////////////////////////////////////// /** This method runs the main loop. Since different platforms may use different timing methods and/or algorithms, this method can be overrided. However, the port then takes all responsibility for running the emulation and taking care of timing. */ virtual void mainLoop(); /** This method determines the default mapping of joystick buttons to Stella events for a specific system/platform. */ virtual void setDefaultJoymap(); /** This method determines the default mapping of joystick axis to Stella events for a specific system/platform. */ virtual void setDefaultJoyAxisMap(); /** This method determines the default mapping of joystick hats to Stella events for a specific system/platform. */ virtual void setDefaultJoyHatMap(); /** This method creates events from platform-specific hardware. */ virtual void pollEvent(); /** This method answers whether the given button as already been handled by the pollEvent() method, and as such should be ignored in the main event handler. */ virtual bool joyButtonHandled(int button); /** Informs the OSystem of a change in EventHandler state. */ virtual void stateChanged(EventHandler::State state); protected: /** Query the OSystem video hardware for resolution information. */ virtual bool queryVideoHardware(); /** Set the base directory for all Stella files (these files may be located in other places through settings). */ void setBaseDir(const string& basedir); /** Set the locations of config file */ void setConfigFile(const string& file); protected: // Pointer to the EventHandler object EventHandler* myEventHandler; // Pointer to the FrameBuffer object FrameBuffer* myFrameBuffer; // Pointer to the Sound object Sound* mySound; // Pointer to the Settings object Settings* mySettings; // Pointer to the PropertiesSet object PropertiesSet* myPropSet; // Pointer to the (currently defined) Console object Console* myConsole; // Pointer to the serial port object SerialPort* mySerialPort; // Pointer to the Menu object Menu* myMenu; // Pointer to the CommandMenu object CommandMenu* myCommandMenu; // Pointer to the Launcher object Launcher* myLauncher; // Pointer to the Debugger object Debugger* myDebugger; // Pointer to the CheatManager object CheatManager* myCheatManager; // Pointer to the StateManager object StateManager* myStateManager; // Maximum dimensions of the desktop area uInt32 myDesktopWidth, myDesktopHeight; // Supported fullscreen resolutions ResolutionList myResolutions; // Number of times per second to iterate through the main loop float myDisplayFrameRate; // Time per frame for a video update, based on the current framerate uInt32 myTimePerFrame; // Indicates whether to stop the main loop bool myQuitLoop; private: enum { kNumUIPalettes = 2 }; string myBaseDir; string myStateDir; string mySnapshotDir; string myEEPROMDir; string myCheatFile; string myConfigFile; string myPaletteFile; string myPropertiesFile; string myRomFile; string myRomMD5; string myFeatures; string myBuildInfo; // The font object to use when space is very limited GUI::Font* mySmallFont; // The font object to use for the normal in-game GUI GUI::Font* myFont; // The font object to use for the ROM launcher GUI::Font* myLauncherFont; // The font object to use for the console/debugger GUI::Font* myConsoleFont; // Indicates whether the main processing loop should proceed struct TimingInfo { uInt64 start; uInt64 current; uInt64 virt; uInt64 totalTime; uInt64 totalFrames; }; TimingInfo myTimingInfo; // Table of RGB values for GUI elements static uInt32 ourGUIColors[kNumUIPalettes][kNumColors-256]; private: /** Creates the various framebuffers/renderers available in this system (for now, that means either 'software' or 'opengl'). Note that it will only create one type per run of Stella. @return Success or failure of the framebuffer creation */ bool createFrameBuffer(); /** Creates the various sound devices available in this system (for now, that means either 'SDL' or 'Null'). */ void createSound(); /** Creates an actual Console object based on the given info. @param romfile The full pathname of the ROM to use @param md5 The MD5sum of the ROM @return The actual Console object, otherwise NULL (calling method is responsible for deleting it) */ Console* openConsole(const string& romfile, string& md5); /** Open the given ROM and return an array containing its contents. Also, the properties database is updated with a valid ROM name for this ROM (if necessary). @param rom The absolute pathname of the ROM file @param md5 The md5 calculated from the ROM file (will be recalculated if necessary) @param size The amount of data read into the image array @return Pointer to the array, with size >=0 indicating valid data (calling method is responsible for deleting it) */ uInt8* openROM(string rom, string& md5, uInt32& size); /** Gets all possible info about the given console. @param console The console to use @return Some information about this console */ string getROMInfo(const Console* console); /** Initializes the timing so that the mainloop is reset to its initial values. */ void resetLoopTiming(); // Copy constructor isn't supported by this class so make it private OSystem(const OSystem&); // Assignment operator isn't supported by this class so make it private OSystem& operator = (const OSystem&); }; #endif