annotate debug.c @ 2177:44596610b2a0

Fix Windows build
author Michael Pavone <pavone@retrodev.com>
date Sun, 07 Aug 2022 01:16:47 -0700
parents 8c28c5466d70
children f6d5bde4d07f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include "debug.h"
1103
22e87b739ad6 WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents: 985
diff changeset
2 #include "genesis.h"
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
3 #include "68kinst.h"
2104
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
4 #include "segacd.h"
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
5 #include "blastem.h"
2177
44596610b2a0 Fix Windows build
Michael Pavone <pavone@retrodev.com>
parents: 2175
diff changeset
6 #include <ctype.h>
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7 #include <stdlib.h>
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
8 #include <string.h>
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 723
diff changeset
9 #ifndef _WIN32
723
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
10 #include <sys/select.h>
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 723
diff changeset
11 #endif
723
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
12 #include "render.h"
792
724bbec47f86 Use a new fatal_error function instead of calling fprintf and exit for fatal errors. This new function more gracefully handles the case in which BlastEm was not started from a terminal or disconnected from ther terminal (Windows).
Michael Pavone <pavone@retrodev.com>
parents: 747
diff changeset
13 #include "util.h"
794
792be135d3af Spawn a terminal for the debugger when needed if we are not already attached to one
Michael Pavone <pavone@retrodev.com>
parents: 792
diff changeset
14 #include "terminal.h"
1752
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
15 #include "z80inst.h"
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
16
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
17 #ifdef NEW_CORE
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
18 #define Z80_OPTS opts
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
19 #else
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
20 #define Z80_OPTS options
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
21 #endif
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
22
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
23
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
24
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
25 static debug_root roots[5];
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
26 static uint32_t num_roots;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
27 #define MAX_DEBUG_ROOTS (sizeof(roots)/sizeof(*roots))
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
28
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
29 debug_root *find_root(void *cpu)
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
30 {
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
31 for (uint32_t i = 0; i < num_roots; i++)
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
32 {
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
33 if (roots[i].cpu_context == cpu) {
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
34 return roots + i;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
35 }
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
36 }
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
37 if (num_roots < MAX_DEBUG_ROOTS) {
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
38 num_roots++;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
39 memset(roots + num_roots - 1, 0, sizeof(debug_root));
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
40 roots[num_roots-1].cpu_context = cpu;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
41 return roots + num_roots - 1;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
42 }
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
43 return NULL;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
44 }
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
45
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
46 bp_def ** find_breakpoint(bp_def ** cur, uint32_t address)
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
47 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
48 while (*cur) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
49 if ((*cur)->address == address) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
50 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
51 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
52 cur = &((*cur)->next);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
53 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
54 return cur;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
55 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
56
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
57 bp_def ** find_breakpoint_idx(bp_def ** cur, uint32_t index)
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
58 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
59 while (*cur) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
60 if ((*cur)->index == index) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
61 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
62 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
63 cur = &((*cur)->next);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
64 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
65 return cur;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
66 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
67
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
68 typedef enum {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
69 TOKEN_NONE,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
70 TOKEN_NUM,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
71 TOKEN_NAME,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
72 TOKEN_OPER,
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
73 TOKEN_SIZE,
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
74 TOKEN_LBRACKET,
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
75 TOKEN_RBRACKET,
2171
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
76 TOKEN_LPAREN,
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
77 TOKEN_RPAREN
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
78 } token_type;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
79
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
80 static const char *token_type_names[] = {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
81 "TOKEN_NONE",
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
82 "TOKEN_NUM",
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
83 "TOKEN_NAME",
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
84 "TOKEN_OPER",
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
85 "TOKEN_SIZE",
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
86 "TOKEN_LBRACKET",
2171
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
87 "TOKEN_RBRACKET",
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
88 "TOKEN_LPAREN",
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
89 "TOKEN_RPAREN"
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
90 };
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
91
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
92 typedef struct {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
93 token_type type;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
94 union {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
95 char *str;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
96 char op[3];
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
97 uint32_t num;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
98 } v;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
99 } token;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
100
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
101 static token parse_token(char *start, char **end)
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
102 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
103 while(*start && isblank(*start) && *start != '\n')
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
104 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
105 ++start;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
106 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
107 if (!*start || *start == '\n') {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
108 return (token){
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
109 .type = TOKEN_NONE
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
110 };
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
111 *end = start;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
112 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
113 if (*start == '$' || (*start == '0' && start[1] == 'x')) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
114 return (token) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
115 .type = TOKEN_NUM,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
116 .v = {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
117 .num = strtol(start + (*start == '$' ? 1 : 2), end, 16)
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
118 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
119 };
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
120 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
121 if (isdigit(*start)) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
122 return (token) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
123 .type = TOKEN_NUM,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
124 .v = {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
125 .num = strtol(start, end, 10)
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
126 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
127 };
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
128 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
129 switch (*start)
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
130 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
131 case '+':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
132 case '-':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
133 case '*':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
134 case '/':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
135 case '&':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
136 case '|':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
137 case '^':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
138 case '~':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
139 case '=':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
140 case '!':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
141 if (*start == '!' && start[1] == '=') {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
142 *end = start + 2;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
143 return (token) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
144 .type = TOKEN_OPER,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
145 .v = {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
146 .op = {*start, start[1], 0}
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
147 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
148 };
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
149 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
150 *end = start + 1;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
151 return (token) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
152 .type = TOKEN_OPER,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
153 .v = {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
154 .op = {*start, 0}
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
155 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
156 };
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
157 case '.':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
158 *end = start + 2;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
159 return (token) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
160 .type = TOKEN_SIZE,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
161 .v = {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
162 .op = {start[1], 0}
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
163 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
164 };
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
165 case '[':
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
166 *end = start + 1;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
167 return (token) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
168 .type = TOKEN_LBRACKET
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
169 };
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
170 case ']':
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
171 *end = start + 1;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
172 return (token) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
173 .type = TOKEN_RBRACKET
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
174 };
2171
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
175 case '(':
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
176 *end = start + 1;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
177 return (token) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
178 .type = TOKEN_LPAREN
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
179 };
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
180 case ')':
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
181 *end = start + 1;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
182 return (token) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
183 .type = TOKEN_RPAREN
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
184 };
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
185 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
186 *end = start + 1;
2172
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
187 while (**end && !isblank(**end))
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
188 {
2172
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
189 uint8_t done = 0;
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
190 switch (**end)
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
191 {
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
192 case '+':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
193 case '-':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
194 case '*':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
195 case '/':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
196 case '&':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
197 case '|':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
198 case '^':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
199 case '~':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
200 case '=':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
201 case '!':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
202 case '.':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
203 done = 1;
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
204 break;
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
205 }
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
206 if (done) {
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
207 break;
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
208 }
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
209
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
210 ++*end;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
211 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
212 char *name = malloc(*end - start + 1);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
213 memcpy(name, start, *end - start);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
214 name[*end-start] = 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
215 return (token) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
216 .type = TOKEN_NAME,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
217 .v = {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
218 .str = name
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
219 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
220 };
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
221 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
222
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
223 typedef enum {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
224 EXPR_NONE,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
225 EXPR_SCALAR,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
226 EXPR_UNARY,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
227 EXPR_BINARY,
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
228 EXPR_SIZE,
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
229 EXPR_MEM
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
230 } expr_type;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
231
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
232 typedef struct expr expr;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
233
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
234 struct expr {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
235 expr_type type;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
236 expr *left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
237 expr *right;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
238 token op;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
239 };
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
240
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
241 static void free_expr(expr *e)
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
242 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
243 if (!e) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
244 return;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
245 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
246 free_expr(e->left);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
247 free_expr(e->right);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
248 if (e->op.type == TOKEN_NAME) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
249 free(e->op.v.str);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
250 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
251 free(e);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
252 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
253
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
254 static expr *parse_scalar_or_muldiv(char *start, char **end);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
255 static expr *parse_expression(char *start, char **end);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
256
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
257 static expr *parse_scalar(char *start, char **end)
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
258 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
259 char *after_first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
260 token first = parse_token(start, &after_first);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
261 if (!first.type) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
262 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
263 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
264 if (first.type == TOKEN_SIZE) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
265 fprintf(stderr, "Unexpected TOKEN_SIZE '.%s'\n", first.v.op);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
266 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
267 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
268 if (first.type == TOKEN_OPER) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
269 expr *target = parse_scalar(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
270 if (!target) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
271 fprintf(stderr, "Unary expression %s needs value\n", first.v.op);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
272 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
273 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
274 expr *ret = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
275 ret->type = EXPR_UNARY;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
276 ret->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
277 ret->left = target;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
278 *end = after_first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
279 return ret;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
280 }
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
281 if (first.type == TOKEN_LBRACKET) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
282 expr *ret = calloc(1, sizeof(expr));
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
283 ret->type = EXPR_MEM;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
284 ret->left = parse_expression(after_first, end);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
285 if (!ret->left) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
286 fprintf(stderr, "Expression expected after `[`\n");
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
287 free(ret);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
288 return NULL;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
289 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
290 token rbrack = parse_token(*end, end);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
291 if (rbrack.type != TOKEN_RBRACKET) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
292 fprintf(stderr, "Missing closing `]`");
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
293 free_expr(ret);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
294 return NULL;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
295 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
296 char *after_size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
297 token size = parse_token(*end, &after_size);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
298 if (size.type == TOKEN_SIZE) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
299 *end = after_size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
300 ret->op = size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
301 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
302 return ret;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
303 }
2171
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
304 if (first.type == TOKEN_LPAREN) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
305 expr *ret = parse_expression(after_first, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
306 if (!ret) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
307 fprintf(stderr, "Expression expected after `(`\n");
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
308 return NULL;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
309 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
310 token rparen = parse_token(*end, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
311 if (rparen.type != TOKEN_RPAREN) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
312 fprintf(stderr, "Missing closing `)`");
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
313 free_expr(ret);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
314 return NULL;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
315 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
316 return ret;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
317 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
318 if (first.type != TOKEN_NUM && first.type != TOKEN_NAME) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
319 fprintf(stderr, "Unexpected token %s\n", token_type_names[first.type]);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
320 return NULL;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
321 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
322 token second = parse_token(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
323 if (second.type != TOKEN_SIZE) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
324 expr *ret = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
325 ret->type = EXPR_SCALAR;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
326 ret->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
327 *end = after_first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
328 return ret;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
329 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
330 expr *ret = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
331 ret->type = EXPR_SIZE;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
332 ret->left = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
333 ret->left->type = EXPR_SCALAR;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
334 ret->left->op = second;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
335 ret->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
336 return ret;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
337 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
338
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
339 static expr *maybe_binary(expr *left, char *start, char **end)
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
340 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
341 char *after_first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
342 token first = parse_token(start, &after_first);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
343 if (first.type != TOKEN_OPER) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
344 *end = start;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
345 return left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
346 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
347 expr *bin = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
348 bin->left = left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
349 bin->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
350 bin->type = EXPR_BINARY;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
351 switch (first.v.op[0])
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
352 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
353 case '*':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
354 case '/':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
355 case '&':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
356 case '|':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
357 case '^':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
358 bin->right = parse_scalar(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
359 return maybe_binary(bin, *end, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
360 case '+':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
361 case '-':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
362 bin->right = parse_scalar_or_muldiv(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
363 return maybe_binary(bin, *end, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
364 case '=':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
365 case '!':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
366 bin->right = parse_expression(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
367 return bin;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
368 default:
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
369 bin->left = NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
370 free(bin);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
371 return left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
372 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
373 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
374
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
375 static expr *maybe_muldiv(expr *left, char *start, char **end)
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
376 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
377 char *after_first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
378 token first = parse_token(start, &after_first);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
379 if (first.type != TOKEN_OPER) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
380 *end = start;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
381 return left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
382 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
383 expr *bin = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
384 bin->left = left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
385 bin->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
386 bin->type = EXPR_BINARY;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
387 switch (first.v.op[0])
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
388 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
389 case '*':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
390 case '/':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
391 case '&':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
392 case '|':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
393 case '^':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
394 bin->right = parse_scalar(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
395 return maybe_binary(bin, *end, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
396 default:
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
397 bin->left = NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
398 free(bin);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
399 return left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
400 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
401 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
402
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
403 static expr *parse_scalar_or_muldiv(char *start, char **end)
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
404 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
405 char *after_first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
406 token first = parse_token(start, &after_first);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
407 if (!first.type) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
408 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
409 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
410 if (first.type == TOKEN_SIZE) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
411 fprintf(stderr, "Unexpected TOKEN_SIZE '.%s'\n", first.v.op);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
412 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
413 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
414 if (first.type == TOKEN_OPER) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
415 expr *target = parse_scalar(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
416 if (!target) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
417 fprintf(stderr, "Unary expression %s needs value\n", first.v.op);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
418 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
419 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
420 expr *ret = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
421 ret->type = EXPR_UNARY;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
422 ret->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
423 ret->left = target;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
424 return ret;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
425 }
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
426 if (first.type == TOKEN_LBRACKET) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
427 expr *ret = calloc(1, sizeof(expr));
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
428 ret->type = EXPR_MEM;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
429 ret->left = parse_expression(after_first, end);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
430 if (!ret->left) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
431 fprintf(stderr, "Expression expected after `[`\n");
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
432 free(ret);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
433 return NULL;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
434 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
435 token rbrack = parse_token(*end, end);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
436 if (rbrack.type != TOKEN_RBRACKET) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
437 fprintf(stderr, "Missing closing `]`");
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
438 free_expr(ret);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
439 return NULL;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
440 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
441 char *after_size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
442 token size = parse_token(*end, &after_size);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
443 if (size.type == TOKEN_SIZE) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
444 *end = after_size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
445 ret->op = size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
446 }
2171
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
447 return maybe_muldiv(ret, *end, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
448 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
449 if (first.type == TOKEN_LPAREN) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
450 expr *ret = parse_expression(after_first, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
451 if (!ret) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
452 fprintf(stderr, "Expression expected after `(`\n");
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
453 return NULL;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
454 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
455 token rparen = parse_token(*end, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
456 if (rparen.type != TOKEN_RPAREN) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
457 fprintf(stderr, "Missing closing `)`");
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
458 free_expr(ret);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
459 return NULL;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
460 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
461 return maybe_muldiv(ret, *end, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
462 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
463 if (first.type != TOKEN_NUM && first.type != TOKEN_NAME) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
464 fprintf(stderr, "Unexpected token %s\n", token_type_names[first.type]);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
465 return NULL;
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
466 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
467 char *after_second;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
468 token second = parse_token(after_first, &after_second);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
469 if (second.type == TOKEN_OPER) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
470 expr *ret;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
471 expr *bin = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
472 bin->type = EXPR_BINARY;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
473 bin->left = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
474 bin->left->type = EXPR_SCALAR;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
475 bin->left->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
476 bin->op = second;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
477 switch (second.v.op[0])
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
478 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
479 case '*':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
480 case '/':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
481 case '&':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
482 case '|':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
483 case '^':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
484 bin->right = parse_scalar(after_second, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
485 return maybe_muldiv(bin, *end, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
486 case '+':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
487 case '-':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
488 case '=':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
489 case '!':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
490 ret = bin->left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
491 bin->left = NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
492 free_expr(bin);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
493 return ret;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
494 default:
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
495 fprintf(stderr, "%s is not a valid binary operator\n", second.v.op);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
496 free(bin->left);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
497 free(bin);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
498 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
499 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
500 } else if (second.type == TOKEN_SIZE) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
501 expr *value = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
502 value->type = EXPR_SIZE;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
503 value->op = second;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
504 value->left = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
505 value->left->type = EXPR_SCALAR;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
506 value->left->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
507 return maybe_muldiv(value, after_second, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
508 } else {
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
509 expr *ret = calloc(1, sizeof(expr));
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
510 ret->type = EXPR_SCALAR;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
511 ret->op = first;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
512 *end = after_first;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
513 return ret;
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
514 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
515 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
516
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
517 static expr *parse_expression(char *start, char **end)
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
518 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
519 char *after_first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
520 token first = parse_token(start, &after_first);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
521 if (!first.type) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
522 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
523 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
524 if (first.type == TOKEN_SIZE) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
525 fprintf(stderr, "Unexpected TOKEN_SIZE '.%s'\n", first.v.op);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
526 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
527 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
528 if (first.type == TOKEN_OPER) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
529 expr *target = parse_scalar(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
530 if (!target) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
531 fprintf(stderr, "Unary expression %s needs value\n", first.v.op);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
532 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
533 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
534 expr *ret = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
535 ret->type = EXPR_UNARY;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
536 ret->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
537 ret->left = target;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
538 return ret;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
539 }
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
540 if (first.type == TOKEN_LBRACKET) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
541 expr *ret = calloc(1, sizeof(expr));
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
542 ret->type = EXPR_MEM;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
543 ret->left = parse_expression(after_first, end);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
544 if (!ret->left) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
545 fprintf(stderr, "Expression expected after `[`\n");
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
546 free(ret);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
547 return NULL;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
548 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
549 token rbrack = parse_token(*end, end);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
550 if (rbrack.type != TOKEN_RBRACKET) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
551 fprintf(stderr, "Missing closing `]`");
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
552 free_expr(ret);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
553 return NULL;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
554 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
555 char *after_size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
556 token size = parse_token(*end, &after_size);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
557 if (size.type == TOKEN_SIZE) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
558 *end = after_size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
559 ret->op = size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
560 }
2171
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
561 return maybe_binary(ret, *end, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
562 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
563 if (first.type == TOKEN_LPAREN) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
564 expr *ret = parse_expression(after_first, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
565 if (!ret) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
566 fprintf(stderr, "Expression expected after `(`\n");
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
567 return NULL;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
568 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
569 token rparen = parse_token(*end, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
570 if (rparen.type != TOKEN_RPAREN) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
571 fprintf(stderr, "Missing closing `)`");
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
572 free_expr(ret);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
573 return NULL;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
574 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
575 return maybe_binary(ret, *end, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
576 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
577 if (first.type != TOKEN_NUM && first.type != TOKEN_NAME) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
578 fprintf(stderr, "Unexpected token %s\n", token_type_names[first.type]);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
579 return NULL;
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
580 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
581 char *after_second;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
582 token second = parse_token(after_first, &after_second);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
583 if (second.type == TOKEN_OPER) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
584 expr *bin = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
585 bin->type = EXPR_BINARY;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
586 bin->left = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
587 bin->left->type = EXPR_SCALAR;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
588 bin->left->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
589 bin->op = second;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
590 switch (second.v.op[0])
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
591 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
592 case '*':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
593 case '/':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
594 case '&':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
595 case '|':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
596 case '^':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
597 bin->right = parse_scalar(after_second, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
598 return maybe_binary(bin, *end, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
599 case '+':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
600 case '-':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
601 bin->right = parse_scalar_or_muldiv(after_second, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
602 return maybe_binary(bin, *end, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
603 case '=':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
604 case '!':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
605 bin->right = parse_expression(after_second, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
606 return bin;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
607 default:
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
608 fprintf(stderr, "%s is not a valid binary operator\n", second.v.op);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
609 free(bin->left);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
610 free(bin);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
611 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
612 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
613 } else if (second.type == TOKEN_SIZE) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
614 expr *value = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
615 value->type = EXPR_SIZE;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
616 value->op = second;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
617 value->left = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
618 value->left->type = EXPR_SCALAR;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
619 value->left->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
620 return maybe_binary(value, after_second, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
621 } else {
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
622 expr *ret = calloc(1, sizeof(expr));
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
623 ret->type = EXPR_SCALAR;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
624 ret->op = first;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
625 *end = after_first;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
626 return ret;
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
627 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
628 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
629
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
630 uint8_t eval_expr(debug_root *root, expr *e, uint32_t *out)
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
631 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
632 uint32_t right;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
633 switch(e->type)
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
634 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
635 case EXPR_SCALAR:
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
636 if (e->op.type == TOKEN_NAME) {
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
637 return root->resolve(root, e->op.v.str, out);
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
638 } else {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
639 *out = e->op.v.num;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
640 return 1;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
641 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
642 case EXPR_UNARY:
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
643 if (!eval_expr(root, e->left, out)) {
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
644 return 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
645 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
646 switch (e->op.v.op[0])
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
647 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
648 case '!':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
649 *out = !*out;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
650 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
651 case '~':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
652 *out = ~*out;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
653 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
654 case '-':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
655 *out = -*out;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
656 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
657 default:
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
658 return 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
659 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
660 return 1;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
661 case EXPR_BINARY:
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
662 if (!eval_expr(root, e->left, out) || !eval_expr(root, e->right, &right)) {
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
663 return 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
664 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
665 switch (e->op.v.op[0])
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
666 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
667 case '+':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
668 *out += right;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
669 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
670 case '-':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
671 *out -= right;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
672 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
673 case '*':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
674 *out *= right;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
675 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
676 case '/':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
677 *out /= right;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
678 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
679 case '&':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
680 *out &= right;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
681 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
682 case '|':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
683 *out |= right;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
684 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
685 case '^':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
686 *out ^= right;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
687 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
688 case '=':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
689 *out = *out == right;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
690 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
691 case '!':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
692 *out = *out != right;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
693 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
694 default:
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
695 return 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
696 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
697 return 1;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
698 case EXPR_SIZE:
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
699 if (!eval_expr(root, e->left, out)) {
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
700 return 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
701 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
702 switch (e->op.v.op[0])
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
703 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
704 case 'b':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
705 *out &= 0xFF;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
706 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
707 case 'w':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
708 *out &= 0xFFFF;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
709 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
710 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
711 return 1;
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
712 case EXPR_MEM:
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
713 if (!eval_expr(root, e->left, out)) {
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
714 return 0;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
715 }
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
716 return root->read_mem(root, out, e->op.v.op[0]);
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
717 default:
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
718 return 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
719 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
720 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
721
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
722 void add_display(disp_def ** head, uint32_t *index, char format_char, char * param)
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
723 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
724 disp_def * ndisp = malloc(sizeof(*ndisp));
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
725 ndisp->format_char = format_char;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
726 ndisp->param = strdup(param);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
727 ndisp->next = *head;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
728 ndisp->index = *index++;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
729 *head = ndisp;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
730 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
731
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
732 void remove_display(disp_def ** head, uint32_t index)
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
733 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
734 while (*head) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
735 if ((*head)->index == index) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
736 disp_def * del_disp = *head;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
737 *head = del_disp->next;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
738 free(del_disp->param);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
739 free(del_disp);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
740 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
741 head = &(*head)->next;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
742 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
743 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
744 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
745
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
746 char * find_param(char * buf)
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
747 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
748 for (; *buf; buf++) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
749 if (*buf == ' ') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
750 if (*(buf+1)) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
751 return buf+1;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
752 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
753 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
754 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
755 return NULL;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
756 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
757
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
758 void strip_nl(char * buf)
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
759 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
760 for(; *buf; buf++) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
761 if (*buf == '\n') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
762 *buf = 0;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
763 return;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
764 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
765 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
766 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
767
1965
3a46ff899fa6 More correct implementation of byte printing in builtin debugger. Fix GDB debugger to use helper in backend.c for reading bytes
Michael Pavone <pavone@retrodev.com>
parents: 1963
diff changeset
768 static uint8_t m68k_read_byte(uint32_t address, m68k_context *context)
3a46ff899fa6 More correct implementation of byte printing in builtin debugger. Fix GDB debugger to use helper in backend.c for reading bytes
Michael Pavone <pavone@retrodev.com>
parents: 1963
diff changeset
769 {
3a46ff899fa6 More correct implementation of byte printing in builtin debugger. Fix GDB debugger to use helper in backend.c for reading bytes
Michael Pavone <pavone@retrodev.com>
parents: 1963
diff changeset
770 //TODO: share this implementation with GDB debugger
3a46ff899fa6 More correct implementation of byte printing in builtin debugger. Fix GDB debugger to use helper in backend.c for reading bytes
Michael Pavone <pavone@retrodev.com>
parents: 1963
diff changeset
771 return read_byte(address, (void **)context->mem_pointers, &context->options->gen, context);
3a46ff899fa6 More correct implementation of byte printing in builtin debugger. Fix GDB debugger to use helper in backend.c for reading bytes
Michael Pavone <pavone@retrodev.com>
parents: 1963
diff changeset
772 }
3a46ff899fa6 More correct implementation of byte printing in builtin debugger. Fix GDB debugger to use helper in backend.c for reading bytes
Michael Pavone <pavone@retrodev.com>
parents: 1963
diff changeset
773
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
774 static uint16_t m68k_read_word(uint32_t address, m68k_context *context)
1313
b27d7bf1107e Improved printing of word at absolute address to support reading from all address types. Implemented support for printing the value pointed to by a register. Removed abuse of read_dma_value in internal debugger.
Michael Pavone <pavone@retrodev.com>
parents: 1312
diff changeset
775 {
b27d7bf1107e Improved printing of word at absolute address to support reading from all address types. Implemented support for printing the value pointed to by a register. Removed abuse of read_dma_value in internal debugger.
Michael Pavone <pavone@retrodev.com>
parents: 1312
diff changeset
776 return read_word(address, (void **)context->mem_pointers, &context->options->gen, context);
b27d7bf1107e Improved printing of word at absolute address to support reading from all address types. Implemented support for printing the value pointed to by a register. Removed abuse of read_dma_value in internal debugger.
Michael Pavone <pavone@retrodev.com>
parents: 1312
diff changeset
777 }
b27d7bf1107e Improved printing of word at absolute address to support reading from all address types. Implemented support for printing the value pointed to by a register. Removed abuse of read_dma_value in internal debugger.
Michael Pavone <pavone@retrodev.com>
parents: 1312
diff changeset
778
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
779 static uint32_t m68k_read_long(uint32_t address, m68k_context *context)
1313
b27d7bf1107e Improved printing of word at absolute address to support reading from all address types. Implemented support for printing the value pointed to by a register. Removed abuse of read_dma_value in internal debugger.
Michael Pavone <pavone@retrodev.com>
parents: 1312
diff changeset
780 {
b27d7bf1107e Improved printing of word at absolute address to support reading from all address types. Implemented support for printing the value pointed to by a register. Removed abuse of read_dma_value in internal debugger.
Michael Pavone <pavone@retrodev.com>
parents: 1312
diff changeset
781 return m68k_read_word(address, context) << 16 | m68k_read_word(address + 2, context);
b27d7bf1107e Improved printing of word at absolute address to support reading from all address types. Implemented support for printing the value pointed to by a register. Removed abuse of read_dma_value in internal debugger.
Michael Pavone <pavone@retrodev.com>
parents: 1312
diff changeset
782 }
b27d7bf1107e Improved printing of word at absolute address to support reading from all address types. Implemented support for printing the value pointed to by a register. Removed abuse of read_dma_value in internal debugger.
Michael Pavone <pavone@retrodev.com>
parents: 1312
diff changeset
783
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
784 static uint8_t read_m68k(debug_root *root, uint32_t *out, char size)
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
785 {
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
786 m68k_context *context = root->cpu_context;
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
787 if (size == 'b') {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
788 *out = m68k_read_byte(*out, context);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
789 } else if (size == 'l') {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
790 *out = m68k_read_long(*out, context);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
791 } else {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
792 *out = m68k_read_word(*out, context);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
793 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
794 return 1;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
795 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
796
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
797 static uint8_t resolve_m68k(debug_root *root, const char *name, uint32_t *out)
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
798 {
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
799 m68k_context *context = root->cpu_context;
2174
eff7bedfc838 Restore ability to print PC in debugger. Make 68K register names case insensitive. Add usp and ssp registers
Michael Pavone <pavone@retrodev.com>
parents: 2173
diff changeset
800 if ((name[0] == 'd' || name[0] == 'D') && name[1] >= '0' && name[1] <= '7' && !name[2]) {
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
801 *out = context->dregs[name[1]-'0'];
2174
eff7bedfc838 Restore ability to print PC in debugger. Make 68K register names case insensitive. Add usp and ssp registers
Michael Pavone <pavone@retrodev.com>
parents: 2173
diff changeset
802 } else if ((name[0] == 'a' || name[0] == 'A') && name[1] >= '0' && name[1] <= '7' && !name[2]) {
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
803 *out = context->aregs[name[1]-'0'];
2174
eff7bedfc838 Restore ability to print PC in debugger. Make 68K register names case insensitive. Add usp and ssp registers
Michael Pavone <pavone@retrodev.com>
parents: 2173
diff changeset
804 } else if (!strcasecmp(name, "sr")) {
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
805 *out = context->status << 8;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
806 for (int flag = 0; flag < 5; flag++) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
807 *out |= context->flags[flag] << (4-flag);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
808 }
2174
eff7bedfc838 Restore ability to print PC in debugger. Make 68K register names case insensitive. Add usp and ssp registers
Michael Pavone <pavone@retrodev.com>
parents: 2173
diff changeset
809 } else if(!strcasecmp(name, "cycle")) {
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
810 *out = context->current_cycle;
2174
eff7bedfc838 Restore ability to print PC in debugger. Make 68K register names case insensitive. Add usp and ssp registers
Michael Pavone <pavone@retrodev.com>
parents: 2173
diff changeset
811 } else if (!strcasecmp(name, "pc")) {
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
812 *out = root->address;
2174
eff7bedfc838 Restore ability to print PC in debugger. Make 68K register names case insensitive. Add usp and ssp registers
Michael Pavone <pavone@retrodev.com>
parents: 2173
diff changeset
813 } else if (!strcasecmp(name, "usp")) {
eff7bedfc838 Restore ability to print PC in debugger. Make 68K register names case insensitive. Add usp and ssp registers
Michael Pavone <pavone@retrodev.com>
parents: 2173
diff changeset
814 *out = context->status & 0x20 ? context->aregs[8] : context->aregs[7];
eff7bedfc838 Restore ability to print PC in debugger. Make 68K register names case insensitive. Add usp and ssp registers
Michael Pavone <pavone@retrodev.com>
parents: 2173
diff changeset
815 } else if (!strcasecmp(name, "ssp")) {
eff7bedfc838 Restore ability to print PC in debugger. Make 68K register names case insensitive. Add usp and ssp registers
Michael Pavone <pavone@retrodev.com>
parents: 2173
diff changeset
816 *out = context->status & 0x20 ? context->aregs[7] : context->aregs[8];
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
817 } else {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
818 return 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
819 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
820 return 1;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
821 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
822
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
823 static uint8_t resolve_genesis(debug_root *root, const char *name, uint32_t *out)
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
824 {
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
825 if (resolve_m68k(root, name, out)) {
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
826 return 1;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
827 }
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
828 m68k_context *m68k = root->cpu_context;
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
829 genesis_context *gen = m68k->system;
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
830 if (!strcmp(name, "f") || !strcmp(name, "frame")) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
831 *out = gen->vdp->frame;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
832 return 1;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
833 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
834 return 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
835 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
836
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
837 void debugger_print(debug_root *root, char format_char, char *param)
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
838 {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
839 uint32_t value;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
840 char format[8];
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
841 strcpy(format, "%s: %d\n");
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
842 switch (format_char)
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
843 {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
844 case 'x':
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
845 case 'X':
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
846 case 'd':
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
847 case 'c':
2112
3abb64bd0da6 Add support for printing strings in 68K debugger
Michael Pavone <pavone@retrodev.com>
parents: 2107
diff changeset
848 case 's':
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
849 format[5] = format_char;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
850 break;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
851 case '\0':
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
852 break;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
853 default:
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
854 fprintf(stderr, "Unrecognized format character: %c\n", format_char);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
855 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
856 char *after;
2173
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
857 uint8_t at_least_one = 0;
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
858 while (*param && *param != '\n')
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
859 {
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
860 at_least_one = 1;
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
861 expr *e = parse_expression(param, &after);
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
862 if (e) {
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
863 if (!eval_expr(root, e, &value)) {
2173
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
864 fprintf(stderr, "Failed to eval %s\n", param);
1312
9ab3f6781202 Allow adding .w or .b to select just the low word or byte of a register in a 68K debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 1311
diff changeset
865 }
2173
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
866 free_expr(e);
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
867 } else {
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
868 fprintf(stderr, "Failed to parse %s\n", param);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
869 }
2173
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
870 char *tmp_param = malloc(after-param+1);
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
871 memcpy(tmp_param, param, after-param);
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
872 tmp_param[after-param] = 0;
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
873 param = after;
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
874 if (format_char == 's') {
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
875 char tmp[128];
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
876 int i;
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
877 for (i = 0; i < sizeof(tmp)-1; i++, value++)
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
878 {
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
879 uint32_t addr = value;
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
880 root->read_mem(root, &addr, 'b');
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
881 char c = addr;
2173
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
882 if (c < 0x20 || c > 0x7F) {
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
883 break;
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
884 }
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
885 tmp[i] = c;
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
886 }
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
887 tmp[i] = 0;
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
888 printf(format, tmp_param, tmp);
1314
ae932ca28282 Allow a .l suffix to a memory print command to allow fetching and printing a longword
Michael Pavone <pavone@retrodev.com>
parents: 1313
diff changeset
889 } else {
2173
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
890 printf(format, tmp_param, value);
1314
ae932ca28282 Allow a .l suffix to a memory print command to allow fetching and printing a longword
Michael Pavone <pavone@retrodev.com>
parents: 1313
diff changeset
891 }
2173
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
892 free(tmp_param);
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
893 while (*param && isblank(*param) && *param != '\n')
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
894 {
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
895 ++param;
1314
ae932ca28282 Allow a .l suffix to a memory print command to allow fetching and printing a longword
Michael Pavone <pavone@retrodev.com>
parents: 1313
diff changeset
896 }
2173
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
897 }
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
898 if (!at_least_one) {
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
899 fprintf(stderr, "Missing argument to print/%c\n", format_char);
2112
3abb64bd0da6 Add support for printing strings in 68K debugger
Michael Pavone <pavone@retrodev.com>
parents: 2107
diff changeset
900 }
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
901 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
902
565
9324f721efa6 Add a separate flag/define for disabling the Z80 at compile time to ease refactoring
Michael Pavone <pavone@retrodev.com>
parents: 548
diff changeset
903 #ifndef NO_Z80
548
a3afee2271ce Initial work on the x86-32 target
Michael Pavone <pavone@retrodev.com>
parents: 525
diff changeset
904
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
905 void zdebugger_print(z80_context * context, char format_char, char * param)
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
906 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
907 uint32_t value;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
908 char format[8];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
909 strcpy(format, "%s: %d\n");
1103
22e87b739ad6 WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents: 985
diff changeset
910 genesis_context *system = context->system;
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
911 switch (format_char)
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
912 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
913 case 'x':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
914 case 'X':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
915 case 'd':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
916 case 'c':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
917 format[5] = format_char;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
918 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
919 case '\0':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
920 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
921 default:
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
922 fprintf(stderr, "Unrecognized format character: %c\n", format_char);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
923 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
924 switch (param[0])
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
925 {
1752
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
926 #ifndef NEW_CORE
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
927 case 'a':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
928 if (param[1] == 'f') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
929 if(param[2] == '\'') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
930 value = context->alt_regs[Z80_A] << 8;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
931 value |= context->alt_flags[ZF_S] << 7;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
932 value |= context->alt_flags[ZF_Z] << 6;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
933 value |= context->alt_flags[ZF_H] << 4;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
934 value |= context->alt_flags[ZF_PV] << 2;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
935 value |= context->alt_flags[ZF_N] << 1;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
936 value |= context->alt_flags[ZF_C];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
937 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
938 value = context->regs[Z80_A] << 8;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
939 value |= context->flags[ZF_S] << 7;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
940 value |= context->flags[ZF_Z] << 6;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
941 value |= context->flags[ZF_H] << 4;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
942 value |= context->flags[ZF_PV] << 2;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
943 value |= context->flags[ZF_N] << 1;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
944 value |= context->flags[ZF_C];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
945 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
946 } else if(param[1] == '\'') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
947 value = context->alt_regs[Z80_A];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
948 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
949 value = context->regs[Z80_A];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
950 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
951 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
952 case 'b':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
953 if (param[1] == 'c') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
954 if(param[2] == '\'') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
955 value = context->alt_regs[Z80_B] << 8;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
956 value |= context->alt_regs[Z80_C];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
957 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
958 value = context->regs[Z80_B] << 8;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
959 value |= context->regs[Z80_C];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
960 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
961 } else if(param[1] == '\'') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
962 value = context->alt_regs[Z80_B];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
963 } else if(param[1] == 'a') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
964 value = context->bank_reg << 15;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
965 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
966 value = context->regs[Z80_B];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
967 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
968 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
969 case 'c':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
970 if(param[1] == '\'') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
971 value = context->alt_regs[Z80_C];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
972 } else if(param[1] == 'y') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
973 value = context->current_cycle;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
974 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
975 value = context->regs[Z80_C];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
976 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
977 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
978 case 'd':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
979 if (param[1] == 'e') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
980 if(param[2] == '\'') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
981 value = context->alt_regs[Z80_D] << 8;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
982 value |= context->alt_regs[Z80_E];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
983 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
984 value = context->regs[Z80_D] << 8;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
985 value |= context->regs[Z80_E];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
986 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
987 } else if(param[1] == '\'') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
988 value = context->alt_regs[Z80_D];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
989 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
990 value = context->regs[Z80_D];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
991 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
992 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
993 case 'e':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
994 if(param[1] == '\'') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
995 value = context->alt_regs[Z80_E];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
996 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
997 value = context->regs[Z80_E];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
998 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
999 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1000 case 'f':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1001 if(param[2] == '\'') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1002 value = context->alt_flags[ZF_S] << 7;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1003 value |= context->alt_flags[ZF_Z] << 6;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1004 value |= context->alt_flags[ZF_H] << 4;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1005 value |= context->alt_flags[ZF_PV] << 2;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1006 value |= context->alt_flags[ZF_N] << 1;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1007 value |= context->alt_flags[ZF_C];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1008 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1009 value = context->flags[ZF_S] << 7;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1010 value |= context->flags[ZF_Z] << 6;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1011 value |= context->flags[ZF_H] << 4;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1012 value |= context->flags[ZF_PV] << 2;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1013 value |= context->flags[ZF_N] << 1;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1014 value |= context->flags[ZF_C];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1015 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1016 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1017 case 'h':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1018 if (param[1] == 'l') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1019 if(param[2] == '\'') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1020 value = context->alt_regs[Z80_H] << 8;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1021 value |= context->alt_regs[Z80_L];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1022 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1023 value = context->regs[Z80_H] << 8;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1024 value |= context->regs[Z80_L];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1025 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1026 } else if(param[1] == '\'') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1027 value = context->alt_regs[Z80_H];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1028 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1029 value = context->regs[Z80_H];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1030 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1031 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1032 case 'l':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1033 if(param[1] == '\'') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1034 value = context->alt_regs[Z80_L];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1035 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1036 value = context->regs[Z80_L];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1037 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1038 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1039 case 'i':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1040 if(param[1] == 'x') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1041 if (param[2] == 'h') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1042 value = context->regs[Z80_IXH];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1043 } else if(param[2] == 'l') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1044 value = context->regs[Z80_IXL];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1045 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1046 value = context->regs[Z80_IXH] << 8;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1047 value |= context->regs[Z80_IXL];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1048 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1049 } else if(param[1] == 'y') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1050 if (param[2] == 'h') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1051 value = context->regs[Z80_IYH];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1052 } else if(param[2] == 'l') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1053 value = context->regs[Z80_IYL];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1054 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1055 value = context->regs[Z80_IYH] << 8;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1056 value |= context->regs[Z80_IYL];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1057 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1058 } else if(param[1] == 'n') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1059 value = context->int_cycle;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1060 } else if(param[1] == 'f' && param[2] == 'f' && param[3] == '1') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1061 value = context->iff1;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1062 } else if(param[1] == 'f' && param[2] == 'f' && param[3] == '2') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1063 value = context->iff2;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1064 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1065 value = context->im;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1066 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1067 break;
1752
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
1068 #endif
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1069 case 's':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1070 if (param[1] == 'p') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1071 value = context->sp;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1072 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1073 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1074 case '0':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1075 if (param[1] == 'x') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1076 uint16_t p_addr = strtol(param+2, NULL, 16);
1920
7b41cb36e7df Use proper memory map in Z80 debugger for memory printing
Michael Pavone <pavone@retrodev.com>
parents: 1752
diff changeset
1077 value = read_byte(p_addr, (void **)context->mem_pointers, &context->options->gen, context);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1078 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1079 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1080 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1081 printf(format, param, value);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1082 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1083
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1084 z80_context * zdebugger(z80_context * context, uint16_t address)
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1085 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1086 static char last_cmd[1024];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1087 char input_buf[1024];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1088 z80inst inst;
1103
22e87b739ad6 WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents: 985
diff changeset
1089 genesis_context *system = context->system;
794
792be135d3af Spawn a terminal for the debugger when needed if we are not already attached to one
Michael Pavone <pavone@retrodev.com>
parents: 792
diff changeset
1090 init_terminal();
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1091 //Check if this is a user set breakpoint, or just a temporary one
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1092 debug_root *root = find_root(context);
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1093 if (!root) {
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1094 return context;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1095 }
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1096 bp_def ** this_bp = find_breakpoint(&root->breakpoints, address);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1097 if (*this_bp) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1098 printf("Z80 Breakpoint %d hit\n", (*this_bp)->index);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1099 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1100 zremove_breakpoint(context, address);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1101 }
1752
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
1102 uint8_t * pc = get_native_pointer(address, (void **)context->mem_pointers, &context->Z80_OPTS->gen);
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1103 if (!pc) {
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1104 fatal_error("Failed to get native pointer on entering Z80 debugger at address %X\n", address);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1105 }
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1106 for (disp_def * cur = root->displays; cur; cur = cur->next) {
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1107 zdebugger_print(context, cur->format_char, cur->param);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1108 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1109 uint8_t * after_pc = z80_decode(pc, &inst);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1110 z80_disasm(&inst, input_buf, address);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1111 printf("%X:\t%s\n", address, input_buf);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1112 uint16_t after = address + (after_pc-pc);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1113 int debugging = 1;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1114 while(debugging) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1115 fputs(">", stdout);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1116 if (!fgets(input_buf, sizeof(input_buf), stdin)) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1117 fputs("fgets failed", stderr);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1118 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1119 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1120 strip_nl(input_buf);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1121 //hitting enter repeats last command
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1122 if (input_buf[0]) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1123 strcpy(last_cmd, input_buf);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1124 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1125 strcpy(input_buf, last_cmd);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1126 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1127 char * param;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1128 char format[8];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1129 uint32_t value;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1130 bp_def * new_bp;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1131 switch(input_buf[0])
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1132 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1133 case 'a':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1134 param = find_param(input_buf);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1135 if (!param) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1136 fputs("a command requires a parameter\n", stderr);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1137 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1138 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1139 value = strtol(param, NULL, 16);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1140 zinsert_breakpoint(context, value, (uint8_t *)zdebugger);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1141 debugging = 0;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1142 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1143 case 'b':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1144 param = find_param(input_buf);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1145 if (!param) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1146 fputs("b command requires a parameter\n", stderr);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1147 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1148 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1149 value = strtol(param, NULL, 16);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1150 zinsert_breakpoint(context, value, (uint8_t *)zdebugger);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1151 new_bp = malloc(sizeof(bp_def));
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1152 new_bp->next = root->breakpoints;
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1153 new_bp->address = value;
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1154 new_bp->index = root->bp_index++;
867
bacd67a82d58 Properly initialize commands when adding a new breakpoint
Michael Pavone <pavone@retrodev.com>
parents: 865
diff changeset
1155 new_bp->commands = NULL;
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1156 root->breakpoints = new_bp;
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1157 printf("Z80 Breakpoint %d set at %X\n", new_bp->index, value);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1158 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1159 case 'c':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1160 puts("Continuing");
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1161 debugging = 0;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1162 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1163 case 'd':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1164 if (input_buf[1] == 'i') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1165 char format_char = 0;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1166 for(int i = 2; input_buf[i] != 0 && input_buf[i] != ' '; i++) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1167 if (input_buf[i] == '/') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1168 format_char = input_buf[i+1];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1169 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1170 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1171 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1172 param = find_param(input_buf);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1173 if (!param) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1174 fputs("display command requires a parameter\n", stderr);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1175 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1176 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1177 zdebugger_print(context, format_char, param);
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1178 add_display(&root->displays, &root->disp_index, format_char, param);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1179 } else if (input_buf[1] == 'e' || input_buf[1] == ' ') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1180 param = find_param(input_buf);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1181 if (!param) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1182 fputs("delete command requires a parameter\n", stderr);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1183 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1184 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1185 if (param[0] >= '0' && param[0] <= '9') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1186 value = atoi(param);
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1187 this_bp = find_breakpoint_idx(&root->breakpoints, value);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1188 if (!*this_bp) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1189 fprintf(stderr, "Breakpoint %d does not exist\n", value);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1190 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1191 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1192 new_bp = *this_bp;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1193 zremove_breakpoint(context, new_bp->address);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1194 *this_bp = new_bp->next;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1195 free(new_bp);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1196 } else if (param[0] == 'd') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1197 param = find_param(param);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1198 if (!param) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1199 fputs("delete display command requires a parameter\n", stderr);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1200 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1201 }
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1202 remove_display(&root->displays, atoi(param));
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1203 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1204 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1205 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1206 case 'n':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1207 //TODO: Handle conditional branch instructions
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1208 if (inst.op == Z80_JP) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1209 if (inst.addr_mode == Z80_IMMED) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1210 after = inst.immed;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1211 } else if (inst.ea_reg == Z80_HL) {
1752
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
1212 #ifndef NEW_CORE
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1213 after = context->regs[Z80_H] << 8 | context->regs[Z80_L];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1214 } else if (inst.ea_reg == Z80_IX) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1215 after = context->regs[Z80_IXH] << 8 | context->regs[Z80_IXL];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1216 } else if (inst.ea_reg == Z80_IY) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1217 after = context->regs[Z80_IYH] << 8 | context->regs[Z80_IYL];
1752
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
1218 #endif
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1219 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1220 } else if(inst.op == Z80_JR) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1221 after += inst.immed;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1222 } else if(inst.op == Z80_RET) {
1752
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
1223 uint8_t *sp = get_native_pointer(context->sp, (void **)context->mem_pointers, &context->Z80_OPTS->gen);
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1224 if (sp) {
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1225 after = *sp;
1752
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
1226 sp = get_native_pointer((context->sp + 1) & 0xFFFF, (void **)context->mem_pointers, &context->Z80_OPTS->gen);
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1227 if (sp) {
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1228 after |= *sp << 8;
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1229 }
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1230 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1231 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1232 zinsert_breakpoint(context, after, (uint8_t *)zdebugger);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1233 debugging = 0;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1234 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1235 case 'p':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1236 param = find_param(input_buf);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1237 if (!param) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1238 fputs("p command requires a parameter\n", stderr);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1239 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1240 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1241 zdebugger_print(context, input_buf[1] == '/' ? input_buf[2] : 0, param);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1242 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1243 case 'q':
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1244 puts("Quitting");
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1245 exit(0);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1246 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1247 case 's': {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1248 param = find_param(input_buf);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1249 if (!param) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1250 fputs("s command requires a file name\n", stderr);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1251 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1252 }
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1253 memmap_chunk const *ram_chunk = NULL;
1752
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
1254 for (int i = 0; i < context->Z80_OPTS->gen.memmap_chunks; i++)
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1255 {
1752
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
1256 memmap_chunk const *cur = context->Z80_OPTS->gen.memmap + i;
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1257 if (cur->flags & MMAP_WRITE) {
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1258 ram_chunk = cur;
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1259 break;
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1260 }
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1261 }
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1262 if (ram_chunk) {
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1263 uint32_t size = ram_chunk->end - ram_chunk->start;
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1264 if (size > ram_chunk->mask) {
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1265 size = ram_chunk->mask+1;
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1266 }
1752
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
1267 uint8_t *buf = get_native_pointer(ram_chunk->start, (void **)context->mem_pointers, &context->Z80_OPTS->gen);
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1268 FILE * f = fopen(param, "wb");
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1269 if (f) {
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1270 if(fwrite(buf, 1, size, f) != size) {
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1271 fputs("Error writing file\n", stderr);
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1272 }
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1273 fclose(f);
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1274 printf("Wrote %d bytes to %s\n", size, param);
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1275 } else {
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1276 fprintf(stderr, "Could not open %s for writing\n", param);
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1277 }
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1278 } else {
1129
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
1279 fputs("Failed to find a RAM memory chunk\n", stderr);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1280 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1281 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1282 }
1921
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1283 case '?':
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1284 print_z80_help();
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1285 break;
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1286 default:
1149
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
1287 if (
1752
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
1288 !context->Z80_OPTS->gen.debug_cmd_handler
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
1289 || !context->Z80_OPTS->gen.debug_cmd_handler(&system->header, input_buf)
1149
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
1290 ) {
1921
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1291 fprintf(stderr, "Unrecognized debugger command %s\nUse '?' for help.\n", input_buf);
1149
6b0da6021544 Don't lock up CPU if performing a read with writes configured when in PBC mode. Allow access to VDP debug commands from Z80 debugger in PBC mode. Handle Mode 4 in VDP debug print functions
Michael Pavone <pavone@retrodev.com>
parents: 1130
diff changeset
1292 }
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1293 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1294 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1295 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1296 return context;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1297 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1298
548
a3afee2271ce Initial work on the x86-32 target
Michael Pavone <pavone@retrodev.com>
parents: 525
diff changeset
1299 #endif
a3afee2271ce Initial work on the x86-32 target
Michael Pavone <pavone@retrodev.com>
parents: 525
diff changeset
1300
2104
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1301 int run_debugger_command(m68k_context *context, uint32_t address, char *input_buf, m68kinst inst, uint32_t after);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1302 int run_genesis_debugger_command(m68k_context *context, uint32_t address, char *input_buf)
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1303 {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1304 genesis_context * gen = context->system;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1305 char *param;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1306 uint32_t value;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1307 bp_def *new_bp;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1308 switch (input_buf[0])
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1309 {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1310 case 'v':
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1311 //VDP debug commands
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1312 switch(input_buf[1])
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1313 {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1314 case 's':
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1315 vdp_print_sprite_table(gen->vdp);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1316 break;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1317 case 'r':
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1318 vdp_print_reg_explain(gen->vdp);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1319 break;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1320 }
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1321 break;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1322 case 'y':
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1323 //YM-2612 debug commands
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1324 switch(input_buf[1])
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1325 {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1326 case 'c':
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1327 if (input_buf[2] == ' ') {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1328 int channel = atoi(input_buf+3)-1;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1329 ym_print_channel_info(gen->ym, channel);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1330 } else {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1331 for (int i = 0; i < 6; i++) {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1332 ym_print_channel_info(gen->ym, i);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1333 }
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1334 }
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1335 break;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1336 case 't':
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1337 ym_print_timer_info(gen->ym);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1338 break;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1339 }
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1340 break;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1341 case 'u':
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1342 if (gen->expansion) {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1343 segacd_context *cd = gen->expansion;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1344 if (input_buf[1]) {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1345 //TODO: filter out commands that are unsafe to run when we don't have the current Sub CPU address
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1346 run_debugger_command(cd->m68k, 0, input_buf + 1, (m68kinst){}, 0);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1347 } else {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1348 cd->enter_debugger = 1;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1349 return 0;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1350 }
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1351 } else {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1352 fputs("u command only valid when Sega/Mega CD is active\n", stderr);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1353 }
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1354 break;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1355 #ifndef NO_Z80
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1356 case 'z':
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1357 //Z80 debug commands
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1358 switch(input_buf[1])
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1359 {
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1360 case 'b': {
2104
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1361 param = find_param(input_buf);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1362 if (!param) {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1363 fputs("zb command requires a parameter\n", stderr);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1364 break;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1365 }
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1366 value = strtol(param, NULL, 16);
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1367 debug_root *zroot = find_root(gen->z80);
2104
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1368 zinsert_breakpoint(gen->z80, value, (uint8_t *)zdebugger);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1369 new_bp = malloc(sizeof(bp_def));
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1370 new_bp->next = zroot->breakpoints;
2104
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1371 new_bp->address = value;
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1372 new_bp->index = zroot->bp_index++;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1373 zroot->breakpoints = new_bp;
2104
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1374 printf("Z80 Breakpoint %d set at %X\n", new_bp->index, value);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1375 break;
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1376 }
2104
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1377 case 'p':
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1378 param = find_param(input_buf);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1379 if (!param) {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1380 fputs("zp command requires a parameter\n", stderr);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1381 break;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1382 }
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1383 zdebugger_print(gen->z80, input_buf[2] == '/' ? input_buf[3] : 0, param);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1384 }
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1385 break;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1386 #endif
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1387 default:
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1388 fprintf(stderr, "Unrecognized debugger command %s\nUse '?' for help.\n", input_buf);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1389 break;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1390 }
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1391 return 1;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1392 }
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1393
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1394 int run_subcpu_debugger_command(m68k_context *context, uint32_t address, char *input_buf)
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1395 {
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1396 segacd_context *cd = context->system;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1397 switch (input_buf[0])
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1398 {
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1399 case 'm':
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1400 if (input_buf[1]) {
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1401 //TODO: filter out commands that are unsafe to run when we don't have the current Main CPU address
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1402 return run_debugger_command(cd->genesis->m68k, 0, input_buf + 1, (m68kinst){}, 0);
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1403 } else {
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1404 cd->genesis->header.enter_debugger = 1;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1405 return 0;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1406 }
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1407 break;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1408 default:
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1409 fprintf(stderr, "Unrecognized debugger command %s\nUse '?' for help.\n", input_buf);
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1410 break;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1411 }
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1412 return 1;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1413 }
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1414
1922
4a811fd1fb6f Added soft reset command to debugger. Added more debugger help
Eric Fry <yuv422@users.noreply.github.com>
parents: 1921
diff changeset
1415 int run_debugger_command(m68k_context *context, uint32_t address, char *input_buf, m68kinst inst, uint32_t after)
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1416 {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1417 char * param;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1418 char format_char;
1103
22e87b739ad6 WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents: 985
diff changeset
1419 genesis_context *system = context->system;
849
1416c4261d5b Fix some debug commands that got broken when I added support for the command command
Michael Pavone <pavone@retrodev.com>
parents: 831
diff changeset
1420 uint32_t value;
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1421 bp_def *new_bp, **this_bp;
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1422 debug_root *root = find_root(context);
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1423 if (!root) {
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1424 return 0;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1425 }
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
1426 root->address = address;
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1427 switch(input_buf[0])
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1428 {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1429 case 'c':
830
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1430 if (input_buf[1] == 0 || input_buf[1] == 'o' && input_buf[2] == 'n')
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1431 {
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1432 puts("Continuing");
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1433 return 0;
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1434 } else if (input_buf[1] == 'o' && input_buf[2] == 'm') {
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1435 param = find_param(input_buf);
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1436 if (!param) {
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1437 fputs("com command requires a parameter\n", stderr);
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1438 break;
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1439 }
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1440 bp_def **target = find_breakpoint_idx(&root->breakpoints, atoi(param));
830
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1441 if (!target) {
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1442 fprintf(stderr, "Breakpoint %s does not exist!\n", param);
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1443 break;
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1444 }
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1445 printf("Enter commands for breakpoing %d, type end when done\n", atoi(param));
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1446 char cmd_buf[1024];
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1447 char *commands = NULL;
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1448 for (;;)
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1449 {
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1450 fputs(">>", stdout);
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1451 fflush(stdout);
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1452 fgets(cmd_buf, sizeof(cmd_buf), stdin);
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1453 if (strcmp(cmd_buf, "end\n")) {
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1454 if (commands) {
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1455 char *tmp = commands;
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1456 commands = alloc_concat(commands, cmd_buf);
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1457 free(tmp);
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1458 } else {
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1459 commands = strdup(cmd_buf);
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1460 }
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1461 } else {
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1462 break;
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1463 }
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1464 }
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1465 (*target)->commands = commands;
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1466 } else {
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1467 }
1310
de742a7bd9f7 Fix accidental fallthrough on com debugger command
Michael Pavone <pavone@retrodev.com>
parents: 1149
diff changeset
1468 break;
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1469 case 'b':
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1470 if (input_buf[1] == 't') {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1471 uint32_t stack = context->aregs[7];
2133
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1472 uint8_t non_adr_count = 0;
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1473 do {
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1474 uint32_t bt_address = m68k_instruction_fetch(stack, context);
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1475 bt_address = get_instruction_start(context->options, bt_address - 2);
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1476 if (bt_address) {
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1477 stack += 4;
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1478 non_adr_count = 0;
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1479 m68k_decode(m68k_instruction_fetch, context, &inst, bt_address);
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1480 m68k_disasm(&inst, input_buf);
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1481 printf("%X: %s\n", bt_address, input_buf);
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1482 } else {
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1483 //non-return address value on stack can be word wide
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1484 stack += 2;
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1485 non_adr_count++;
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1486 }
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1487 //TODO: Make sure we don't wander into an invalid memory region
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1488 } while (stack && non_adr_count < 6);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1489 } else {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1490 param = find_param(input_buf);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1491 if (!param) {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1492 fputs("b command requires a parameter\n", stderr);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1493 break;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1494 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1495 value = strtol(param, NULL, 16);
1111
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
1496 insert_breakpoint(context, value, debugger);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1497 new_bp = malloc(sizeof(bp_def));
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1498 new_bp->next = root->breakpoints;
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1499 new_bp->address = value;
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1500 new_bp->index = root->bp_index++;
919
38dca41f151d Initialize commands field of breakpoint struct to NULL. Remove a debug printf
Michael Pavone <pavone@retrodev.com>
parents: 867
diff changeset
1501 new_bp->commands = NULL;
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1502 root->breakpoints = new_bp;
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1503 printf("68K Breakpoint %d set at %X\n", new_bp->index, value);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1504 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1505 break;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1506 case 'a':
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1507 param = find_param(input_buf);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1508 if (!param) {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1509 fputs("a command requires a parameter\n", stderr);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1510 break;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1511 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1512 value = strtol(param, NULL, 16);
1111
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
1513 insert_breakpoint(context, value, debugger);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1514 return 0;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1515 case 'd':
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1516 if (input_buf[1] == 'i') {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1517 format_char = 0;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1518 for(int i = 2; input_buf[i] != 0 && input_buf[i] != ' '; i++) {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1519 if (input_buf[i] == '/') {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1520 format_char = input_buf[i+1];
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1521 break;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1522 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1523 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1524 param = find_param(input_buf);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1525 if (!param) {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1526 fputs("display command requires a parameter\n", stderr);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1527 break;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1528 }
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
1529 debugger_print(root, format_char, param);
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1530 add_display(&root->displays, &root->disp_index, format_char, param);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1531 } else {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1532 param = find_param(input_buf);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1533 if (!param) {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1534 fputs("d command requires a parameter\n", stderr);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1535 break;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1536 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1537 value = atoi(param);
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1538 this_bp = find_breakpoint_idx(&root->breakpoints, value);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1539 if (!*this_bp) {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1540 fprintf(stderr, "Breakpoint %d does not exist\n", value);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1541 break;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1542 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1543 new_bp = *this_bp;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1544 *this_bp = (*this_bp)->next;
830
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1545 if (new_bp->commands) {
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1546 free(new_bp->commands);
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1547 }
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1548 free(new_bp);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1549 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1550 break;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1551 case 'p':
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1552 format_char = 0;
831
079eb395ddd1 Fix handling of formatting character for 68K debug command p
Michael Pavone <pavone@retrodev.com>
parents: 830
diff changeset
1553 for(int i = 1; input_buf[i] != 0 && input_buf[i] != ' '; i++) {
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1554 if (input_buf[i] == '/') {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1555 format_char = input_buf[i+1];
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1556 break;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1557 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1558 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1559 param = find_param(input_buf);
1923
23394a890508 Added implementation of printing PC in 68K debugger
Michael Pavone <pavone@retrodev.com>
parents: 1922
diff changeset
1560 if (param) {
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
1561 debugger_print(root, format_char, param);
1923
23394a890508 Added implementation of printing PC in 68K debugger
Michael Pavone <pavone@retrodev.com>
parents: 1922
diff changeset
1562 } else {
1922
4a811fd1fb6f Added soft reset command to debugger. Added more debugger help
Eric Fry <yuv422@users.noreply.github.com>
parents: 1921
diff changeset
1563 m68k_disasm(&inst, input_buf);
4a811fd1fb6f Added soft reset command to debugger. Added more debugger help
Eric Fry <yuv422@users.noreply.github.com>
parents: 1921
diff changeset
1564 printf("%X: %s\n", address, input_buf);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1565 }
2054
8ee7ecbf3f21 Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents: 1965
diff changeset
1566
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1567 break;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1568 case 'n':
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1569 if (inst.op == M68K_RTS) {
1313
b27d7bf1107e Improved printing of word at absolute address to support reading from all address types. Implemented support for printing the value pointed to by a register. Removed abuse of read_dma_value in internal debugger.
Michael Pavone <pavone@retrodev.com>
parents: 1312
diff changeset
1570 after = m68k_read_long(context->aregs[7], context);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1571 } else if (inst.op == M68K_RTE || inst.op == M68K_RTR) {
1313
b27d7bf1107e Improved printing of word at absolute address to support reading from all address types. Implemented support for printing the value pointed to by a register. Removed abuse of read_dma_value in internal debugger.
Michael Pavone <pavone@retrodev.com>
parents: 1312
diff changeset
1572 after = m68k_read_long(context->aregs[7] + 2, context);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1573 } else if(m68k_is_noncall_branch(&inst)) {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1574 if (inst.op == M68K_BCC && inst.extra.cond != COND_TRUE) {
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1575 root->branch_f = after;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1576 root->branch_t = m68k_branch_target(&inst, context->dregs, context->aregs);
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1577 insert_breakpoint(context, root->branch_t, debugger);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1578 } else if(inst.op == M68K_DBCC) {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1579 if ( inst.extra.cond == COND_FALSE) {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1580 if (context->dregs[inst.dst.params.regs.pri] & 0xFFFF) {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1581 after = m68k_branch_target(&inst, context->dregs, context->aregs);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1582 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1583 } else {
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1584 root->branch_t = after;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1585 root->branch_f = m68k_branch_target(&inst, context->dregs, context->aregs);
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1586 insert_breakpoint(context, root->branch_f, debugger);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1587 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1588 } else {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1589 after = m68k_branch_target(&inst, context->dregs, context->aregs);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1590 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1591 }
1111
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
1592 insert_breakpoint(context, after, debugger);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1593 return 0;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1594 case 'o':
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1595 if (inst.op == M68K_RTS) {
1313
b27d7bf1107e Improved printing of word at absolute address to support reading from all address types. Implemented support for printing the value pointed to by a register. Removed abuse of read_dma_value in internal debugger.
Michael Pavone <pavone@retrodev.com>
parents: 1312
diff changeset
1596 after = m68k_read_long(context->aregs[7], context);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1597 } else if (inst.op == M68K_RTE || inst.op == M68K_RTR) {
1313
b27d7bf1107e Improved printing of word at absolute address to support reading from all address types. Implemented support for printing the value pointed to by a register. Removed abuse of read_dma_value in internal debugger.
Michael Pavone <pavone@retrodev.com>
parents: 1312
diff changeset
1598 after = m68k_read_long(context->aregs[7] + 2, context);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1599 } else if(m68k_is_noncall_branch(&inst)) {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1600 if (inst.op == M68K_BCC && inst.extra.cond != COND_TRUE) {
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1601 root->branch_t = m68k_branch_target(&inst, context->dregs, context->aregs) & 0xFFFFFF;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1602 if (root->branch_t < after) {
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1603 root->branch_t = 0;
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1604 } else {
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1605 root->branch_f = after;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1606 insert_breakpoint(context, root->branch_t, debugger);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1607 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1608 } else if(inst.op == M68K_DBCC) {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1609 uint32_t target = m68k_branch_target(&inst, context->dregs, context->aregs) & 0xFFFFFF;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1610 if (target > after) {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1611 if (inst.extra.cond == COND_FALSE) {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1612 after = target;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1613 } else {
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1614 root->branch_f = target;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1615 root->branch_t = after;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1616 insert_breakpoint(context, root->branch_f, debugger);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1617 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1618 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1619 } else {
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1620 after = m68k_branch_target(&inst, context->dregs, context->aregs) & 0xFFFFFF;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1621 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1622 }
1111
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
1623 insert_breakpoint(context, after, debugger);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1624 return 0;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1625 case 's':
1630
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1626 if (input_buf[1] == 'e') {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1627 param = find_param(input_buf);
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1628 if (!param) {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1629 fputs("Missing destination parameter for set\n", stderr);
1922
4a811fd1fb6f Added soft reset command to debugger. Added more debugger help
Eric Fry <yuv422@users.noreply.github.com>
parents: 1921
diff changeset
1630 return 1;
1630
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1631 }
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1632 char *val = find_param(param);
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1633 if (!val) {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1634 fputs("Missing value parameter for set\n", stderr);
1922
4a811fd1fb6f Added soft reset command to debugger. Added more debugger help
Eric Fry <yuv422@users.noreply.github.com>
parents: 1921
diff changeset
1635 return 1;
1630
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1636 }
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1637 long int_val;
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1638 int reg_num;
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1639 switch (val[0])
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1640 {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1641 case 'd':
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1642 case 'a':
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1643 reg_num = val[1] - '0';
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1644 if (reg_num < 0 || reg_num > 8) {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1645 fprintf(stderr, "Invalid register %s\n", val);
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1646 return 1;
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1647 }
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1648 int_val = (val[0] == 'd' ? context->dregs : context->aregs)[reg_num];
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1649 break;
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1650 case '$':
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1651 int_val = strtol(val+1, NULL, 16);
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1652 break;
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1653 case '0':
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1654 if (val[1] == 'x') {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1655 int_val = strtol(val+2, NULL, 16);
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1656 break;
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1657 }
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1658 default:
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1659 int_val = strtol(val, NULL, 10);
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1660 }
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1661 switch(param[0])
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1662 {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1663 case 'd':
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1664 case 'a':
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1665 reg_num = param[1] - '0';
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1666 if (reg_num < 0 || reg_num > 8) {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1667 fprintf(stderr, "Invalid register %s\n", param);
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1668 return 1;
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1669 }
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1670 (param[0] == 'd' ? context->dregs : context->aregs)[reg_num] = int_val;
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1671 break;
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1672 default:
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1673 fprintf(stderr, "Invalid destinatino %s\n", param);
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1674 }
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1675 break;
1922
4a811fd1fb6f Added soft reset command to debugger. Added more debugger help
Eric Fry <yuv422@users.noreply.github.com>
parents: 1921
diff changeset
1676 } else if (input_buf[1] == 'r') {
4a811fd1fb6f Added soft reset command to debugger. Added more debugger help
Eric Fry <yuv422@users.noreply.github.com>
parents: 1921
diff changeset
1677 system->header.soft_reset(&system->header);
4a811fd1fb6f Added soft reset command to debugger. Added more debugger help
Eric Fry <yuv422@users.noreply.github.com>
parents: 1921
diff changeset
1678 return 0;
1630
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1679 } else {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1680 if (inst.op == M68K_RTS) {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1681 after = m68k_read_long(context->aregs[7], context);
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1682 } else if (inst.op == M68K_RTE || inst.op == M68K_RTR) {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1683 after = m68k_read_long(context->aregs[7] + 2, context);
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1684 } else if(m68k_is_branch(&inst)) {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1685 if (inst.op == M68K_BCC && inst.extra.cond != COND_TRUE) {
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1686 root->branch_f = after;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1687 root->branch_t = m68k_branch_target(&inst, context->dregs, context->aregs) & 0xFFFFFF;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1688 insert_breakpoint(context, root->branch_t, debugger);
1630
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1689 } else if(inst.op == M68K_DBCC) {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1690 if (inst.extra.cond == COND_FALSE) {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1691 if (context->dregs[inst.dst.params.regs.pri] & 0xFFFF) {
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1692 after = m68k_branch_target(&inst, context->dregs, context->aregs);
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1693 }
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1694 } else {
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1695 root->branch_t = after;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1696 root->branch_f = m68k_branch_target(&inst, context->dregs, context->aregs);
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1697 insert_breakpoint(context, root->branch_f, debugger);
1424
4f96103b4b47 Fix s(tep) debug command for the case of dbra with an expired counter reg
Michael Pavone <pavone@retrodev.com>
parents: 1329
diff changeset
1698 }
4f96103b4b47 Fix s(tep) debug command for the case of dbra with an expired counter reg
Michael Pavone <pavone@retrodev.com>
parents: 1329
diff changeset
1699 } else {
1630
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1700 after = m68k_branch_target(&inst, context->dregs, context->aregs) & 0xFFFFFF;
1424
4f96103b4b47 Fix s(tep) debug command for the case of dbra with an expired counter reg
Michael Pavone <pavone@retrodev.com>
parents: 1329
diff changeset
1701 }
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1702 }
1630
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1703 insert_breakpoint(context, after, debugger);
5aa0c3c43b97 Added a 68K debugger command for setting a register
Michael Pavone <pavone@retrodev.com>
parents: 1629
diff changeset
1704 return 0;
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1705 }
1921
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1706 case '?':
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1707 print_m68k_help();
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1708 break;
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1709 case 'q':
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1710 puts("Quitting");
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1711 exit(0);
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1712 break;
2104
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1713 default: {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1714 if (context->system == current_system) {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1715 //primary 68K for current system
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1716 return run_genesis_debugger_command(context, address, input_buf);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1717 } else {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1718 //presumably Sega CD sub CPU
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1719 //TODO: consider making this more generic
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1720 return run_subcpu_debugger_command(context, address, input_buf);
2104
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1721 }
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1722 break;
2104
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1723 }
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1724 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1725 return 1;
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1726 }
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1727
1921
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1728 void print_m68k_help()
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1729 {
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1730 printf("M68k Debugger Commands\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1731 printf(" b ADDRESS - Set a breakpoint at ADDRESS\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1732 printf(" d BREAKPOINT - Delete a 68K breakpoint\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1733 printf(" co BREAKPOINT - Run a list of debugger commands each time\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1734 printf(" BREAKPOINT is hit\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1735 printf(" a ADDRESS - Advance to address\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1736 printf(" n - Advance to next instruction\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1737 printf(" o - Advance to next instruction ignoring branches to\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1738 printf(" lower addresses (good for breaking out of loops)\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1739 printf(" s - Advance to next instruction (follows bsr/jsr)\n");
1922
4a811fd1fb6f Added soft reset command to debugger. Added more debugger help
Eric Fry <yuv422@users.noreply.github.com>
parents: 1921
diff changeset
1740 printf(" se REG|ADDRESS VALUE - Set value\n");
4a811fd1fb6f Added soft reset command to debugger. Added more debugger help
Eric Fry <yuv422@users.noreply.github.com>
parents: 1921
diff changeset
1741 printf(" sr - Soft reset\n");
1921
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1742 printf(" c - Continue\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1743 printf(" bt - Print a backtrace\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1744 printf(" p[/(x|X|d|c)] VALUE - Print a register or memory location\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1745 printf(" di[/(x|X|d|c)] VALUE - Print a register or memory location each time\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1746 printf(" a breakpoint is hit\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1747 printf(" vs - Print VDP sprite list\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1748 printf(" vr - Print VDP register info\n");
1922
4a811fd1fb6f Added soft reset command to debugger. Added more debugger help
Eric Fry <yuv422@users.noreply.github.com>
parents: 1921
diff changeset
1749 printf(" yc [CHANNEL NUM] - Print YM-2612 channel info\n");
4a811fd1fb6f Added soft reset command to debugger. Added more debugger help
Eric Fry <yuv422@users.noreply.github.com>
parents: 1921
diff changeset
1750 printf(" yt - Print YM-2612 timer info\n");
1921
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1751 printf(" zb ADDRESS - Set a Z80 breakpoint\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1752 printf(" zp[/(x|X|d|c)] VALUE - Display a Z80 value\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1753 printf(" ? - Display help\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1754 printf(" q - Quit BlastEm\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1755 }
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1756
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1757 void print_z80_help()
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1758 {
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1759 printf("Z80 Debugger Commands\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1760 printf(" b ADDRESS - Set a breakpoint at ADDRESS\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1761 printf(" de BREAKPOINT - Delete a Z80 breakpoint\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1762 printf(" a ADDRESS - Advance to address\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1763 printf(" n - Advance to next instruction\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1764 printf(" c - Continue\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1765 printf(" p[/(x|X|d|c)] VALUE - Print a register or memory location\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1766 printf(" di[/(x|X|d|c)] VALUE - Print a register or memory location each time\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1767 printf(" a breakpoint is hit\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1768 printf(" q - Quit BlastEm\n");
5d028088e320 Added help commands to debugger
Eric Fry <yuv422@users.noreply.github.com>
parents: 1920
diff changeset
1769 }
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1770
1329
85a90964b557 Fix interaction between 68K debugger and instruction retranslation due to self modifying code or bank switching
Michael Pavone <pavone@retrodev.com>
parents: 1314
diff changeset
1771 void debugger(m68k_context * context, uint32_t address)
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1772 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1773 static char last_cmd[1024];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1774 char input_buf[1024];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1775 m68kinst inst;
830
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1776
794
792be135d3af Spawn a terminal for the debugger when needed if we are not already attached to one
Michael Pavone <pavone@retrodev.com>
parents: 792
diff changeset
1777 init_terminal();
830
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1778
2054
8ee7ecbf3f21 Implement enough of Sega CD gate array and Sub CPU to pass Sik's Mode 1 test ROM
Michael Pavone <pavone@retrodev.com>
parents: 1965
diff changeset
1779 context->options->sync_components(context, 0);
2104
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1780 if (context->system == current_system) {
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1781 genesis_context *gen = context->system;
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1782 vdp_force_update_framebuffer(gen->vdp);
ff32a90260c9 Initial support for using debugger on sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2054
diff changeset
1783 }
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1784 debug_root *root = find_root(context);
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1785 if (!root) {
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1786 return;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1787 }
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1788 //probably not necessary, but let's play it safe
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1789 address &= 0xFFFFFF;
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1790 if (address == root->branch_t) {
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1791 bp_def ** f_bp = find_breakpoint(&root->breakpoints, root->branch_f);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1792 if (!*f_bp) {
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1793 remove_breakpoint(context, root->branch_f);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1794 }
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1795 root->branch_t = root->branch_f = 0;
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1796 } else if(address == root->branch_f) {
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1797 bp_def ** t_bp = find_breakpoint(&root->breakpoints, root->branch_t);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1798 if (!*t_bp) {
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1799 remove_breakpoint(context, root->branch_t);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1800 }
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1801 root->branch_t = root->branch_f = 0;
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1802 }
849
1416c4261d5b Fix some debug commands that got broken when I added support for the command command
Michael Pavone <pavone@retrodev.com>
parents: 831
diff changeset
1803
2133
8554751f17b5 Remove use of get_native_pointer in 68K instruction decoding in preparation for word RAM interleaving
Michael Pavone <pavone@retrodev.com>
parents: 2112
diff changeset
1804 uint32_t after = m68k_decode(m68k_instruction_fetch, context, &inst, address);
830
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1805 int debugging = 1;
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1806 //Check if this is a user set breakpoint, or just a temporary one
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1807 bp_def ** this_bp = find_breakpoint(&root->breakpoints, address);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1808 if (*this_bp) {
830
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1809
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1810 if ((*this_bp)->commands)
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1811 {
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1812 char *commands = strdup((*this_bp)->commands);
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1813 char *copy = commands;
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1814
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1815 while (debugging && *commands)
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1816 {
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1817 char *cmd = commands;
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1818 strip_nl(cmd);
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1819 commands += strlen(cmd) + 1;
1922
4a811fd1fb6f Added soft reset command to debugger. Added more debugger help
Eric Fry <yuv422@users.noreply.github.com>
parents: 1921
diff changeset
1820 debugging = run_debugger_command(context, address, cmd, inst, after);
830
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1821 }
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1822 free(copy);
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1823 }
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1824 if (debugging) {
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1825 printf("68K Breakpoint %d hit\n", (*this_bp)->index);
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1826 } else {
1329
85a90964b557 Fix interaction between 68K debugger and instruction retranslation due to self modifying code or bank switching
Michael Pavone <pavone@retrodev.com>
parents: 1314
diff changeset
1827 return;
830
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
1828 }
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1829 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1830 remove_breakpoint(context, address);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1831 }
2107
f80c6111e1ae Move some debugger state to a per-CPU structure. Add m command for returning to main CPU from sub CPU
Michael Pavone <pavone@retrodev.com>
parents: 2104
diff changeset
1832 for (disp_def * cur = root->displays; cur; cur = cur->next) {
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
1833 debugger_print(root, cur->format_char, cur->param);
829
cc05444a4a4e WIP debugger improvements. Partial support for display command in 68K debugger. Minor refactor to support commands on a breakpoint.
Michael Pavone <pavone@retrodev.com>
parents: 794
diff changeset
1834 }
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1835 m68k_disasm(&inst, input_buf);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1836 printf("%X: %s\n", address, input_buf);
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 723
diff changeset
1837 #ifdef _WIN32
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 723
diff changeset
1838 #define prompt 1
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 723
diff changeset
1839 #else
723
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1840 int prompt = 1;
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1841 fd_set read_fds;
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1842 FD_ZERO(&read_fds);
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1843 struct timeval timeout;
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 723
diff changeset
1844 #endif
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1845 while (debugging) {
723
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1846 if (prompt) {
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1847 fputs(">", stdout);
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1848 fflush(stdout);
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1849 }
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1850 process_events();
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 723
diff changeset
1851 #ifndef _WIN32
723
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1852 timeout.tv_sec = 0;
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1853 timeout.tv_usec = 16667;
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1854 FD_SET(fileno(stdin), &read_fds);
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1855 if(select(fileno(stdin) + 1, &read_fds, NULL, NULL, &timeout) < 1) {
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1856 prompt = 0;
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1857 continue;
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1858 } else {
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1859 prompt = 1;
7178d750efbd Process events while waiting for 68K debugger input. This prevents "not responsive" dialogs when sitting in the debugger
Michael Pavone <pavone@retrodev.com>
parents: 707
diff changeset
1860 }
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 723
diff changeset
1861 #endif
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1862 if (!fgets(input_buf, sizeof(input_buf), stdin)) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1863 fputs("fgets failed", stderr);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1864 break;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1865 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1866 strip_nl(input_buf);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1867 //hitting enter repeats last command
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1868 if (input_buf[0]) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1869 strcpy(last_cmd, input_buf);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1870 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1871 strcpy(input_buf, last_cmd);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1872 }
1922
4a811fd1fb6f Added soft reset command to debugger. Added more debugger help
Eric Fry <yuv422@users.noreply.github.com>
parents: 1921
diff changeset
1873 debugging = run_debugger_command(context, address, input_buf, inst, after);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1874 }
1329
85a90964b557 Fix interaction between 68K debugger and instruction retranslation due to self modifying code or bank switching
Michael Pavone <pavone@retrodev.com>
parents: 1314
diff changeset
1875 return;
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1876 }