all repos — mgba @ 6616ca9111785abada65142442c51a84dc0c804d

mGBA Game Boy Advance Emulator

src/debugger/debugger.c (view raw)

 1#include "debugger.h"
 2
 3#include "arm.h"
 4
 5#include "memory-debugger.h"
 6
 7#include <stdlib.h>
 8
 9static void _checkBreakpoints(struct ARMDebugger* debugger) {
10	struct DebugBreakpoint* breakpoint;
11	int instructionLength;
12	enum ExecutionMode mode = debugger->cpu->cpsr.t;
13	if (mode == MODE_ARM) {
14		instructionLength = WORD_SIZE_ARM;
15	} else {
16		instructionLength = WORD_SIZE_THUMB;
17	}
18	for (breakpoint = debugger->breakpoints; breakpoint; breakpoint = breakpoint->next) {
19		if (breakpoint->address + instructionLength == debugger->cpu->gprs[ARM_PC]) {
20			ARMDebuggerEnter(debugger, DEBUGGER_ENTER_BREAKPOINT);
21			break;
22		}
23	}
24}
25
26void ARMDebuggerInit(struct ARMDebugger* debugger, struct ARMCore* cpu) {
27	debugger->cpu = cpu;
28	debugger->state = DEBUGGER_PAUSED;
29	debugger->breakpoints = 0;
30	debugger->memoryShim.p = debugger;
31	debugger->memoryShim.watchpoints = 0;
32	debugger->init(debugger);
33}
34
35void ARMDebuggerDeinit(struct ARMDebugger* debugger) {
36	// TODO: actually call this
37	debugger->deinit(debugger);
38}
39
40void ARMDebuggerRun(struct ARMDebugger* debugger) {
41	if (debugger->state == DEBUGGER_EXITING) {
42		debugger->state = DEBUGGER_RUNNING;
43	}
44	while (debugger->state < DEBUGGER_EXITING) {
45		if (!debugger->breakpoints) {
46			while (debugger->state == DEBUGGER_RUNNING) {
47				ARMRun(debugger->cpu);
48			}
49		} else {
50			while (debugger->state == DEBUGGER_RUNNING) {
51				ARMRun(debugger->cpu);
52				_checkBreakpoints(debugger);
53			}
54		}
55		switch (debugger->state) {
56		case DEBUGGER_RUNNING:
57			break;
58		case DEBUGGER_PAUSED:
59			debugger->paused(debugger);
60			break;
61		case DEBUGGER_EXITING:
62		case DEBUGGER_SHUTDOWN:
63			return;
64		}
65	}
66}
67
68void ARMDebuggerEnter(struct ARMDebugger* debugger, enum DebuggerEntryReason reason) {
69	debugger->state = DEBUGGER_PAUSED;
70	if (debugger->entered) {
71		debugger->entered(debugger, reason);
72	}
73}
74
75void ARMDebuggerSetBreakpoint(struct ARMDebugger* debugger, uint32_t address) {
76	struct DebugBreakpoint* breakpoint = malloc(sizeof(struct DebugBreakpoint));
77	breakpoint->address = address;
78	breakpoint->next = debugger->breakpoints;
79	debugger->breakpoints = breakpoint;
80}
81
82void ARMDebuggerSetWatchpoint(struct ARMDebugger* debugger, uint32_t address) {
83	if (debugger->cpu->memory != &debugger->memoryShim.d) {
84		ARMDebuggerInstallMemoryShim(debugger);
85	}
86	struct DebugBreakpoint* watchpoint = malloc(sizeof(struct DebugBreakpoint));
87	watchpoint->address = address;
88	watchpoint->next = debugger->memoryShim.watchpoints;
89	debugger->memoryShim.watchpoints = watchpoint;
90}