summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/debugger/osx/disassemblyviewer.m
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/debugger/osx/disassemblyviewer.m')
-rw-r--r--src/osd/modules/debugger/osx/disassemblyviewer.m124
1 files changed, 121 insertions, 3 deletions
diff --git a/src/osd/modules/debugger/osx/disassemblyviewer.m b/src/osd/modules/debugger/osx/disassemblyviewer.m
index 7fcbb842b2d..6f7d9176082 100644
--- a/src/osd/modules/debugger/osx/disassemblyviewer.m
+++ b/src/osd/modules/debugger/osx/disassemblyviewer.m
@@ -15,6 +15,8 @@
#import "debugview.h"
#import "disassemblyview.h"
+#include "debugger.h"
+#include "debug/debugcon.h"
#include "debug/debugcpu.h"
@@ -69,9 +71,7 @@
[expressionContainer release];
// create the disassembly view
- dasmView = [[MAMEDisassemblyView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)
- machine:*machine
- useConsole:NO];
+ dasmView = [[MAMEDisassemblyView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100) machine:*machine];
[dasmView insertSubviewItemsInMenu:[subviewButton menu] atIndex:0];
dasmScroll = [[NSScrollView alloc] initWithFrame:NSMakeRect(0,
0,
@@ -161,9 +161,127 @@
}
+- (IBAction)debugToggleBreakpoint:(id)sender {
+ if ([dasmView cursorVisible])
+ {
+ device_t &device = [dasmView source]->device();
+ offs_t const address = [dasmView selectedAddress];
+ device_debug::breakpoint *bp = [[self class] findBreakpointAtAddress:address forDevice:device];
+
+ // if it doesn't exist, add a new one
+ if (bp == NULL)
+ {
+ UINT32 const bpnum = device.debug()->breakpoint_set(address, NULL, NULL);
+ debug_console_printf(*machine, "Breakpoint %X set\n", bpnum);
+ }
+ else
+ {
+ int const bpnum = bp->index();
+ device.debug()->breakpoint_clear(bpnum);
+ debug_console_printf(*machine, "Breakpoint %X cleared\n", (UINT32)bpnum);
+ }
+
+ // fail to do this and the display doesn't update
+ machine->debug_view().update_all();
+ debugger_refresh_display(*machine);
+ }
+}
+
+
+- (IBAction)debugToggleBreakpointEnable:(id)sender {
+ if ([dasmView cursorVisible])
+ {
+ device_t &device = [dasmView source]->device();
+ offs_t const address = [dasmView selectedAddress];
+ device_debug::breakpoint *bp = [[self class] findBreakpointAtAddress:address forDevice:device];
+ if (bp != NULL)
+ {
+ device.debug()->breakpoint_enable(bp->index(), !bp->enabled());
+ debug_console_printf(*machine,
+ "Breakpoint %X %s\n",
+ (UINT32)bp->index(),
+ bp->enabled() ? "enabled" : "disabled");
+ machine->debug_view().update_all();
+ debugger_refresh_display(*machine);
+ }
+ }
+}
+
+
+- (IBAction)debugRunToCursor:(id)sender {
+ if ([dasmView cursorVisible])
+ [dasmView source]->device().debug()->go([dasmView selectedAddress]);
+}
+
+
- (IBAction)changeSubview:(id)sender {
[dasmView selectSubviewAtIndex:[[sender selectedItem] tag]];
[window setTitle:[NSString stringWithFormat:@"Disassembly: %@", [dasmView selectedSubviewName]]];
}
+
+- (BOOL)validateMenuItem:(NSMenuItem *)item {
+ SEL const action = [item action];
+ BOOL const inContextMenu = ([item menu] == [dasmView menu]);
+ BOOL const haveCursor = [dasmView cursorVisible];
+
+ device_debug::breakpoint *breakpoint = NULL;
+ if (haveCursor)
+ {
+ breakpoint = [[self class] findBreakpointAtAddress:[dasmView selectedAddress]
+ forDevice:[dasmView source]->device()];
+ }
+
+ if (action == @selector(debugToggleBreakpoint:))
+ {
+ if (haveCursor)
+ {
+ if (breakpoint != NULL)
+ {
+ if (inContextMenu)
+ [item setTitle:@"Clear Breakpoint"];
+ else
+ [item setTitle:@"Clear Breakpoint at Cursor"];
+ }
+ else
+ {
+ if (inContextMenu)
+ [item setTitle:@"Set Breakpoint"];
+ else
+ [item setTitle:@"Set Breakpoint at Cursor"];
+ }
+ }
+ else
+ {
+ if (inContextMenu)
+ [item setTitle:@"Toggle Breakpoint"];
+ else
+ [item setTitle:@"Toggle Breakpoint at Cursor"];
+ }
+ return haveCursor;
+ }
+ else if (action == @selector(debugToggleBreakpointEnable:))
+ {
+ if ((breakpoint != NULL) && !breakpoint->enabled())
+ {
+ if (inContextMenu)
+ [item setTitle:@"Enable Breakpoint"];
+ else
+ [item setTitle:@"Enable Breakpoint at Cursor"];
+ }
+ else
+ {
+ if (inContextMenu)
+ [item setTitle:@"Disable Breakpoint"];
+ else
+ [item setTitle:@"Disable Breakpoint at Cursor"];
+ }
+ return breakpoint != NULL;
+ }
+ else
+ {
+ return YES;
+ }
+}
+
@end