summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--scripts/resources/emscripten/emscripten_post.js6
-rw-r--r--scripts/src/main.lua2
-rw-r--r--src/emu/machine.cpp84
-rw-r--r--src/emu/machine.h11
4 files changed, 71 insertions, 32 deletions
diff --git a/scripts/resources/emscripten/emscripten_post.js b/scripts/resources/emscripten/emscripten_post.js
index 92cbdd21f9b..10d4e1d5d35 100644
--- a/scripts/resources/emscripten/emscripten_post.js
+++ b/scripts/resources/emscripten/emscripten_post.js
@@ -1,8 +1,8 @@
// MAME-JavaScript function mappings
var JSMAME = JSMAME || {};
-JSMAME.get_machine = Module.cwrap('_Z14js_get_machinev', 'number');
-JSMAME.get_ui = Module.cwrap('_Z9js_get_uiv', 'number');
-JSMAME.get_sound = Module.cwrap('_Z12js_get_soundv', 'number');
+JSMAME.get_machine = Module.cwrap('_ZN15running_machine30emscripten_get_running_machineEv', 'number');
+JSMAME.get_ui = Module.cwrap('_ZN15running_machine17emscripten_get_uiEv', 'number');
+JSMAME.get_sound = Module.cwrap('_ZN15running_machine20emscripten_get_soundEv', 'number');
JSMAME.ui_set_show_fps = Module.cwrap('_ZN15mame_ui_manager12set_show_fpsEb', '', ['number', 'number']);
JSMAME.ui_get_show_fps = Module.cwrap('_ZNK15mame_ui_manager8show_fpsEv', 'number', ['number']);
JSMAME.sound_manager_mute = Module.cwrap('_ZN13sound_manager4muteEbh', '', ['number', 'number', 'number']);
diff --git a/scripts/src/main.lua b/scripts/src/main.lua
index 55976110628..6d63772b028 100644
--- a/scripts/src/main.lua
+++ b/scripts/src/main.lua
@@ -157,7 +157,7 @@ end
.. " -s TOTAL_MEMORY=268435456"
.. " -s DISABLE_EXCEPTION_CATCHING=2"
.. " -s EXCEPTION_CATCHING_WHITELIST='[\"__ZN15running_machine17start_all_devicesEv\",\"__ZN12cli_frontend7executeEiPPc\"]'"
- .. " -s EXPORTED_FUNCTIONS=\"['_main', '_malloc', '__Z14js_get_machinev', '__Z9js_get_uiv', '__Z12js_get_soundv', '__ZN15mame_ui_manager12set_show_fpsEb', '__ZNK15mame_ui_manager8show_fpsEv', '__ZN13sound_manager4muteEbh', '_SDL_PauseAudio', '_SDL_SendKeyboardKey']\""
+ .. " -s EXPORTED_FUNCTIONS=\"['_main', '_malloc', '__ZN15running_machine30emscripten_get_running_machineEv', '__ZN15running_machine17emscripten_get_uiEv', '__ZN15running_machine20emscripten_get_soundEv', '__ZN15mame_ui_manager12set_show_fpsEb', '__ZNK15mame_ui_manager8show_fpsEv', '__ZN13sound_manager4muteEbh', '_SDL_PauseAudio', '_SDL_SendKeyboardKey']\""
.. " --pre-js " .. _MAKE.esc(MAME_DIR) .. "src/osd/modules/sound/js_sound.js"
.. " --post-js " .. _MAKE.esc(MAME_DIR) .. "scripts/resources/emscripten/emscripten_post.js"
.. " --embed-file " .. _MAKE.esc(MAME_DIR) .. "bgfx/chains@bgfx/chains"
diff --git a/src/emu/machine.cpp b/src/emu/machine.cpp
index 7f8f532ddf7..6f7496e49d2 100644
--- a/src/emu/machine.cpp
+++ b/src/emu/machine.cpp
@@ -89,8 +89,6 @@
#if defined(EMSCRIPTEN)
#include <emscripten.h>
-
-void js_set_main_loop(running_machine * machine);
#endif
@@ -342,17 +340,18 @@ int running_machine::run(bool quiet)
export_http_api();
- // run the CPUs until a reset or exit
m_hard_reset_pending = false;
- while ((!m_hard_reset_pending && !m_exit_pending) || m_saveload_schedule != saveload_schedule::NONE)
- {
- g_profiler.start(PROFILER_EXTRA);
#if defined(EMSCRIPTEN)
- // break out to our async javascript loop and halt
- js_set_main_loop(this);
+ // break out to our async javascript loop and halt
+ emscripten_set_running_machine(this);
#endif
+ // run the CPUs until a reset or exit
+ while ((!m_hard_reset_pending && !m_exit_pending) || m_saveload_schedule != saveload_schedule::NONE)
+ {
+ g_profiler.start(PROFILER_EXTRA);
+
// execute CPUs if not paused
if (!m_paused)
m_scheduler.timeslice();
@@ -422,7 +421,6 @@ int running_machine::run(bool quiet)
return error;
}
-
//-------------------------------------------------
// schedule_exit - schedule a clean exit
//-------------------------------------------------
@@ -1316,41 +1314,71 @@ device_memory_interface::space_config_vector dummy_space_device::memory_space_co
#if defined(EMSCRIPTEN)
-static running_machine * jsmess_machine;
+running_machine * running_machine::emscripten_running_machine;
-void js_main_loop()
+void running_machine::emscripten_main_loop()
{
- if (jsmess_machine->paused()) {
- jsmess_machine->video().frame_update();
- return;
+ running_machine *machine = emscripten_running_machine;
+
+ g_profiler.start(PROFILER_EXTRA);
+
+ // execute CPUs if not paused
+ if (!machine->m_paused)
+ {
+ device_scheduler * scheduler;
+ scheduler = &(machine->scheduler());
+
+ // Emscripten will call this function at 60Hz, so step the simulation
+ // forward for the amount of time that has passed since the last frame
+ const attotime frametime(0,HZ_TO_ATTOSECONDS(60));
+ const attotime stoptime(scheduler->time() + frametime);
+
+ while (!machine->m_paused && !machine->scheduled_event_pending() && scheduler->time() < stoptime)
+ {
+ scheduler->timeslice();
+ // handle save/load
+ if (machine->m_saveload_schedule != saveload_schedule::NONE)
+ {
+ machine->handle_saveload();
+ break;
+ }
+ }
}
+ // otherwise, just pump video updates through
+ else
+ machine->m_video->frame_update();
- device_scheduler * scheduler;
- scheduler = &(jsmess_machine->scheduler());
- attotime stoptime(scheduler->time() + attotime(0,HZ_TO_ATTOSECONDS(60)));
- while (scheduler->time() < stoptime) {
- scheduler->timeslice();
+ // cancel the emscripten loop if the system has been told to exit
+ if (machine->exit_pending())
+ {
+ emscripten_cancel_main_loop();
}
+
+ g_profiler.stop();
}
-void js_set_main_loop(running_machine * machine) {
- jsmess_machine = machine;
+void running_machine::emscripten_set_running_machine(running_machine *machine)
+{
+ emscripten_running_machine = machine;
EM_ASM (
JSMESS.running = true;
);
- emscripten_set_main_loop(&js_main_loop, 0, 1);
+ emscripten_set_main_loop(&(emscripten_main_loop), 0, 1);
}
-running_machine * js_get_machine() {
- return jsmess_machine;
+running_machine * running_machine::emscripten_get_running_machine()
+{
+ return emscripten_running_machine;
}
-ui_manager * js_get_ui() {
- return &(jsmess_machine->ui());
+ui_manager * running_machine::emscripten_get_ui()
+{
+ return &(emscripten_running_machine->ui());
}
-sound_manager * js_get_sound() {
- return &(jsmess_machine->sound());
+sound_manager * running_machine::emscripten_get_sound()
+{
+ return &(emscripten_running_machine->sound());
}
#endif /* defined(EMSCRIPTEN) */
diff --git a/src/emu/machine.h b/src/emu/machine.h
index 6f7f77d58f0..595c1feb9da 100644
--- a/src/emu/machine.h
+++ b/src/emu/machine.h
@@ -396,6 +396,17 @@ private:
// configuration state
dummy_space_device m_dummy_space;
+
+#if defined(EMSCRIPTEN)
+private:
+ static running_machine *emscripten_running_machine;
+ static void emscripten_main_loop();
+public:
+ static void emscripten_set_running_machine(running_machine *machine);
+ static running_machine * emscripten_get_running_machine();
+ static ui_manager * emscripten_get_ui();
+ static sound_manager * emscripten_get_sound();
+#endif
};