diff --git a/scripts/src/osd/modules.lua b/scripts/src/osd/modules.lua --- a/scripts/src/osd/modules.lua +++ b/scripts/src/osd/modules.lua @@ -69,6 +69,7 @@ MAME_DIR .. "src/osd/modules/debugger/debugkeyconfig.h", MAME_DIR .. "src/osd/modules/debugger/debuggdbstub.cpp", MAME_DIR .. "src/osd/modules/debugger/debugimgui.cpp", + MAME_DIR .. "src/osd/modules/debugger/sdbg.cpp", MAME_DIR .. "src/osd/modules/debugger/debugwin.cpp", MAME_DIR .. "src/osd/modules/debugger/none.cpp", MAME_DIR .. "src/osd/modules/debugger/xmlconfig.cpp", diff --git a/scripts/src/osd/mac.lua b/scripts/src/osd/mac.lua --- a/scripts/src/osd/mac.lua +++ b/scripts/src/osd/mac.lua @@ -78,6 +78,7 @@ files { MAME_DIR .. "src/osd/modules/debugger/debugosx.mm", + MAME_DIR .. "src/osd/modules/debugger/sdbgmac.mm", MAME_DIR .. "src/osd/modules/debugger/osx/breakpointsview.mm", MAME_DIR .. "src/osd/modules/debugger/osx/breakpointsview.h", MAME_DIR .. "src/osd/modules/debugger/osx/consoleview.mm", diff --git a/src/osd/modules/debugger/sdbg.cpp b/src/osd/modules/debugger/sdbg.cpp new file mode 100644 --- /dev/null +++ b/src/osd/modules/debugger/sdbg.cpp @@ -0,0 +1,72 @@ +// license:BSD-3-Clause +// copyright-holders:Sprinter C-Compiler contributors +//============================================================ +// +// sdbg.cpp - headless debugger wait loop for an external DAP bridge +// +//============================================================ + +#include "emu.h" +#include "debug_module.h" +#include "modules/lib/osdobj_common.h" + +#if defined(OSD_MAC) +void sdbg_poll_mac_events(); +#endif + + +namespace osd { + +namespace { + +class debug_sdbg : public osd_module, public debug_module +{ +public: + debug_sdbg() : osd_module(OSD_DEBUG_PROVIDER, "sdbg"), debug_module(), + m_osd(nullptr), m_next_host_poll(0) + { } + + virtual int init(osd_interface &osd, const osd_options &options) override + { + m_osd = &dynamic_cast(osd); + return 0; + } + virtual void exit() override { } + + virtual void init_debugger(running_machine &machine) override { } + virtual void wait_for_debugger(device_t &device, bool firststop) override; + virtual void debugger_update() override { } + +private: + osd_common_t *m_osd; + osd_ticks_t m_next_host_poll; +}; + +void debug_sdbg::wait_for_debugger(device_t &device, bool firststop) +{ + // debugger_cpu::wait_for_debugger вызывает Lua periodic перед каждым + // обращением сюда. Короткий sleep исключает busy-loop, после возврата + // внешний bridge получает следующую возможность обработать RPC. + // Без обработки событий окон macOS считает MAME зависшим, пока CPU + // удерживается на точке VS Code. 100 Hz достаточно для Dock/Cmd-Tab. + osd_ticks_t const current = osd_ticks(); + if (current >= m_next_host_poll) + { +#if defined(OSD_MAC) + sdbg_poll_mac_events(); +#else + // Текущий mame.arm собран на SDL3: pump + poll необходимы, + // поскольку обычный frame_update не выполняется при остановке CPU. + m_osd->input_update(false); + m_osd->process_events(); +#endif + m_next_host_poll = current + osd_ticks_per_second() / 100; + } + osd_sleep(osd_ticks_per_second() / 1000); +} + +} // anonymous namespace + +} // namespace osd + +MODULE_DEFINITION(DEBUG_SDBG, osd::debug_sdbg) diff --git a/src/osd/modules/debugger/sdbgmac.mm b/src/osd/modules/debugger/sdbgmac.mm new file mode 100644 --- /dev/null +++ b/src/osd/modules/debugger/sdbgmac.mm @@ -0,0 +1,14 @@ +// license:BSD-3-Clause +// copyright-holders:Sprinter C-Compiler contributors +// Прокачка событий Cocoa в headless debugger без окна штатного debugger. + +#import + +extern void MacPollInputs(); + +void sdbg_poll_mac_events() +{ + NSAutoreleasePool *const pool = [[NSAutoreleasePool alloc] init]; + MacPollInputs(); + [pool release]; +} diff --git a/src/osd/modules/lib/osdobj_common.cpp b/src/osd/modules/lib/osdobj_common.cpp --- a/src/osd/modules/lib/osdobj_common.cpp +++ b/src/osd/modules/lib/osdobj_common.cpp @@ -282,6 +282,7 @@ REGISTER_MODULE(m_mod_man, DEBUG_QT); REGISTER_MODULE(m_mod_man, DEBUG_IMGUI); REGISTER_MODULE(m_mod_man, DEBUG_GDBSTUB); + REGISTER_MODULE(m_mod_man, DEBUG_SDBG); REGISTER_MODULE(m_mod_man, DEBUG_NONE); #endif