diff options
Diffstat (limited to 'src/osd/modules/debugger/debugosx.mm')
-rw-r--r-- | src/osd/modules/debugger/debugosx.mm | 284 |
1 files changed, 182 insertions, 102 deletions
diff --git a/src/osd/modules/debugger/debugosx.mm b/src/osd/modules/debugger/debugosx.mm index 60599415e69..0c0cbb60337 100644 --- a/src/osd/modules/debugger/debugosx.mm +++ b/src/osd/modules/debugger/debugosx.mm @@ -18,6 +18,7 @@ // MAME headers #include "emu.h" +#include "config.h" #include "debugger.h" // MAMEOS headers @@ -39,10 +40,11 @@ class debugger_osx : public osd_module, public debug_module { public: - debugger_osx() - : osd_module(OSD_DEBUG_PROVIDER, "osx"), debug_module(), - m_machine(nullptr), - m_console(nil) + debugger_osx() : + osd_module(OSD_DEBUG_PROVIDER, "osx"), + debug_module(), + m_machine(nullptr), + m_console(nil) { } @@ -60,6 +62,11 @@ public: virtual void debugger_update(); private: + void create_console(); + void build_menus(); + void config_load(config_type cfgtype, util::xml::data_node const *parentnode); + void config_save(config_type cfgtype, util::xml::data_node *parentnode); + running_machine *m_machine; MAMEDebugConsole *m_console; @@ -70,8 +77,10 @@ MODULE_DEFINITION(DEBUG_OSX, debugger_osx) std::atomic_bool debugger_osx::s_added_menus(false); + //============================================================ // debugger_osx::init +// initialise debugger module //============================================================ int debugger_osx::init(const osd_options &options) @@ -79,38 +88,47 @@ int debugger_osx::init(const osd_options &options) return 0; } + //============================================================ // debugger_osx::exit +// clean up debugger module //============================================================ void debugger_osx::exit() { - NSAutoreleasePool *const pool = [[NSAutoreleasePool alloc] init]; if (m_console) { + NSAutoreleasePool *const pool = [[NSAutoreleasePool alloc] init]; NSDictionary *info = [NSDictionary dictionaryWithObject:[NSValue valueWithPointer:m_machine] - forKey:@"MAMEDebugMachine"]; + forKey:@"MAMEDebugMachine"]; [[NSNotificationCenter defaultCenter] postNotificationName:MAMEHideDebuggerNotification object:m_console userInfo:info]; [m_console release]; m_console = nil; m_machine = nullptr; + [pool release]; } - [pool release]; } //============================================================ // debugger_osx::init_debugger +// attach debugger module to a machine //============================================================ void debugger_osx::init_debugger(running_machine &machine) { m_machine = &machine; + machine.configuration().config_register( + "debugger", + config_load_delegate(&debugger_osx::config_load, this), + config_save_delegate(&debugger_osx::config_save, this)); } + //============================================================ // debugger_osx::wait_for_debugger +// perform debugger event processing //============================================================ void debugger_osx::wait_for_debugger(device_t &device, bool firststop) @@ -118,100 +136,7 @@ void debugger_osx::wait_for_debugger(device_t &device, bool firststop) NSAutoreleasePool *const pool = [[NSAutoreleasePool alloc] init]; // create a console window - if (m_console == nil) - { - if (!s_added_menus.exchange(true, std::memory_order_relaxed)) - { - NSMenuItem *item; - - NSMenu *const debugMenu = [[NSMenu allocWithZone:[NSMenu menuZone]] initWithTitle:@"Debug"]; - item = [[NSApp mainMenu] insertItemWithTitle:@"Debug" action:NULL keyEquivalent:@"" atIndex:1]; - [item setSubmenu:debugMenu]; - [debugMenu release]; - - [debugMenu addItemWithTitle:@"New Memory Window" - action:@selector(debugNewMemoryWindow:) - keyEquivalent:@"d"]; - [debugMenu addItemWithTitle:@"New Disassembly Window" - action:@selector(debugNewDisassemblyWindow:) - keyEquivalent:@"a"]; - [debugMenu addItemWithTitle:@"New Error Log Window" - action:@selector(debugNewErrorLogWindow:) - keyEquivalent:@"l"]; - [debugMenu addItemWithTitle:@"New (Break|Watch)points Window" - action:@selector(debugNewPointsWindow:) - keyEquivalent:@"b"]; - [debugMenu addItemWithTitle:@"New Devices Window" - action:@selector(debugNewDevicesWindow:) - keyEquivalent:@"D"]; - - [debugMenu addItem:[NSMenuItem separatorItem]]; - - [[debugMenu addItemWithTitle:@"Soft Reset" - action:@selector(debugSoftReset:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF3FunctionKey]] - setKeyEquivalentModifierMask:0]; - [[debugMenu addItemWithTitle:@"Hard Reset" - action:@selector(debugHardReset:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF3FunctionKey]] - setKeyEquivalentModifierMask:NSShiftKeyMask]; - - NSMenu *const runMenu = [[NSMenu allocWithZone:[NSMenu menuZone]] initWithTitle:@"Run"]; - item = [[NSApp mainMenu] insertItemWithTitle:@"Run" - action:NULL - keyEquivalent:@"" - atIndex:([[NSApp mainMenu] indexOfItemWithSubmenu:debugMenu] + 1)]; - [item setSubmenu:runMenu]; - [runMenu release]; - - [runMenu addItemWithTitle:@"Break" - action:@selector(debugBreak:) - keyEquivalent:@""]; - - [runMenu addItem:[NSMenuItem separatorItem]]; - - [[runMenu addItemWithTitle:@"Run" - action:@selector(debugRun:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF5FunctionKey]] - setKeyEquivalentModifierMask:0]; - [[runMenu addItemWithTitle:@"Run and Hide Debugger" - action:@selector(debugRunAndHide:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF12FunctionKey]] - setKeyEquivalentModifierMask:0]; - [[runMenu addItemWithTitle:@"Run to Next CPU" - action:@selector(debugRunToNextCPU:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF6FunctionKey]] - setKeyEquivalentModifierMask:0]; - [[runMenu addItemWithTitle:@"Run until Next Interrupt on Current CPU" - action:@selector(debugRunToNextInterrupt:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF7FunctionKey]] - setKeyEquivalentModifierMask:0]; - [[runMenu addItemWithTitle:@"Run until Next VBLANK" - action:@selector(debugRunToNextVBLANK:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF8FunctionKey]] - setKeyEquivalentModifierMask:0]; - [[runMenu addItemWithTitle:@"Run to Cursor" - action:@selector(debugRunToCursor:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF4FunctionKey]] - setKeyEquivalentModifierMask:0]; - - [runMenu addItem:[NSMenuItem separatorItem]]; - - [[runMenu addItemWithTitle:@"Step Into" - action:@selector(debugStepInto:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF11FunctionKey]] - setKeyEquivalentModifierMask:0]; - [[runMenu addItemWithTitle:@"Step Over" - action:@selector(debugStepOver:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF10FunctionKey]] - setKeyEquivalentModifierMask:0]; - [[runMenu addItemWithTitle:@"Step Out" - action:@selector(debugStepOut:) - keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF10FunctionKey]] - setKeyEquivalentModifierMask:NSShiftKeyMask]; - } - m_console = [[MAMEDebugConsole alloc] initWithMachine:*m_machine]; - } + create_console(); // make sure the debug windows are visible if (firststop) @@ -239,9 +164,164 @@ void debugger_osx::wait_for_debugger(device_t &device, bool firststop) //============================================================ -// debugger_update +// debugger_osx::debugger_update //============================================================ void debugger_osx::debugger_update() { } + + +//============================================================ +// debugger_osx::create_console +// create main debugger window if we haven't already done so +//============================================================ + +void debugger_osx::create_console() +{ + if (m_console == nil) + { + build_menus(); + m_console = [[MAMEDebugConsole alloc] initWithMachine:*m_machine]; + } +} + + +//============================================================ +// debugger_osx::build_menus +// extend global menu bar with debugging options +//============================================================ + +void debugger_osx::build_menus() +{ + if (!s_added_menus.exchange(true, std::memory_order_relaxed)) + { + NSMenuItem *item; + + NSMenu *const debugMenu = [[NSMenu allocWithZone:[NSMenu menuZone]] initWithTitle:@"Debug"]; + item = [[NSApp mainMenu] insertItemWithTitle:@"Debug" action:NULL keyEquivalent:@"" atIndex:1]; + [item setSubmenu:debugMenu]; + [debugMenu release]; + + [debugMenu addItemWithTitle:@"New Memory Window" + action:@selector(debugNewMemoryWindow:) + keyEquivalent:@"d"]; + [debugMenu addItemWithTitle:@"New Disassembly Window" + action:@selector(debugNewDisassemblyWindow:) + keyEquivalent:@"a"]; + [debugMenu addItemWithTitle:@"New Error Log Window" + action:@selector(debugNewErrorLogWindow:) + keyEquivalent:@"l"]; + [debugMenu addItemWithTitle:@"New (Break|Watch)points Window" + action:@selector(debugNewPointsWindow:) + keyEquivalent:@"b"]; + [debugMenu addItemWithTitle:@"New Devices Window" + action:@selector(debugNewDevicesWindow:) + keyEquivalent:@"D"]; + + [debugMenu addItem:[NSMenuItem separatorItem]]; + + [[debugMenu addItemWithTitle:@"Soft Reset" + action:@selector(debugSoftReset:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF3FunctionKey]] + setKeyEquivalentModifierMask:0]; + [[debugMenu addItemWithTitle:@"Hard Reset" + action:@selector(debugHardReset:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF3FunctionKey]] + setKeyEquivalentModifierMask:NSShiftKeyMask]; + + NSMenu *const runMenu = [[NSMenu allocWithZone:[NSMenu menuZone]] initWithTitle:@"Run"]; + item = [[NSApp mainMenu] insertItemWithTitle:@"Run" + action:NULL + keyEquivalent:@"" + atIndex:([[NSApp mainMenu] indexOfItemWithSubmenu:debugMenu] + 1)]; + [item setSubmenu:runMenu]; + [runMenu release]; + + [runMenu addItemWithTitle:@"Break" + action:@selector(debugBreak:) + keyEquivalent:@""]; + + [runMenu addItem:[NSMenuItem separatorItem]]; + + [[runMenu addItemWithTitle:@"Run" + action:@selector(debugRun:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF5FunctionKey]] + setKeyEquivalentModifierMask:0]; + [[runMenu addItemWithTitle:@"Run and Hide Debugger" + action:@selector(debugRunAndHide:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF12FunctionKey]] + setKeyEquivalentModifierMask:0]; + [[runMenu addItemWithTitle:@"Run to Next CPU" + action:@selector(debugRunToNextCPU:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF6FunctionKey]] + setKeyEquivalentModifierMask:0]; + [[runMenu addItemWithTitle:@"Run until Next Interrupt on Current CPU" + action:@selector(debugRunToNextInterrupt:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF7FunctionKey]] + setKeyEquivalentModifierMask:0]; + [[runMenu addItemWithTitle:@"Run until Next VBLANK" + action:@selector(debugRunToNextVBLANK:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF8FunctionKey]] + setKeyEquivalentModifierMask:0]; + [[runMenu addItemWithTitle:@"Run to Cursor" + action:@selector(debugRunToCursor:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF4FunctionKey]] + setKeyEquivalentModifierMask:0]; + + [runMenu addItem:[NSMenuItem separatorItem]]; + + [[runMenu addItemWithTitle:@"Step Into" + action:@selector(debugStepInto:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF11FunctionKey]] + setKeyEquivalentModifierMask:0]; + [[runMenu addItemWithTitle:@"Step Over" + action:@selector(debugStepOver:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF10FunctionKey]] + setKeyEquivalentModifierMask:0]; + [[runMenu addItemWithTitle:@"Step Out" + action:@selector(debugStepOut:) + keyEquivalent:[NSString stringWithFormat:@"%C", (short)NSF10FunctionKey]] + setKeyEquivalentModifierMask:NSShiftKeyMask]; + } +} + + +//============================================================ +// debugger_osx::config_load +// restore state based on configuration XML +//============================================================ + +void debugger_osx::config_load(config_type cfgtype, util::xml::data_node const *parentnode) +{ + if ((config_type::GAME == cfgtype) && parentnode) + { + NSAutoreleasePool *const pool = [[NSAutoreleasePool alloc] init]; + create_console(); + [m_console loadConfiguration:parentnode]; + [pool release]; + } +} + + +//============================================================ +// debugger_osx::config_save +// save state to system XML +//============================================================ + +void debugger_osx::config_save(config_type cfgtype, util::xml::data_node *parentnode) +{ + if ((config_type::GAME == cfgtype) && m_console) + { + NSAutoreleasePool *const pool = [[NSAutoreleasePool alloc] init]; + NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:[NSValue valueWithPointer:m_machine], + @"MAMEDebugMachine", + [NSValue valueWithPointer:parentnode], + @"MAMEDebugParentNode", + nil]; + [[NSNotificationCenter defaultCenter] postNotificationName:MAMESaveDebuggerConfigurationNotification + object:m_console + userInfo:info]; + [pool release]; + } +} |