summaryrefslogtreecommitdiffstats
path: root/src/core/core.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/core.h')
-rw-r--r--src/core/core.h148
1 files changed, 105 insertions, 43 deletions
diff --git a/src/core/core.h b/src/core/core.h
index ffbfa91c3..1015e8847 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -5,56 +5,118 @@
#pragma once
#include <memory>
+#include <string>
+
#include "common/common_types.h"
+#include "core/memory.h"
+class EmuWindow;
class ARM_Interface;
-////////////////////////////////////////////////////////////////////////////////////////////////////
+namespace Loader {
+class AppLoader;
+}
namespace Core {
-struct ThreadContext {
- u32 cpu_registers[13];
- u32 sp;
- u32 lr;
- u32 pc;
- u32 cpsr;
- u32 fpu_registers[64];
- u32 fpscr;
- u32 fpexc;
+class System {
+public:
+ /**
+ * Gets the instance of the System singleton class.
+ * @returns Reference to the instance of the System singleton class.
+ */
+ static System& GetInstance() {
+ return s_instance;
+ }
+
+ /// Enumeration representing the return values of the System Initialize and Load process.
+ enum class ResultStatus : u32 {
+ Success, ///< Succeeded
+ ErrorNotInitialized, ///< Error trying to use core prior to initialization
+ ErrorGetLoader, ///< Error finding the correct application loader
+ ErrorSystemMode, ///< Error determining the system mode
+ ErrorLoader, ///< Error loading the specified application
+ ErrorLoader_ErrorEncrypted, ///< Error loading the specified application due to encryption
+ ErrorLoader_ErrorInvalidFormat, ///< Error loading the specified application due to an
+ /// invalid format
+ ErrorVideoCore, ///< Error in the video core
+ };
+
+ /**
+ * Run the core CPU loop
+ * This function runs the core for the specified number of CPU instructions before trying to
+ * update hardware. This is much faster than SingleStep (and should be equivalent), as the CPU
+ * is not required to do a full dispatch with each instruction. NOTE: the number of instructions
+ * requested is not guaranteed to run, as this will be interrupted preemptively if a hardware
+ * update is requested (e.g. on a thread switch).
+ * @param tight_loop Number of instructions to execute.
+ * @return Result status, indicating whethor or not the operation succeeded.
+ */
+ ResultStatus RunLoop(int tight_loop = 1000);
+
+ /**
+ * Step the CPU one instruction
+ * @return Result status, indicating whethor or not the operation succeeded.
+ */
+ ResultStatus SingleStep();
+
+ /// Shutdown the emulated system.
+ void Shutdown();
+
+ /**
+ * Load an executable application.
+ * @param emu_window Pointer to the host-system window used for video output and keyboard input.
+ * @param filepath String path to the executable application to load on the host file system.
+ * @returns ResultStatus code, indicating if the operation succeeded.
+ */
+ ResultStatus Load(EmuWindow* emu_window, const std::string& filepath);
+
+ /**
+ * Indicates if the emulated system is powered on (all subsystems initialized and able to run an
+ * application).
+ * @returns True if the emulated system is powered on, otherwise false.
+ */
+ bool IsPoweredOn() const {
+ return cpu_core != nullptr;
+ }
+
+ /// Prepare the core emulation for a reschedule
+ void PrepareReschedule();
+
+ /**
+ * Gets a reference to the emulated CPU.
+ * @returns A reference to the emulated CPU.
+ */
+ ARM_Interface& CPU() {
+ return *cpu_core;
+ }
+
+private:
+ /**
+ * Initialize the emulated system.
+ * @param emu_window Pointer to the host-system window used for video output and keyboard input.
+ * @param system_mode The system mode.
+ * @return ResultStatus code, indicating if the operation succeeded.
+ */
+ ResultStatus Init(EmuWindow* emu_window, u32 system_mode);
+
+ /// Reschedule the core emulation
+ void Reschedule();
+
+ /// AppLoader used to load the current executing application
+ std::unique_ptr<Loader::AppLoader> app_loader;
+
+ ///< ARM11 CPU core
+ std::unique_ptr<ARM_Interface> cpu_core;
+
+ /// When true, signals that a reschedule should happen
+ bool reschedule_pending{};
+
+ static System s_instance;
};
-extern std::unique_ptr<ARM_Interface> g_app_core; ///< ARM11 application core
-extern std::unique_ptr<ARM_Interface> g_sys_core; ///< ARM11 system (OS) core
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/// Start the core
-void Start();
-
-/**
- * Run the core CPU loop
- * This function runs the core for the specified number of CPU instructions before trying to update
- * hardware. This is much faster than SingleStep (and should be equivalent), as the CPU is not
- * required to do a full dispatch with each instruction. NOTE: the number of instructions requested
- * is not guaranteed to run, as this will be interrupted preemptively if a hardware update is
- * requested (e.g. on a thread switch).
- */
-void RunLoop(int tight_loop = 1000);
-
-/// Step the CPU one instruction
-void SingleStep();
-
-/// Halt the core
-void Halt(const char* msg);
-
-/// Kill the core
-void Stop();
-
-/// Initialize the core
-void Init();
-
-/// Shutdown the core
-void Shutdown();
+static ARM_Interface& CPU() {
+ return System::GetInstance().CPU();
+}
-} // namespace
+} // namespace Core