annotate debug.c @ 2720:7dcc84cb14ee

Get uPD78K/II partially hooked up in debugger
author Michael Pavone <pavone@retrodev.com>
date Wed, 16 Jul 2025 19:26:38 -0700
parents 829205a9647a
children
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"
2181
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
6 #include "bindings.h"
2720
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
7 #include "upd78k2_dis.h"
2177
44596610b2a0 Fix Windows build
Michael Pavone <pavone@retrodev.com>
parents: 2175
diff changeset
8 #include <ctype.h>
2366
1e36d8a2633c Add missing math.h include
Michael Pavone <pavone@retrodev.com>
parents: 2365
diff changeset
9 #include <math.h>
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
10 #include <stdlib.h>
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
11 #include <string.h>
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 723
diff changeset
12 #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
13 #include <sys/select.h>
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 723
diff changeset
14 #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
15 #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
16 #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
17 #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
18 #include "z80inst.h"
2198
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
19 #ifndef NO_Z80
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
20 #include "sms.h"
2413
64cf80e683aa Initial support for Colecovision emulation
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
21 #include "coleco.h"
2198
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
22 #endif
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
23
d6d4c006a7b3 Initial attempt at interrupts in new Z80 core and integrating it into main executable
Michael Pavone <pavone@retrodev.com>
parents: 1630
diff changeset
24 #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
25 #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
26 #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
27 #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
28 #endif
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
29
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
30 static debug_func *funcs;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
31 static uint32_t num_funcs, func_storage;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
32
2681
c4256ce2c45a Updated Android port using gradle toolchain and with basic Storage Access Framework support for Android 11+ support
Michael Pavone <pavone@retrodev.com>
parents: 2676
diff changeset
33 static debug_func* alloc_dfunc(void)
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
34 {
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
35 if (num_funcs == func_storage) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
36 func_storage = func_storage ? func_storage * 2 : 4;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
37 funcs = realloc(funcs, sizeof(debug_func) * func_storage);
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
38 }
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
39 return funcs + num_funcs++;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
40 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
41
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
42 static debug_val new_native_func(debug_native_func impl, int max_args, int min_args)
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
43 {
2681
c4256ce2c45a Updated Android port using gradle toolchain and with basic Storage Access Framework support for Android 11+ support
Michael Pavone <pavone@retrodev.com>
parents: 2676
diff changeset
44 debug_func *f = alloc_dfunc();
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
45 f->impl.native = impl;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
46 f->max_args = max_args;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
47 f->min_args = min_args;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
48 f->is_native = 1;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
49 return (debug_val) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
50 .v = {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
51 .u32 = f - funcs
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
52 },
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
53 .type = DBG_VAL_FUNC
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
54 };
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
55 }
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
56
2371
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
57 static debug_val new_user_func(command_block *block, char **args, int num_args)
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
58 {
2681
c4256ce2c45a Updated Android port using gradle toolchain and with basic Storage Access Framework support for Android 11+ support
Michael Pavone <pavone@retrodev.com>
parents: 2676
diff changeset
59 debug_func *f = alloc_dfunc();
2371
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
60 f->impl.block = *block;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
61 f->arg_names = args;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
62 f->max_args = f->min_args = num_args;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
63 f->is_native = 0;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
64 return (debug_val) {
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
65 .v = {
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
66 .u32 = f - funcs
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
67 },
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
68 .type = DBG_VAL_FUNC
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
69 };
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
70 }
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
71
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
72 debug_val user_var_get(debug_var *var)
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
73 {
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
74 return var->val;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
75 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
76
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
77 void user_var_set(debug_var *var, debug_val val)
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
78 {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
79 var->val = val;
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
80 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
81
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
82 static void new_user_variable(debug_root *root, const char *name, debug_val val)
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
83 {
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
84 debug_var *var = calloc(1, sizeof(debug_var));
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
85 var->get = user_var_get;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
86 var->set = user_var_set;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
87 var->val = val;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
88 root->variables = tern_insert_ptr(root->variables, name, var);
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
89 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
90
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
91 static void new_readonly_variable(debug_root *root, const char *name, debug_val val)
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
92 {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
93 debug_var *var = calloc(1, sizeof(debug_var));
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
94 var->get = user_var_get;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
95 var->set = NULL;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
96 var->val = val;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
97 root->variables = tern_insert_ptr(root->variables, name, var);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
98 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
99
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
100 static debug_array *arrays;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
101 static uint32_t num_arrays, array_storage;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
102 static debug_array *alloc_array(void)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
103 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
104 if (num_arrays == array_storage) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
105 array_storage = array_storage ? array_storage * 2 : 4;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
106 arrays = realloc(arrays, sizeof(debug_array) * array_storage);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
107 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
108 return arrays + num_arrays++;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
109 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
110
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
111 static debug_val new_fixed_array(void *base, debug_array_get get, debug_array_set set, uint32_t size)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
112 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
113 debug_array *array = alloc_array();
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
114 array->get = get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
115 array->set = set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
116 array->append = NULL;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
117 array->base = base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
118 array->size = array->storage = size;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
119 debug_val ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
120 ret.type = DBG_VAL_ARRAY;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
121 ret.v.u32 = array - arrays;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
122 return ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
123 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
124
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
125 static debug_val user_array_get(debug_array *array, uint32_t index)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
126 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
127 debug_val *data = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
128 return data[index];
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
129 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
130
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
131 static void user_array_set(debug_array *array, uint32_t index, debug_val value)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
132 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
133 debug_val *data = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
134 data[index] = value;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
135 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
136
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
137 static void user_array_append(debug_array *array, debug_val value)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
138 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
139 if (array->size == array->storage) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
140 array->storage *= 2;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
141 array->base = realloc(array->base, sizeof(debug_val) * array->storage);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
142 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
143 debug_val *data = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
144 data[array->size++] = value;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
145 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
146
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
147 static debug_val new_user_array(uint32_t size)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
148 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
149 debug_array *array = alloc_array();
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
150 array->get = user_array_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
151 array->set = user_array_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
152 array->append = user_array_append;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
153 array->size = size;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
154 array->storage = size ? size : 4;
2394
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
155 array->base = calloc(array->storage, sizeof(debug_val));
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
156 debug_val ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
157 ret.type = DBG_VAL_ARRAY;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
158 ret.v.u32 = array - arrays;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
159 return ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
160 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
161
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
162 debug_array *get_array(debug_val val)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
163 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
164 if (val.type != DBG_VAL_ARRAY) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
165 return NULL;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
166 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
167 return arrays + val.v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
168 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
169
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
170 static debug_string **debug_strings;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
171 static uint32_t num_debug_strings;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
172 static uint32_t debug_string_storage;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
173 static debug_val new_debug_string(char *str)
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
174 {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
175 if (num_debug_strings == debug_string_storage) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
176 debug_string_storage = debug_string_storage ? 2 * debug_string_storage : 4;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
177 debug_strings = realloc(debug_strings, debug_string_storage * sizeof(debug_string*));
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
178 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
179 debug_string *string = calloc(1, sizeof(debug_string));
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
180 string->size = string->storage = strlen(str);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
181 string->buffer = calloc(1, string->size + 1);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
182 memcpy(string->buffer, str, string->size + 1);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
183 debug_strings[num_debug_strings] = string;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
184 return (debug_val){
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
185 .type = DBG_VAL_STRING,
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
186 .v = {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
187 .u32 = num_debug_strings++
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
188 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
189 };
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
190 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
191
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
192 static debug_string* get_string(debug_val val)
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
193 {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
194 if (val.type != DBG_VAL_STRING) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
195 return NULL;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
196 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
197 return debug_strings[val.v.u32];
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
198 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
199
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
200 static char* get_cstring(debug_val val)
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
201 {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
202 debug_string *str = get_string(val);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
203 if (!str) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
204 return NULL;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
205 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
206 return str->buffer;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
207 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
208
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
209 static uint8_t debug_cast_int(debug_val val, uint32_t *out)
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
210 {
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
211 if (val.type == DBG_VAL_U32) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
212 *out = val.v.u32;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
213 return 1;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
214 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
215 if (val.type == DBG_VAL_F32) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
216 *out = val.v.f32;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
217 return 1;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
218 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
219 return 0;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
220 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
221
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
222 static uint8_t debug_cast_float(debug_val val, float *out)
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
223 {
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
224 if (val.type == DBG_VAL_U32) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
225 *out = val.v.u32;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
226 return 1;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
227 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
228 if (val.type == DBG_VAL_F32) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
229 *out = val.v.f32;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
230 return 1;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
231 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
232 return 0;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
233 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
234
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
235 static uint8_t debug_cast_bool(debug_val val)
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
236 {
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
237 switch(val.type)
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
238 {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
239 case DBG_VAL_U32: return val.v.u32 != 0;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
240 case DBG_VAL_F32: return val.v.f32 != 0.0f;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
241 case DBG_VAL_ARRAY: return get_array(val)->size != 0;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
242 default: return 1;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
243 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
244 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
245
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
246 static debug_val debug_int(uint32_t i)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
247 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
248 debug_val ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
249 ret.type = DBG_VAL_U32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
250 ret.v.u32 = i;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
251 return ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
252 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
253
2363
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
254 static debug_val debug_float(float f)
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
255 {
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
256 return (debug_val) {
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
257 .type = DBG_VAL_F32,
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
258 .v = {
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
259 .f32 = f
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
260 }
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
261 };
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
262 }
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
263
2367
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
264 static debug_val debug_sin(debug_val *args, int num_args)
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
265 {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
266 float f;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
267 if (!debug_cast_float(args[0], &f)) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
268 return debug_float(0.0f);
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
269 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
270 return debug_float(sinf(f));
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
271 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
272
2367
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
273 static debug_val debug_cos(debug_val *args, int num_args)
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
274 {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
275 float f;
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
276 if (!debug_cast_float(args[0], &f)) {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
277 return debug_float(0.0f);
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
278 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
279 return debug_float(cosf(f));
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
280 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
281
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
282 static debug_val debug_tan(debug_val *args, int num_args)
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
283 {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
284 float f;
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
285 if (!debug_cast_float(args[0], &f)) {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
286 return debug_float(0.0f);
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
287 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
288 return debug_float(tanf(f));
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
289 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
290
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
291 static debug_val debug_asin(debug_val *args, int num_args)
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
292 {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
293 float f;
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
294 if (!debug_cast_float(args[0], &f)) {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
295 return debug_float(0.0f);
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
296 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
297 return debug_float(asinf(f));
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
298 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
299
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
300 static debug_val debug_acos(debug_val *args, int num_args)
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
301 {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
302 float f;
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
303 if (!debug_cast_float(args[0], &f)) {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
304 return debug_float(0.0f);
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
305 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
306 return debug_float(acosf(f));
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
307 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
308
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
309 static debug_val debug_atan(debug_val *args, int num_args)
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
310 {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
311 float f;
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
312 if (!debug_cast_float(args[0], &f)) {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
313 return debug_float(0.0f);
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
314 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
315 return debug_float(atanf(f));
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
316 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
317
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
318 static debug_val debug_atan2(debug_val *args, int num_args)
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
319 {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
320 float f, f2;
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
321 if (!debug_cast_float(args[0], &f)) {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
322 return debug_float(0.0f);
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
323 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
324 if (!debug_cast_float(args[1], &f2)) {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
325 return debug_float(0.0f);
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
326 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
327 return debug_float(atan2f(f, f2));
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
328 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
329
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
330 static debug_val array_pop(debug_val *args, int num_args)
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
331 {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
332 debug_array *array = get_array(*args);
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
333 if (!array) {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
334 return debug_int(0);
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
335 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
336 debug_val ret = array->get(array, array->size - 1);
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
337 if (array->append) {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
338 array->size--;
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
339 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
340 return ret;
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
341 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
342
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
343 static debug_val debug_size(debug_val *args, int num_args)
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
344 {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
345 debug_array *array = get_array(*args);
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
346 if (!array) {
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
347 //TODO: string support
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
348 return debug_int(0);
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
349 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
350 return debug_int(array->size);
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
351 }
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
352
2380
1b21290358a8 Fix regression in debugger for Mega CD
Michael Pavone <pavone@retrodev.com>
parents: 2371
diff changeset
353 static debug_root **roots;
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
354 static uint32_t num_roots, root_storage;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
355
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
356 debug_root *find_root(void *cpu)
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
357 {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
358 for (uint32_t i = 0; i < num_roots; i++)
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
359 {
2380
1b21290358a8 Fix regression in debugger for Mega CD
Michael Pavone <pavone@retrodev.com>
parents: 2371
diff changeset
360 if (roots[i]->cpu_context == cpu) {
1b21290358a8 Fix regression in debugger for Mega CD
Michael Pavone <pavone@retrodev.com>
parents: 2371
diff changeset
361 return roots[i];
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
362 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
363 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
364 if (num_roots == root_storage) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
365 root_storage = root_storage ? root_storage * 2 : 5;
2380
1b21290358a8 Fix regression in debugger for Mega CD
Michael Pavone <pavone@retrodev.com>
parents: 2371
diff changeset
366 roots = realloc(roots, root_storage * sizeof(debug_root*));
1b21290358a8 Fix regression in debugger for Mega CD
Michael Pavone <pavone@retrodev.com>
parents: 2371
diff changeset
367 }
1b21290358a8 Fix regression in debugger for Mega CD
Michael Pavone <pavone@retrodev.com>
parents: 2371
diff changeset
368 debug_root *root = calloc(1, sizeof(debug_root));
1b21290358a8 Fix regression in debugger for Mega CD
Michael Pavone <pavone@retrodev.com>
parents: 2371
diff changeset
369 roots[num_roots++] = root;
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
370 root->cpu_context = cpu;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
371 new_readonly_variable(root, "sin", new_native_func(debug_sin, 1, 1));
2367
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
372 new_readonly_variable(root, "cos", new_native_func(debug_cos, 1, 1));
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
373 new_readonly_variable(root, "tan", new_native_func(debug_tan, 1, 1));
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
374 new_readonly_variable(root, "asin", new_native_func(debug_asin, 1, 1));
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
375 new_readonly_variable(root, "acos", new_native_func(debug_acos, 1, 1));
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
376 new_readonly_variable(root, "atan", new_native_func(debug_atan, 1, 1));
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
377 new_readonly_variable(root, "atan2", new_native_func(debug_atan2, 2, 2));
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
378 new_readonly_variable(root, "pop", new_native_func(array_pop, 1, 1));
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
379 new_readonly_variable(root, "size", new_native_func(debug_size, 1, 1));
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
380 return root;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
381 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
382
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
383 bp_def ** find_breakpoint(bp_def ** cur, uint32_t address, uint8_t type)
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
384 {
2396
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
385 if (type == BP_TYPE_CPU_WATCH) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
386 while (*cur) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
387 if ((*cur)->type == type && address >= (*cur)->address && address < ((*cur)->address + (*cur)->mask)) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
388 break;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
389 }
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
390 cur = &((*cur)->next);
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
391 }
2396
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
392 } else {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
393 while (*cur) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
394 if ((*cur)->type == type && (*cur)->address == (((*cur)->mask) & address)) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
395 break;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
396 }
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
397 cur = &((*cur)->next);
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
398 }
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
399 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
400 return cur;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
401 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
402
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
403 bp_def ** find_breakpoint_idx(bp_def ** cur, uint32_t index)
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
404 {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
405 while (*cur) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
406 if ((*cur)->index == index) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
407 break;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
408 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
409 cur = &((*cur)->next);
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
410 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
411 return cur;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
412 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
413
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
414 static const char *token_type_names[] = {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
415 "TOKEN_NONE",
2363
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
416 "TOKEN_INT",
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
417 "TOKEN_DECIMAL",
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
418 "TOKEN_NAME",
2364
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
419 "TOKEN_ARRAY",
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
420 "TOKEN_FUNCALL",
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
421 "TOKEN_OPER",
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
422 "TOKEN_SIZE",
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
423 "TOKEN_LBRACKET",
2171
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
424 "TOKEN_RBRACKET",
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
425 "TOKEN_LPAREN",
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
426 "TOKEN_RPAREN",
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
427 "TOKEN_STRING"
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
428 };
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
429
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
430 static char *parse_string_literal(char *start, char **end)
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
431 {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
432 uint32_t length = 0;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
433 uint8_t is_escape = 0;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
434 char *cur;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
435 for (cur = start; *cur && *cur != '"'; cur++)
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
436 {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
437 if (is_escape) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
438 switch (*cur)
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
439 {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
440 case 't':
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
441 case 'n':
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
442 case 'r':
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
443 case '\\':
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
444 break;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
445 default:
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
446 fprintf(stderr, "Unsupported escape character %c\n", *cur);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
447 return NULL;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
448 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
449 is_escape = 0;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
450 } else if (*cur == '\\') {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
451 is_escape = 1;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
452 continue;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
453 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
454 length++;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
455 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
456 if (!*cur) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
457 fprintf(stderr, "Unterminated string literal: %s\n", start);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
458 return NULL;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
459 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
460 *end = cur + 1;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
461 char *ret = calloc(1, length + 1);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
462 char *dst = ret;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
463 is_escape = 0;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
464 for (cur = start; *cur != '"'; ++cur)
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
465 {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
466 if (is_escape) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
467 switch (*cur)
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
468 {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
469 case 't':
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
470 *(dst++) = '\t';
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
471 break;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
472 case 'n':
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
473 *(dst++) = '\n';
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
474 break;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
475 case 'r':
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
476 *(dst++) = '\r';
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
477 break;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
478 case '\\':
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
479 *(dst++) = '\\';
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
480 break;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
481 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
482 is_escape = 0;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
483 } else if (*cur == '\\') {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
484 is_escape = 1;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
485 continue;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
486 } else {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
487 *(dst++) = *cur;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
488 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
489 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
490 *dst = 0;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
491 return ret;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
492 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
493
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
494 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
495 {
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
496 while(*start && isblank(*start) && *start != '\n' && *start != '\r')
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
497 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
498 ++start;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
499 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
500 if (!*start || *start == '\n' || *start == '\r') {
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
501 *end = start;
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
502 return (token){
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
503 .type = TOKEN_NONE
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
504 };
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
505 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
506 if (*start == '$' || (*start == '0' && start[1] == 'x')) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
507 return (token) {
2363
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
508 .type = TOKEN_INT,
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
509 .v = {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
510 .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
511 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
512 };
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
513 }
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
514 if (*start == '"') {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
515 char *str = parse_string_literal(start + 1, end);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
516 if (!str) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
517 *end = start;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
518 return (token){
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
519 .type = TOKEN_NONE
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
520 };
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
521 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
522 return (token){
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
523 .type = TOKEN_STRING,
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
524 .v = {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
525 .str = str
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
526 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
527 };
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
528 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
529 if (isdigit(*start)) {
2363
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
530 uint32_t ipart = strtol(start, end, 10);
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
531 if (**end == '.') {
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
532 start = *end + 1;
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
533 uint32_t fpart = strtol(start, end, 10);
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
534 float fval;
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
535 if (fpart) {
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
536 float divisor = powf(10.0f, *end - start);
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
537 fval = ipart + fpart / divisor;
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
538 } else {
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
539 fval = ipart;
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
540 }
2363
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
541 return (token) {
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
542 .type = TOKEN_DECIMAL,
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
543 .v = {
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
544 .f = fval
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
545 }
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
546 };
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
547 } else {
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
548 return (token) {
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
549 .type = TOKEN_INT,
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
550 .v = {
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
551 .num = ipart
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
552 }
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
553 };
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
554 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
555 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
556 switch (*start)
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
557 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
558 case '+':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
559 case '-':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
560 case '*':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
561 case '/':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
562 case '&':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
563 case '|':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
564 case '^':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
565 case '~':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
566 case '=':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
567 case '!':
2191
d87a76afbd8a Add '>', '<', '>=' and '<=' operators to debugger expression engine
Michael Pavone <pavone@retrodev.com>
parents: 2190
diff changeset
568 case '>':
d87a76afbd8a Add '>', '<', '>=' and '<=' operators to debugger expression engine
Michael Pavone <pavone@retrodev.com>
parents: 2190
diff changeset
569 case '<':
d87a76afbd8a Add '>', '<', '>=' and '<=' operators to debugger expression engine
Michael Pavone <pavone@retrodev.com>
parents: 2190
diff changeset
570 if ((*start == '!' || *start == '>' || *start == '<') && start[1] == '=') {
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
571 *end = start + 2;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
572 return (token) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
573 .type = TOKEN_OPER,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
574 .v = {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
575 .op = {*start, start[1], 0}
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
576 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
577 };
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
578 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
579 *end = start + 1;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
580 return (token) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
581 .type = TOKEN_OPER,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
582 .v = {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
583 .op = {*start, 0}
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
584 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
585 };
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
586 case '.':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
587 *end = start + 2;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
588 return (token) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
589 .type = TOKEN_SIZE,
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
590 .v = {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
591 .op = {start[1], 0}
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
592 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
593 };
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
594 case '[':
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
595 *end = start + 1;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
596 return (token) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
597 .type = TOKEN_LBRACKET
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
598 };
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
599 case ']':
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
600 *end = start + 1;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
601 return (token) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
602 .type = TOKEN_RBRACKET
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
603 };
2171
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
604 case '(':
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
605 *end = start + 1;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
606 return (token) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
607 .type = TOKEN_LPAREN
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
608 };
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
609 case ')':
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
610 *end = start + 1;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
611 return (token) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
612 .type = TOKEN_RPAREN
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
613 };
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
614 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
615 *end = start + 1;
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
616 token_type type = TOKEN_NAME;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
617 while (**end && !isspace(**end))
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
618 {
2172
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
619 uint8_t done = 0;
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
620 switch (**end)
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
621 {
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
622 case '[':
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
623 type = TOKEN_ARRAY;
2364
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
624 done = 1;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
625 break;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
626 case '(':
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
627 type = TOKEN_FUNCALL;
2172
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
628 case '+':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
629 case '-':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
630 case '*':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
631 case '/':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
632 case '&':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
633 case '|':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
634 case '^':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
635 case '~':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
636 case '=':
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
637 case '!':
2191
d87a76afbd8a Add '>', '<', '>=' and '<=' operators to debugger expression engine
Michael Pavone <pavone@retrodev.com>
parents: 2190
diff changeset
638 case '>':
d87a76afbd8a Add '>', '<', '>=' and '<=' operators to debugger expression engine
Michael Pavone <pavone@retrodev.com>
parents: 2190
diff changeset
639 case '<':
2172
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
640 case '.':
2357
344c6a3fe8a8 Fix annoying bug in debugger tokenizer
Michael Pavone <pavone@retrodev.com>
parents: 2302
diff changeset
641 case ']':
344c6a3fe8a8 Fix annoying bug in debugger tokenizer
Michael Pavone <pavone@retrodev.com>
parents: 2302
diff changeset
642 case ')':
2172
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
643 done = 1;
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
644 break;
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
645 }
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
646 if (done) {
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
647 break;
a00773a336d8 Fix bug in debugger lexer
Michael Pavone <pavone@retrodev.com>
parents: 2171
diff changeset
648 }
2186
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
649
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
650 ++*end;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
651 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
652 char *name = malloc(*end - start + 1);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
653 memcpy(name, start, *end - start);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
654 name[*end-start] = 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
655 return (token) {
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
656 .type = type,
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
657 .v = {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
658 .str = name
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 };
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
661 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
662
2364
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
663 static void free_expr(expr *e);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
664 static void free_expr_int(expr *e)
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
665 {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
666 free_expr(e->left);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
667 if (e->type == EXPR_FUNCALL) {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
668 for (uint32_t i = 0; i < e->op.v.num; i++)
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
669 {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
670 free_expr_int(e->right + i);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
671 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
672 free(e->right);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
673 } else {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
674 free_expr(e->right);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
675 }
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
676 if (e->op.type == TOKEN_NAME || e->op.type == TOKEN_ARRAY || e->op.type == TOKEN_STRING) {
2364
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
677 free(e->op.v.str);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
678 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
679 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
680
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
681 static void free_expr(expr *e)
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
682 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
683 if (!e) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
684 return;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
685 }
2364
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
686 free_expr_int(e);
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
687 free(e);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
688 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
689
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
690 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
691 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
692
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
693 static void handle_namespace(expr *e)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
694 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
695 if (e->op.type != TOKEN_NAME && e->op.type != TOKEN_ARRAY) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
696 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
697 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
698 char *start = e->op.v.str;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
699 char *orig_start = start;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
700 for (char *cur = start; *cur; ++cur)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
701 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
702 if (*cur == ':') {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
703 char *ns = malloc(cur - start + 1);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
704 memcpy(ns, start, cur - start);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
705 ns[cur - start] = 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
706 expr *inner = calloc(1, sizeof(expr));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
707 inner->type = EXPR_SCALAR;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
708 inner->op.type = TOKEN_NAME;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
709 start = cur + 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
710 inner->op.v.str = start;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
711 e->left = inner;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
712 e->type = EXPR_NAMESPACE;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
713 e->op.v.str = ns;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
714 e = inner;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
715 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
716 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
717 if (start != orig_start) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
718 //We've split the original string up into
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
719 //a bunch of individually allocated fragments
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
720 //this is just a little stup of the original
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
721 e->op.v.str = strdup(e->op.v.str);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
722 free(orig_start);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
723 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
724 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
725
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
726 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
727 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
728 char *after_first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
729 token first = parse_token(start, &after_first);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
730 if (!first.type) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
731 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
732 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
733 if (first.type == TOKEN_SIZE) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
734 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
735 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
736 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
737 if (first.type == TOKEN_OPER) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
738 expr *target = parse_scalar(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
739 if (!target) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
740 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
741 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
742 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
743 expr *ret = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
744 ret->type = EXPR_UNARY;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
745 ret->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
746 ret->left = target;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
747 *end = after_first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
748 return ret;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
749 }
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
750 if (first.type == TOKEN_LBRACKET || first.type == TOKEN_ARRAY) {
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
751 expr *ret = calloc(1, sizeof(expr));
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
752 ret->type = EXPR_MEM;
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
753 if (first.type == TOKEN_ARRAY) {
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
754 //current token is the array name
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
755 //consume the bracket token
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
756 parse_token(after_first, &after_first);
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
757 ret->right = calloc(1, sizeof(expr));
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
758 ret->right->type = EXPR_SCALAR;
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
759 ret->right->op = first;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
760 handle_namespace(ret->right);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
761 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
762
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
763 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
764 if (!ret->left) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
765 fprintf(stderr, "Expression expected after `[`\n");
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
766 free(ret);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
767 return NULL;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
768 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
769 token rbrack = parse_token(*end, end);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
770 if (rbrack.type != TOKEN_RBRACKET) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
771 fprintf(stderr, "Missing closing `]`");
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
772 free_expr(ret);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
773 return NULL;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
774 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
775 char *after_size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
776 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
777 if (size.type == TOKEN_SIZE) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
778 *end = after_size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
779 ret->op = size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
780 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
781 return ret;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
782 }
2171
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
783 if (first.type == TOKEN_LPAREN) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
784 expr *ret = parse_expression(after_first, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
785 if (!ret) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
786 fprintf(stderr, "Expression expected after `(`\n");
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
787 return NULL;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
788 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
789 token rparen = parse_token(*end, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
790 if (rparen.type != TOKEN_RPAREN) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
791 fprintf(stderr, "Missing closing `)`");
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
792 free_expr(ret);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
793 return NULL;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
794 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
795 return ret;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
796 }
2364
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
797 if (first.type == TOKEN_FUNCALL) {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
798 expr *ret = calloc(1, sizeof(expr));
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
799 ret->left = calloc(1, sizeof(expr));
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
800 ret->left->type = EXPR_SCALAR;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
801 ret->left->op = first;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
802 ret->left->op.type = TOKEN_NAME;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
803 uint32_t storage = 0;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
804 ret->op.v.num = 0;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
805 token next = parse_token(after_first, end);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
806 while (next.type != TOKEN_RPAREN && next.type != TOKEN_NONE)
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
807 {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
808 expr *e = parse_expression(after_first, end);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
809 if (!e) {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
810 fprintf(stderr, "Expression expected after '('\n");
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
811 free_expr(ret);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
812 return NULL;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
813 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
814 if (storage == ret->op.v.num) {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
815 storage = storage ? storage * 2 : 1;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
816 ret->right = realloc(ret->right, storage * sizeof(expr));
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
817 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
818 ret->right[ret->op.v.num++] = *e;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
819 free(e);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
820 after_first = *end;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
821 next = parse_token(after_first, end);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
822 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
823 if (next.type != TOKEN_RPAREN) {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
824 fprintf(stderr, "Missing ')' after '('\n");
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
825 free_expr(ret);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
826 return NULL;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
827 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
828 return ret;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
829 }
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
830 if (first.type != TOKEN_INT && first.type != TOKEN_DECIMAL && first.type != TOKEN_NAME && first.type != TOKEN_STRING) {
2171
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
831 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
832 return NULL;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
833 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
834 token second = parse_token(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
835 if (second.type != TOKEN_SIZE) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
836 expr *ret = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
837 ret->type = EXPR_SCALAR;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
838 ret->op = first;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
839 handle_namespace(ret);
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
840 *end = after_first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
841 return ret;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
842 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
843 expr *ret = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
844 ret->type = EXPR_SIZE;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
845 ret->left = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
846 ret->left->type = EXPR_SCALAR;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
847 ret->left->op = second;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
848 handle_namespace(ret->left);
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
849 ret->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
850 return ret;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
851 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
852
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
853 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
854 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
855 char *after_first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
856 token first = parse_token(start, &after_first);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
857 if (first.type != TOKEN_OPER) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
858 *end = start;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
859 return left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
860 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
861 expr *bin = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
862 bin->left = left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
863 bin->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
864 bin->type = EXPR_BINARY;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
865 switch (first.v.op[0])
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
866 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
867 case '*':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
868 case '/':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
869 case '&':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
870 case '|':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
871 case '^':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
872 bin->right = parse_scalar(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
873 return maybe_binary(bin, *end, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
874 case '+':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
875 case '-':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
876 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
877 return maybe_binary(bin, *end, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
878 case '=':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
879 case '!':
2191
d87a76afbd8a Add '>', '<', '>=' and '<=' operators to debugger expression engine
Michael Pavone <pavone@retrodev.com>
parents: 2190
diff changeset
880 case '>':
d87a76afbd8a Add '>', '<', '>=' and '<=' operators to debugger expression engine
Michael Pavone <pavone@retrodev.com>
parents: 2190
diff changeset
881 case '<':
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
882 bin->right = parse_expression(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
883 return bin;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
884 default:
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
885 bin->left = NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
886 free(bin);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
887 return left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
888 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
889 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
890
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
891 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
892 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
893 char *after_first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
894 token first = parse_token(start, &after_first);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
895 if (first.type != TOKEN_OPER) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
896 *end = start;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
897 return left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
898 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
899 expr *bin = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
900 bin->left = left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
901 bin->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
902 bin->type = EXPR_BINARY;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
903 switch (first.v.op[0])
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
904 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
905 case '*':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
906 case '/':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
907 case '&':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
908 case '|':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
909 case '^':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
910 bin->right = parse_scalar(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
911 return maybe_binary(bin, *end, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
912 default:
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
913 bin->left = NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
914 free(bin);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
915 return left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
916 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
917 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
918
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
919 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
920 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
921 char *after_first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
922 token first = parse_token(start, &after_first);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
923 if (!first.type) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
924 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
925 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
926 if (first.type == TOKEN_SIZE) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
927 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
928 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
929 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
930 if (first.type == TOKEN_OPER) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
931 expr *target = parse_scalar(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
932 if (!target) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
933 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
934 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
935 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
936 expr *ret = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
937 ret->type = EXPR_UNARY;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
938 ret->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
939 ret->left = target;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
940 return ret;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
941 }
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
942 if (first.type == TOKEN_LBRACKET || first.type == TOKEN_ARRAY) {
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
943 expr *ret = calloc(1, sizeof(expr));
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
944 ret->type = EXPR_MEM;
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
945 if (first.type == TOKEN_ARRAY) {
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
946 //current token is the array name
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
947 //consume the bracket token
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
948 parse_token(after_first, &after_first);
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
949 ret->right = calloc(1, sizeof(expr));
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
950 ret->right->type = EXPR_SCALAR;
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
951 ret->right->op = first;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
952 handle_namespace(ret->right);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
953 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
954
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
955 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
956 if (!ret->left) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
957 fprintf(stderr, "Expression expected after `[`\n");
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
958 free(ret);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
959 return NULL;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
960 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
961 token rbrack = parse_token(*end, end);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
962 if (rbrack.type != TOKEN_RBRACKET) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
963 fprintf(stderr, "Missing closing `]`");
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
964 free_expr(ret);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
965 return NULL;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
966 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
967 char *after_size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
968 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
969 if (size.type == TOKEN_SIZE) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
970 *end = after_size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
971 ret->op = size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
972 }
2171
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
973 return maybe_muldiv(ret, *end, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
974 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
975 if (first.type == TOKEN_LPAREN) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
976 expr *ret = parse_expression(after_first, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
977 if (!ret) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
978 fprintf(stderr, "Expression expected after `(`\n");
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
979 return NULL;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
980 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
981 token rparen = parse_token(*end, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
982 if (rparen.type != TOKEN_RPAREN) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
983 fprintf(stderr, "Missing closing `)`");
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
984 free_expr(ret);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
985 return NULL;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
986 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
987 return maybe_muldiv(ret, *end, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
988 }
2364
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
989 if (first.type == TOKEN_FUNCALL) {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
990 expr *ret = calloc(1, sizeof(expr));
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
991 ret->left = calloc(1, sizeof(expr));
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
992 ret->left->type = EXPR_SCALAR;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
993 ret->left->op = first;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
994 ret->left->op.type = TOKEN_NAME;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
995 uint32_t storage = 0;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
996 ret->op.v.num = 0;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
997 token next = parse_token(after_first, end);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
998 while (next.type != TOKEN_RPAREN && next.type != TOKEN_NONE)
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
999 {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1000 expr *e = parse_expression(after_first, end);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1001 if (!e) {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1002 fprintf(stderr, "Expression expected after '('\n");
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1003 free_expr(ret);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1004 return NULL;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1005 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1006 if (storage == ret->op.v.num) {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1007 storage = storage ? storage * 2 : 1;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1008 ret->right = realloc(ret->right, storage * sizeof(expr));
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1009 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1010 ret->right[ret->op.v.num++] = *e;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1011 free(e);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1012 after_first = *end;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1013 next = parse_token(after_first, end);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1014 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1015 if (next.type != TOKEN_RPAREN) {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1016 fprintf(stderr, "Missing ')' after '('\n");
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1017 free_expr(ret);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1018 return NULL;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1019 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1020 return maybe_muldiv(ret, *end, end);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1021 }
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
1022 if (first.type != TOKEN_INT && first.type != TOKEN_DECIMAL && first.type != TOKEN_NAME && first.type != TOKEN_STRING) {
2171
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1023 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
1024 return NULL;
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1025 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1026 char *after_second;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1027 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
1028 if (second.type == TOKEN_OPER) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1029 expr *ret;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1030 expr *bin = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1031 bin->type = EXPR_BINARY;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1032 bin->left = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1033 bin->left->type = EXPR_SCALAR;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1034 bin->left->op = first;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1035 handle_namespace(bin->left);
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1036 bin->op = second;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1037 switch (second.v.op[0])
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1038 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1039 case '*':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1040 case '/':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1041 case '&':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1042 case '|':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1043 case '^':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1044 bin->right = parse_scalar(after_second, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1045 return maybe_muldiv(bin, *end, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1046 case '+':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1047 case '-':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1048 case '=':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1049 case '!':
2191
d87a76afbd8a Add '>', '<', '>=' and '<=' operators to debugger expression engine
Michael Pavone <pavone@retrodev.com>
parents: 2190
diff changeset
1050 case '>':
d87a76afbd8a Add '>', '<', '>=' and '<=' operators to debugger expression engine
Michael Pavone <pavone@retrodev.com>
parents: 2190
diff changeset
1051 case '<':
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1052 ret = bin->left;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1053 bin->left = NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1054 free_expr(bin);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1055 return ret;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1056 default:
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1057 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
1058 free(bin->left);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1059 free(bin);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1060 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1061 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1062 } else if (second.type == TOKEN_SIZE) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1063 expr *value = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1064 value->type = EXPR_SIZE;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1065 value->op = second;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1066 value->left = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1067 value->left->type = EXPR_SCALAR;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1068 value->left->op = first;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1069 handle_namespace(value->left);
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1070 return maybe_muldiv(value, after_second, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1071 } else {
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1072 expr *ret = calloc(1, sizeof(expr));
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1073 ret->type = EXPR_SCALAR;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1074 ret->op = first;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1075 handle_namespace(ret);
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1076 *end = after_first;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1077 return ret;
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1078 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1079 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1080
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1081 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
1082 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1083 char *after_first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1084 token first = parse_token(start, &after_first);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1085 if (!first.type) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1086 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1087 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1088 if (first.type == TOKEN_SIZE) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1089 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
1090 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1091 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1092 if (first.type == TOKEN_OPER) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1093 expr *target = parse_scalar(after_first, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1094 if (!target) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1095 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
1096 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1097 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1098 expr *ret = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1099 ret->type = EXPR_UNARY;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1100 ret->op = first;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1101 ret->left = target;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1102 return ret;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1103 }
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1104 if (first.type == TOKEN_LBRACKET || first.type == TOKEN_ARRAY) {
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1105 expr *ret = calloc(1, sizeof(expr));
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1106 ret->type = EXPR_MEM;
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1107 if (first.type == TOKEN_ARRAY) {
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1108 //current token is the array name
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1109 //consume the bracket token
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1110 parse_token(after_first, &after_first);
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1111 ret->right = calloc(1, sizeof(expr));
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1112 ret->right->type = EXPR_SCALAR;
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1113 ret->right->op = first;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1114 handle_namespace(ret->right);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1115 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1116
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1117 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
1118 if (!ret->left) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1119 fprintf(stderr, "Expression expected after `[`\n");
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1120 free(ret);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1121 return NULL;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1122 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1123 token rbrack = parse_token(*end, end);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1124 if (rbrack.type != TOKEN_RBRACKET) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1125 fprintf(stderr, "Missing closing `]`");
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1126 free_expr(ret);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1127 return NULL;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1128 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1129 char *after_size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1130 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
1131 if (size.type == TOKEN_SIZE) {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1132 *end = after_size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1133 ret->op = size;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1134 }
2171
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1135 return maybe_binary(ret, *end, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1136 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1137 if (first.type == TOKEN_LPAREN) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1138 expr *ret = parse_expression(after_first, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1139 if (!ret) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1140 fprintf(stderr, "Expression expected after `(`\n");
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1141 return NULL;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1142 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1143 token rparen = parse_token(*end, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1144 if (rparen.type != TOKEN_RPAREN) {
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1145 fprintf(stderr, "Missing closing `)`");
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1146 free_expr(ret);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1147 return NULL;
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1148 }
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1149 return maybe_binary(ret, *end, end);
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1150 }
2364
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1151 if (first.type == TOKEN_FUNCALL) {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1152 expr *ret = calloc(1, sizeof(expr));
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1153 ret->type = EXPR_FUNCALL;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1154 ret->left = calloc(1, sizeof(expr));
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1155 ret->left->type = EXPR_SCALAR;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1156 ret->left->op = first;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1157 ret->left->op.type = TOKEN_NAME;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1158 uint32_t storage = 0;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1159 ret->op.v.num = 0;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1160 //consume LPAREN
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1161 parse_token(after_first, end);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1162 after_first = *end;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1163 token next = parse_token(after_first, end);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1164 while (next.type != TOKEN_RPAREN && next.type != TOKEN_NONE)
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1165 {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1166 expr *e = parse_expression(after_first, end);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1167 if (!e) {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1168 fprintf(stderr, "Expression expected after '('\n");
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1169 free_expr(ret);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1170 return NULL;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1171 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1172 if (storage == ret->op.v.num) {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1173 storage = storage ? storage * 2 : 1;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1174 ret->right = realloc(ret->right, storage * sizeof(expr));
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1175 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1176 ret->right[ret->op.v.num++] = *e;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1177 free(e);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1178 after_first = *end;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1179 next = parse_token(after_first, end);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1180 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1181 if (next.type != TOKEN_RPAREN) {
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1182 fprintf(stderr, "Missing ')' after '('\n");
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1183 free_expr(ret);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1184 return NULL;
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1185 }
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1186 return maybe_binary(ret, *end, end);
c822bb628fc3 Add support for function call expressions in debug parser
Michael Pavone <pavone@retrodev.com>
parents: 2363
diff changeset
1187 }
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
1188 if (first.type != TOKEN_INT && first.type != TOKEN_DECIMAL && first.type != TOKEN_NAME && first.type != TOKEN_STRING) {
2171
4b47155965c8 Implement parentheses in debugger parser
Michael Pavone <pavone@retrodev.com>
parents: 2170
diff changeset
1189 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
1190 return NULL;
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1191 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1192 char *after_second;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1193 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
1194 if (second.type == TOKEN_OPER) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1195 expr *bin = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1196 bin->type = EXPR_BINARY;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1197 bin->left = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1198 bin->left->type = EXPR_SCALAR;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1199 bin->left->op = first;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1200 handle_namespace(bin->left);
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1201 bin->op = second;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1202 switch (second.v.op[0])
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1203 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1204 case '*':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1205 case '/':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1206 case '&':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1207 case '|':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1208 case '^':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1209 bin->right = parse_scalar(after_second, end);
2186
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1210 if (!bin->right) {
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1211 fprintf(stderr, "Expected expression to the right of %s\n", second.v.op);
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1212 free_expr(bin);
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1213 return NULL;
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1214 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1215 return maybe_binary(bin, *end, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1216 case '+':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1217 case '-':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1218 bin->right = parse_scalar_or_muldiv(after_second, end);
2186
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1219 if (!bin->right) {
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1220 fprintf(stderr, "Expected expression to the right of %s\n", second.v.op);
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1221 free_expr(bin);
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1222 return NULL;
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1223 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1224 return maybe_binary(bin, *end, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1225 case '=':
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1226 case '!':
2191
d87a76afbd8a Add '>', '<', '>=' and '<=' operators to debugger expression engine
Michael Pavone <pavone@retrodev.com>
parents: 2190
diff changeset
1227 case '>':
d87a76afbd8a Add '>', '<', '>=' and '<=' operators to debugger expression engine
Michael Pavone <pavone@retrodev.com>
parents: 2190
diff changeset
1228 case '<':
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1229 bin->right = parse_expression(after_second, end);
2186
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1230 if (!bin->right) {
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1231 fprintf(stderr, "Expected expression to the right of %s\n", second.v.op);
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1232 free_expr(bin);
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1233 return NULL;
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
1234 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1235 return bin;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1236 default:
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1237 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
1238 free(bin->left);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1239 free(bin);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1240 return NULL;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1241 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1242 } else if (second.type == TOKEN_SIZE) {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1243 expr *value = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1244 value->type = EXPR_SIZE;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1245 value->op = second;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1246 value->left = calloc(1, sizeof(expr));
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1247 value->left->type = EXPR_SCALAR;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1248 value->left->op = first;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1249 handle_namespace(value->left);
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1250 return maybe_binary(value, after_second, end);
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1251 } else {
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1252 if (second.type == TOKEN_NAME) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1253 free(second.v.str);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1254 }
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1255 expr *ret = calloc(1, sizeof(expr));
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1256 ret->type = EXPR_SCALAR;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1257 ret->op = first;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1258 handle_namespace(ret);
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1259 *end = after_first;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1260 return ret;
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1261 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1262 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1263
2371
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1264 static uint8_t execute_block(debug_root *root, command_block * block);
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1265 uint8_t eval_expr(debug_root *root, expr *e, debug_val *out)
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1266 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1267 debug_val right;
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1268 debug_val *args;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1269 debug_func *func;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1270 int num_args;
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1271 switch(e->type)
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1272 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1273 case EXPR_SCALAR:
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1274 if (e->op.type == TOKEN_NAME || e->op.type == TOKEN_ARRAY) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1275 debug_var *var = tern_find_ptr(root->variables, e->op.v.str);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1276 if (!var) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1277 return 0;
2214
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
1278 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1279 *out = var->get(var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1280 return 1;
2363
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
1281 } else if (e->op.type == TOKEN_INT) {
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
1282 *out = debug_int(e->op.v.num);
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
1283 return 1;
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
1284 } else if (e->op.type == TOKEN_DECIMAL){
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
1285 *out = debug_float(e->op.v.f);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
1286 return 1;
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1287 } else {
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
1288 *out = new_debug_string(e->op.v.str);
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1289 return 1;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1290 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1291 case EXPR_UNARY:
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
1292 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
1293 return 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1294 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1295 switch (e->op.v.op[0])
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1296 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1297 case '!':
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1298 if (out->type != DBG_VAL_U32) { fprintf(stderr, "operator ! is only defined for integers"); return 0; }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1299 out->v.u32 = !out->v.u32;
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1300 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1301 case '~':
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1302 if (out->type != DBG_VAL_U32) { fprintf(stderr, "operator ~ is only defined for integers"); return 0; }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1303 out->v.u32 = ~out->v.u32;
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1304 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1305 case '-':
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1306 if (out->type == DBG_VAL_U32) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1307 out->v.u32 = -out->v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1308 } else if (out->type == DBG_VAL_F32) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1309 out->v.f32 = -out->v.f32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1310 } else {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1311 fprintf(stderr, "operator ~ is only defined for integers and floats");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1312 return 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1313 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1314 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1315 default:
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1316 return 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1317 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1318 return 1;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1319 case EXPR_BINARY:
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
1320 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
1321 return 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1322 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1323 if (out->type != right.type) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1324 if (out->type == DBG_VAL_F32) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1325 if (right.type == DBG_VAL_U32) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1326 right.type = DBG_VAL_F32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1327 float v = right.v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1328 right.v.f32 = v;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1329 } else {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1330 fprintf(stderr, "Invalid type on right side of binary operator\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1331 return 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1332 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1333 } else if (out->type == DBG_VAL_U32) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1334 if (right.type == DBG_VAL_F32) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1335 out->type = DBG_VAL_F32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1336 float v = out->v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1337 out->v.f32 = v;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1338 } else {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1339 fprintf(stderr, "Invalid type on right side of binary operator\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1340 return 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1341 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1342 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1343 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1344 if (out->type == DBG_VAL_U32) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1345 switch (e->op.v.op[0])
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1346 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1347 case '+':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1348 out->v.u32 += right.v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1349 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1350 case '-':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1351 out->v.u32 -= right.v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1352 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1353 case '*':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1354 out->v.u32 *= right.v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1355 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1356 case '/':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1357 out->v.u32 /= right.v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1358 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1359 case '&':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1360 out->v.u32 &= right.v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1361 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1362 case '|':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1363 out->v.u32 |= right.v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1364 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1365 case '^':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1366 out->v.u32 ^= right.v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1367 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1368 case '=':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1369 out->v.u32 = out->v.u32 == right.v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1370 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1371 case '!':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1372 out->v.u32 = out->v.u32 != right.v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1373 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1374 case '>':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1375 out->v.u32 = e->op.v.op[1] ? out->v.u32 >= right.v.u32 : out->v.u32 > right.v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1376 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1377 case '<':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1378 out->v.u32 = e->op.v.op[1] ? out->v.u32 <= right.v.u32 : out->v.u32 < right.v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1379 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1380 default:
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1381 return 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1382 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1383 } else if (out->type == DBG_VAL_F32) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1384 switch (e->op.v.op[0])
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1385 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1386 case '+':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1387 out->v.f32 += right.v.f32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1388 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1389 case '-':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1390 out->v.f32 -= right.v.f32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1391 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1392 case '*':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1393 out->v.f32 *= right.v.f32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1394 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1395 case '/':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1396 out->v.f32 /= right.v.f32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1397 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1398 case '=':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1399 out->v.u32 = out->v.f32 == right.v.f32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1400 out->type = DBG_VAL_U32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1401 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1402 case '!':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1403 out->v.u32 = out->v.f32 != right.v.f32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1404 out->type = DBG_VAL_U32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1405 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1406 case '>':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1407 out->v.u32 = e->op.v.op[1] ? out->v.f32 >= right.v.f32 : out->v.f32 > right.v.f32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1408 out->type = DBG_VAL_U32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1409 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1410 case '<':
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1411 out->v.u32 = e->op.v.op[1] ? out->v.f32 <= right.v.f32 : out->v.f32 < right.v.f32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1412 out->type = DBG_VAL_U32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1413 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1414 default:
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1415 return 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1416 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1417 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1418 return 1;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1419 case EXPR_SIZE:
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
1420 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
1421 return 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1422 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1423 if (out->type != DBG_VAL_U32) { fprintf(stderr, "Size expressions are only defined for integers"); return 0; }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1424 switch (e->op.v.op[0])
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1425 {
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1426 case 'b':
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1427 out->v.u32 &= 0xFF;
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1428 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1429 case 'w':
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1430 out->v.u32 &= 0xFFFF;
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1431 break;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1432 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1433 return 1;
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1434 case EXPR_MEM:
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
1435 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
1436 return 0;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1437 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1438 if (out->type != DBG_VAL_U32) { fprintf(stderr, "Array index must be integer"); return 0; }
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1439 if (e->right) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1440 if (!eval_expr(root, e->right, &right)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1441 return 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1442 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1443 debug_array *array = get_array(right);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1444 if (!array) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1445 fprintf(stderr, "Attempt to index into value that is not an array");
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1446 return 0;
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1447 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1448 if (out->v.u32 >= array->size) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1449 return 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1450 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1451 *out = array->get(array, out->v.u32);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1452 return 1;
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1453 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1454 return root->read_mem(root, &out->v.u32, e->op.v.op[0]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1455 case EXPR_NAMESPACE:
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1456 root = tern_find_ptr(root->other_roots, e->op.v.str);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1457 if (!root) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1458 fprintf(stderr, "%s is not a valid namespace\n", e->op.v.str);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1459 return 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1460 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1461 return eval_expr(root, e->left, out);
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1462 case EXPR_FUNCALL:
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1463 if (!eval_expr(root, e->left, out)) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1464 return 0;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1465 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1466 if (out->type != DBG_VAL_FUNC) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1467 fprintf(stderr, "Funcall expression requires function");
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1468 return 0;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1469 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1470 func = funcs + out->v.u32;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1471 num_args = e->op.v.num;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1472 if (func->min_args > 0 && num_args < func->min_args) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1473 fprintf(stderr, "Function requires at least %d args, but %d given\n", func->min_args, num_args);
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1474 return 0;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1475 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1476 if (func->max_args >= 0 && num_args > func->max_args) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1477 fprintf(stderr, "Function requires no more than %d args, but %d given\n", func->max_args, num_args);
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1478 return 0;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1479 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1480 args = calloc(num_args, sizeof(debug_val));
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1481 for (int i = 0; i < num_args; i++)
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1482 {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1483 if (!eval_expr(root, e->right + i, args + i)) {
2371
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1484 free(args);
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1485 return 0;
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1486 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1487 }
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1488 if (func->is_native) {
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1489 *out = func->impl.native(args, num_args);
2371
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1490 free(args);
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1491 return 1;
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1492 } else {
2371
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1493 debug_root *func_root = calloc(1, sizeof(debug_root));
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1494 for (int i = 0; i < num_args; i++)
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1495 {
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1496 new_user_variable(func_root, func->arg_names[i], args[i]);
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1497 }
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1498 free(args);
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1499 func_root->other_roots = tern_insert_ptr(func_root->other_roots, "parent", root);
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1500 execute_block(func_root, &func->impl.block);
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1501 *out = func_root->retval;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1502 //FIXME: properly free root
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1503 tern_free(func_root->variables);
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1504 tern_free(func_root->other_roots);
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1505 free(func_root);
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
1506 return 1;
2365
8c060849a503 Basic function call support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2364
diff changeset
1507 }
2169
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1508 default:
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1509 return 0;
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1510 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1511 }
cb9572145f8e WIP support for expression parsing in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2133
diff changeset
1512
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1513 char * find_param(char * buf)
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1514 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1515 for (; *buf; buf++) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1516 if (*buf == ' ') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1517 if (*(buf+1)) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1518 return buf+1;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1519 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1520 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1521 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1522 return NULL;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1523 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1525 void strip_nl(char * buf)
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1526 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1527 for(; *buf; buf++) {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1528 if (*buf == '\n') {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1529 *buf = 0;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1530 return;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1531 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1532 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1533 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1534
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
1535 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
1536 {
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
1537 //TODO: share this implementation with GDB debugger
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2459
diff changeset
1538 return read_byte(address, (void **)context->mem_pointers, &context->opts->gen, context);
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
1539 }
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
1540
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1541 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
1542 {
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2459
diff changeset
1543 return read_word(address, (void **)context->mem_pointers, &context->opts->gen, 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
1544 }
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
1545
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1546 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
1547 {
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
1548 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
1549 }
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
1550
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
1551 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
1552 {
2175
8c28c5466d70 Minor cleanup of debugger changes
Michael Pavone <pavone@retrodev.com>
parents: 2174
diff changeset
1553 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
1554 if (size == 'b') {
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1555 *out = m68k_read_byte(*out, context);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1556 } else if (size == 'l') {
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1557 if (*out & 1) {
2386
9f178feb3cb0 Prefix most hex-formatted values output by debugger with $ for consistency with number literal parsing
Michael Pavone <pavone@retrodev.com>
parents: 2380
diff changeset
1558 fprintf(stderr, "Longword access to odd addresses ($%X) is not allowed\n", *out);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1559 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1560 }
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1561 *out = m68k_read_long(*out, context);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1562 } else {
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1563 if (*out & 1) {
2720
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
1564 fprintf(stderr, "Word access to odd addresses ($%X) is not allowed\n", *out);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1565 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1566 }
2170
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1567 *out = m68k_read_word(*out, context);
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1568 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1569 return 1;
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1570 }
ada3130b1396 Add memory indirection syntax to debugger parser/evaluator
Michael Pavone <pavone@retrodev.com>
parents: 2169
diff changeset
1571
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1572 static uint8_t write_m68k(debug_root *root, uint32_t address, uint32_t value, char size)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1573 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1574 m68k_context *context = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1575 if (size == 'b') {
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2459
diff changeset
1576 write_byte(address, value, (void **)context->mem_pointers, &context->opts->gen, context);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1577 } else if (size == 'l') {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1578 if (address & 1) {
2386
9f178feb3cb0 Prefix most hex-formatted values output by debugger with $ for consistency with number literal parsing
Michael Pavone <pavone@retrodev.com>
parents: 2380
diff changeset
1579 fprintf(stderr, "Longword access to odd addresses ($%X) is not allowed\n", address);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1580 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1581 }
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2459
diff changeset
1582 write_word(address, value >> 16, (void **)context->mem_pointers, &context->opts->gen, context);
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2459
diff changeset
1583 write_word(address + 2, value, (void **)context->mem_pointers, &context->opts->gen, context);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1584 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1585 if (address & 1) {
2386
9f178feb3cb0 Prefix most hex-formatted values output by debugger with $ for consistency with number literal parsing
Michael Pavone <pavone@retrodev.com>
parents: 2380
diff changeset
1586 fprintf(stderr, "Wword access to odd addresses ($%X) is not allowed\n", address);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1587 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1588 }
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2459
diff changeset
1589 write_word(address, value, (void **)context->mem_pointers, &context->opts->gen, context);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1590 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1591 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1592 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
1593
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1594 static debug_val m68k_dreg_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1595 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1596 m68k_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1597 return debug_int(context->dregs[var->val.v.u32]);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1598 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1599
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1600 static void m68k_dreg_set(debug_var *var, debug_val val)
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1601 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1602 m68k_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1603 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1604 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1605 fprintf(stderr, "M68K register d%d can only be set to an integer\n", var->val.v.u32);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1606 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1607 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1608 context->dregs[var->val.v.u32] = ival;
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1609 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1610
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1611 static debug_val m68k_areg_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1612 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1613 m68k_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1614 return debug_int(context->aregs[var->val.v.u32]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1615 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1616
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1617 static void m68k_areg_set(debug_var *var, debug_val val)
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1618 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1619 m68k_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1620 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1621 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1622 fprintf(stderr, "M68K register a%d can only be set to an integer\n", var->val.v.u32);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1623 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1624 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1625 context->aregs[var->val.v.u32] = ival;
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1626 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1627
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1628 static debug_val m68k_sr_get(debug_var *var)
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1629 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1630 m68k_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1631 debug_val ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1632 ret.v.u32 = context->status << 8;
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
1633 #ifdef NEW_CORE
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
1634 //TODO: implement me
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
1635 #else
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1636 for (int flag = 0; flag < 5; flag++)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1637 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1638 ret.v.u32 |= context->flags[flag] << (4-flag);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1639 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
1640 #endif
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1641 ret.type = DBG_VAL_U32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1642 return ret;
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1643 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1644
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1645 static void m68k_sr_set(debug_var *var, debug_val val)
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1646 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1647 m68k_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1648 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1649 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1650 fprintf(stderr, "M68K register sr can only be set to an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1651 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1652 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1653 context->status = ival >> 8;
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
1654 #ifdef NEW_CORE
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
1655 //TODO: implement me
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
1656 #else
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1657 for (int flag = 0; flag < 5; flag++) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1658 context->flags[flag] = (ival & (1 << (4 - flag))) != 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1659 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
1660 #endif
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1661 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1662
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1663 static debug_val m68k_cycle_get(debug_var *var)
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1664 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1665 m68k_context *context = var->ptr;
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2459
diff changeset
1666 return debug_int(context->cycles);
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1667 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1668
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1669 static debug_val m68k_usp_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1670 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1671 m68k_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1672 return debug_int(context->status & 0x20 ? context->aregs[8] : context->aregs[7]);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1673 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1674
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1675 static void m68k_usp_set(debug_var *var, debug_val val)
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1676 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1677 m68k_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1678 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1679 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1680 fprintf(stderr, "M68K register usp can only be set to an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1681 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1682 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1683 context->aregs[context->status & 0x20 ? 8 : 7] = ival;
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1684 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1685
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1686 static debug_val m68k_ssp_get(debug_var *var)
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1687 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1688 m68k_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1689 return debug_int(context->status & 0x20 ? context->aregs[7] : context->aregs[8]);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1690 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1691
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1692 static void m68k_ssp_set(debug_var *var, debug_val val)
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1693 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1694 m68k_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1695 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1696 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1697 fprintf(stderr, "M68K register ssp can only be set to an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1698 return;
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1699 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1700 context->aregs[context->status & 0x20 ? 7 : 8] = ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1701 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1702
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1703 static debug_val root_address_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1704 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1705 debug_root *root = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1706 return debug_int(root->address);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1707 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
1708
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1709 static void m68k_names(debug_root *root)
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1710 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1711 debug_var *var;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1712 for (char i = 0; i < 8; i++)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1713 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1714 char rname[3] = {'d', '0' + i, 0};
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1715 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1716 var->get = m68k_dreg_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1717 var->set = m68k_dreg_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1718 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1719 var->val.v.u32 = i;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1720 root->variables = tern_insert_ptr(root->variables, rname, var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1721 rname[0] = 'D';
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1722 root->variables = tern_insert_ptr(root->variables, rname, var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1723
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1724 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1725 var->get = m68k_areg_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1726 var->set = m68k_areg_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1727 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1728 var->val.v.u32 = i;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1729 rname[0] = 'a';
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1730 root->variables = tern_insert_ptr(root->variables, rname, var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1731 rname[0] = 'A';
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1732 root->variables = tern_insert_ptr(root->variables, rname, var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1733 if (i == 7) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1734 root->variables = tern_insert_ptr(root->variables, "sp", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1735 root->variables = tern_insert_ptr(root->variables, "SP", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1736 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1737 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1738
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1739 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1740 var->get = m68k_sr_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1741 var->set = m68k_sr_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1742 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1743 root->variables = tern_insert_ptr(root->variables, "sr", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1744 root->variables = tern_insert_ptr(root->variables, "SR", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1745
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1746 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1747 var->get = root_address_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1748 var->ptr = root;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1749 root->variables = tern_insert_ptr(root->variables, "pc", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1750 root->variables = tern_insert_ptr(root->variables, "PC", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1751
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1752 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1753 var->get = m68k_usp_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1754 var->set = m68k_usp_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1755 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1756 root->variables = tern_insert_ptr(root->variables, "usp", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1757 root->variables = tern_insert_ptr(root->variables, "USP", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1758
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1759 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1760 var->get = m68k_ssp_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1761 var->set = m68k_ssp_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1762 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1763 root->variables = tern_insert_ptr(root->variables, "ssp", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1764 root->variables = tern_insert_ptr(root->variables, "SSP", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1765
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1766 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1767 var->get = m68k_cycle_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1768 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1769 root->variables = tern_insert_ptr(root->variables, "cycle", var);
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1770 }
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1771
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1772 static debug_val vcounter_get(debug_var *var)
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1773 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1774 vdp_context *vdp = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1775 return debug_int(vdp->vcounter);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1776 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1777
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1778 static debug_val hcounter_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1779 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1780 vdp_context *vdp = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1781 return debug_int(vdp->hslot);
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1782 }
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1783
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1784 static debug_val vdp_address_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1785 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1786 vdp_context *vdp = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1787 return debug_int(vdp->address);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1788 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1789
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1790 static void vdp_address_set(debug_var *var, debug_val val)
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1791 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1792 vdp_context *vdp = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1793 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1794 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1795 fprintf(stderr, "vdp address can only be set to an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1796 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1797 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1798 vdp->address = ival & 0x1FFFF;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1799 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1800
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1801 static debug_val vdp_cd_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1802 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1803 vdp_context *vdp = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1804 return debug_int(vdp->cd);
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1805 }
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1806
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1807 static void vdp_cd_set(debug_var *var, debug_val val)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1808 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1809 vdp_context *vdp = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1810 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1811 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1812 fprintf(stderr, "vdp cd can only be set to an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1813 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1814 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1815 vdp->cd = ival & 0x3F;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1816 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1817
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1818 static debug_val vdp_status_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1819 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1820 vdp_context *vdp = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1821 return debug_int(vdp_status(vdp));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1822 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1823
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1824 static debug_val debug_vram_get(debug_array *array, uint32_t index)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1825 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1826 vdp_context *vdp = array->base;
2413
64cf80e683aa Initial support for Colecovision emulation
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
1827 if (!(vdp->regs[REG_MODE_2] & BIT_MODE_5)) {
64cf80e683aa Initial support for Colecovision emulation
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
1828 index = mode4_address_map[index & 0x3FFF] ^ 1;
64cf80e683aa Initial support for Colecovision emulation
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
1829 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1830 return debug_int(vdp->vdpmem[index]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1831 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1832
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1833 static void debug_vram_set(debug_array *array, uint32_t index, debug_val val)
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1834 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1835 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1836 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1837 fprintf(stderr, "vram can only be set to integers\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1838 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1839 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1840 vdp_context *vdp = array->base;
2413
64cf80e683aa Initial support for Colecovision emulation
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
1841 if (!(vdp->regs[REG_MODE_2] & BIT_MODE_5)) {
64cf80e683aa Initial support for Colecovision emulation
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
1842 index = mode4_address_map[index & 0x3FFF] ^ 1;
64cf80e683aa Initial support for Colecovision emulation
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
1843 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1844 vdp->vdpmem[index] = ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1845 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1846
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1847 static debug_val debug_vsram_get(debug_array *array, uint32_t index)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1848 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1849 vdp_context *vdp = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1850 return debug_int(vdp->vsram[index] & VSRAM_BITS);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1851 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1852
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1853 static void debug_vsram_set(debug_array *array, uint32_t index, debug_val val)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1854 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1855 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1856 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1857 fprintf(stderr, "vsram can only be set to integers\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1858 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1859 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1860 vdp_context *vdp = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1861 vdp->vsram[index] = ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1862 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1863
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1864 static debug_val debug_cram_get(debug_array *array, uint32_t index)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1865 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1866 vdp_context *vdp = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1867 return debug_int(vdp->cram[index] & CRAM_BITS);
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1868 }
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1869
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1870 static void debug_cram_set(debug_array *array, uint32_t index, debug_val val)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1871 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1872 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1873 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1874 fprintf(stderr, "cram can only be set to integers\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1875 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1876 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1877 vdp_context *vdp = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1878 vdp->cram[index] = ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1879 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1880
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1881 static debug_val debug_vreg_get(debug_array *array, uint32_t index)
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1882 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1883 vdp_context *vdp = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1884 return debug_int(vdp->regs[index]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1885 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1886
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1887 static void debug_vreg_set(debug_array *array, uint32_t index, debug_val val)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1888 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1889 vdp_context *vdp = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1890 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1891 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1892 fprintf(stderr, "vdp registers can only be set to integers\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1893 return;
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1894 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1895 vdp_reg_write(vdp, index, ival);
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1896 }
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1897
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1898 static debug_root* find_vdp_root(vdp_context *context)
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1899 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1900 debug_root *root = find_root(context);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1901 debug_var *var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1902 var->get = vcounter_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1903 var->ptr = context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1904 root->variables = tern_insert_ptr(root->variables, "vcounter", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1905
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1906 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1907 var->get = hcounter_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1908 var->ptr = context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1909 root->variables = tern_insert_ptr(root->variables, "hcounter", var);
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1910
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1911 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1912 var->get = vdp_address_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1913 var->set = vdp_address_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1914 var->ptr = context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1915 root->variables = tern_insert_ptr(root->variables, "address", var);
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1916
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1917 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1918 var->get = vdp_cd_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1919 var->set = vdp_cd_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1920 var->ptr = context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1921 root->variables = tern_insert_ptr(root->variables, "cd", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1922
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1923 new_readonly_variable(root, "vram", new_fixed_array(context, debug_vram_get, debug_vram_set, VRAM_SIZE));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1924 new_readonly_variable(root, "vsram", new_fixed_array(context, debug_vsram_get, debug_vsram_set, context->vsram_size));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1925 new_readonly_variable(root, "cram", new_fixed_array(context, debug_cram_get, debug_cram_set, CRAM_SIZE));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1926 new_readonly_variable(root, "reg", new_fixed_array(context, debug_vreg_get, debug_vreg_set, VDP_REGS));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1927
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1928 return root;
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1929 }
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1930
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1931 static debug_val debug_part1_get(debug_array *array, uint32_t index)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1932 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1933 ym2612_context *ym = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1934 return debug_int(ym->part1_regs[index]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1935 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1936
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1937 static void debug_part1_set(debug_array *array, uint32_t index, debug_val val)
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1938 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1939 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1940 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1941 fprintf(stderr, "ym2612 registers can only be set to integers\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1942 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1943 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1944 ym2612_context *ym = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1945 uint8_t old_part = ym->selected_part;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1946 uint8_t old_reg = ym->selected_reg;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1947 ym->selected_part = 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1948 ym->selected_reg = index;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1949 ym_data_write(ym, ival);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1950 ym->selected_part = old_part;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1951 ym->selected_reg = old_reg;
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1952 }
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1953
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1954 static debug_val debug_part2_get(debug_array *array, uint32_t index)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1955 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1956 ym2612_context *ym = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1957 return debug_int(ym->part2_regs[index]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1958 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1959
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1960 static void debug_part2_set(debug_array *array, uint32_t index, debug_val val)
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1961 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1962 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1963 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1964 fprintf(stderr, "ym2612 registers can only be set to integers\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1965 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1966 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1967 ym2612_context *ym = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1968 uint8_t old_part = ym->selected_part;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1969 uint8_t old_reg = ym->selected_reg;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1970 ym->selected_part = 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1971 ym->selected_reg = index;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1972 ym_data_write(ym, ival);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1973 ym->selected_part = old_part;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1974 ym->selected_reg = old_reg;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1975 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1976
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1977 static debug_root* find_ym2612_root(ym2612_context *context)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1978 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1979 debug_root *root = find_root(context);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1980
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1981 new_readonly_variable(root, "part1", new_fixed_array(context, debug_part1_get, debug_part1_set, YM_REG_END));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1982 new_readonly_variable(root, "part2", new_fixed_array(context, debug_part2_get, debug_part2_set, YM_REG_END));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1983
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1984 return root;
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1985 }
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1986
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1987
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1988 static debug_val debug_psgfreq_get(debug_array *array, uint32_t index)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1989 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1990 psg_context *psg = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1991 return debug_int(psg->counter_load[index]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1992 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1993
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1994 static void debug_psgfreq_set(debug_array *array, uint32_t index, debug_val val)
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
1995 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1996 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1997 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1998 fprintf(stderr, "psg registers can only be set to integers\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
1999 return;
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
2000 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2001 psg_context *psg = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2002 psg->counter_load[index] = ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2003 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2004
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2005 static debug_val debug_psgcount_get(debug_array *array, uint32_t index)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2006 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2007 psg_context *psg = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2008 return debug_int(psg->counters[index]);
2360
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
2009 }
053ba4551c62 Expose some more emu state via debugger array mechanism
Michael Pavone <pavone@retrodev.com>
parents: 2359
diff changeset
2010
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2011 static void debug_psgcount_set(debug_array *array, uint32_t index, debug_val val)
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2012 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2013 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2014 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2015 fprintf(stderr, "psg registers can only be set to integers\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2016 return;
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2017 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2018 psg_context *psg = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2019 psg->counters[index] = ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2020 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2021
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2022 static debug_val debug_psgvol_get(debug_array *array, uint32_t index)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2023 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2024 psg_context *psg = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2025 return debug_int(psg->volume[index]);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2026 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2027
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2028 static void debug_psgvol_set(debug_array *array, uint32_t index, debug_val val)
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2029 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2030 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2031 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2032 fprintf(stderr, "psg registers can only be set to integers\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2033 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2034 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2035 psg_context *psg = array->base;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2036 psg->volume[index] = ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2037 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2038
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2039 debug_root *find_psg_root(psg_context *psg)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2040 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2041 debug_root *root = find_root(psg);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2042
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2043 new_readonly_variable(root, "frequency", new_fixed_array(psg, debug_psgfreq_get, debug_psgfreq_set, 4));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2044 new_readonly_variable(root, "counter", new_fixed_array(psg, debug_psgcount_get, debug_psgcount_set, 4));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2045 new_readonly_variable(root, "volume", new_fixed_array(psg, debug_psgvol_get, debug_psgvol_set, 4));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2046
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2047 return root;
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2048 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2049
2422
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2050 static debug_val debug_iopad_get(debug_array *array, uint32_t index)
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2051 {
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2052 io_port *port = find_gamepad(array->base, index + 1);
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2053 uint32_t ret = 0;
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2054 if (port) {
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2055 ret |= port->input[1];
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2056 ret |= port->input[0] << 2 & 0xC0;
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2057 ret |= port->input[2] << 8 & 0xF00;
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2058 }
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2059 return debug_int(ret);
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2060 }
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2061
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2062 static void debug_iopad_set(debug_array *array, uint32_t index, debug_val val)
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2063 {
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2064 uint32_t ival;
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2065 if (!debug_cast_int(val, &ival)) {
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2066 fprintf(stderr, "pad state can only be set to integers\n");
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2067 return;
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2068 }
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2069 io_port *port = find_gamepad(array->base, index + 1);
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2070 if (port) {
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2071 port->input[1] &= ~0x3F;
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2072 port->input[1] |= ival & 0x3F;
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2073 port->input[0] &= ~0x33;
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2074 port->input[0] |= ival & 0x3;
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2075 port->input[0] |= ival >> 2 & 0x30;
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2076 port->input[2] &= ~0xF;
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2077 port->input[2] |= ival >> 8 & 0xF;
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2078 }
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2079 }
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2080
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2081 debug_root *find_io_root(sega_io *io)
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2082 {
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2083 debug_root *root = find_root(io);
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2084
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2085 new_readonly_variable(root, "pads", new_fixed_array(io, debug_iopad_get, debug_iopad_set, MAX_JOYSTICKS));
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2086
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2087 return root;
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2088 }
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2413
diff changeset
2089
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2090 void ambiguous_iter(char *key, tern_val val, uint8_t valtype, void *data)
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
2091 {
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2092 char *prefix = data;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2093 char * full = alloc_concat(prefix, key);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2094 fprintf(stderr, "\t%s\n", full);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2095 free(full);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2096 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2097
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2098 uint8_t parse_command(debug_root *root, char *text, parsed_command *out)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2099 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2100 char *cur = text;
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2101 uint8_t is_func = 0;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2102 while (*cur && *cur != '/' && !isspace(*cur))
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
2103 {
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2104 if (*cur == '(') {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2105 is_func = 1;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2106 break;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2107 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2108 ++cur;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2109 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2110 char *name = malloc(cur - text + 1);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2111 memcpy(name, text, cur - text);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2112 name[cur-text] = 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2113 uint8_t ret = 0;
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2114 char *format = NULL;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2115 debug_func *func = NULL;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2116 command_def *def = NULL;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2117 if (is_func) {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2118 char *start = name;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2119 for (char *ncur = name; *ncur; ncur++)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2120 {
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2121 if (*ncur == ':') {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2122 char *nspace = malloc(ncur - start + 1);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2123 memcpy(nspace, start, ncur - start);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2124 nspace[ncur - start] = 0;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2125 root = tern_find_ptr(root->other_roots, nspace);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2126 if (!root) {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2127 fprintf(stderr, "%s is not a valid namespace\n", nspace);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2128 free(nspace);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2129 goto cleanup_name;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2130 }
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2131 start = ncur + 1;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2132 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2133 }
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2134 debug_var *var = tern_find_ptr(root->variables, start);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2135 if (!var) {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2136 fprintf(stderr, "%s is not defined\n", name);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2137 goto cleanup_name;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2138 }
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2139 debug_val val = var->get(var);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2140 if (val.type != DBG_VAL_FUNC) {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2141 fprintf(stderr, "%s is not a function\n", name);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2142 goto cleanup_name;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2143 }
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2144 func = funcs + val.v.u32;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2145 } else {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2146 tern_node *prefix_res = tern_find_prefix(root->commands, name);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2147 def = tern_find_ptr(prefix_res, "");
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2148 if (!def) {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2149 tern_node *node = prefix_res;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2150 while (node)
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2151 {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2152 if (node->left || node->right) {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2153 break;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2154 }
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2155 if (node->el) {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2156 node = node->straight.next;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2157 } else {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2158 def = node->straight.value.ptrval;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2159 break;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2160 }
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2161 }
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2162 if (!def && prefix_res) {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2163 fprintf(stderr, "%s is ambiguous. Matching commands:\n", name);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2164 tern_foreach(prefix_res, ambiguous_iter, name);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2165 goto cleanup_name;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2166 }
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2167 }
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2168 if (!def) {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2169 fprintf(stderr, "%s is not a recognized command\n", name);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2170 goto cleanup_name;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2171 }
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2172 if (*cur == '/') {
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2173 ++cur;
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2174 text = cur;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2175 while (*cur && !isspace(*cur))
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2176 {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2177 ++cur;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2178 }
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2179 format = malloc(cur - text + 1);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2180 memcpy(format, text, cur - text);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2181 format[cur - text] = 0;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2182 }
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2183 }
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2184
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2185 int num_args = 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2186 command_arg *args = NULL;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2187 if (*cur && *cur != '\n') {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2188 ++cur;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2189 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2190 text = cur;
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2191 if (def && def->raw_args) {
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2192 while (*cur && *cur != '\n')
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2193 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2194 ++cur;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2195 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2196 char *raw_param = NULL;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2197 if (cur != text) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2198 raw_param = malloc(cur - text + 1);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2199 memcpy(raw_param, text, cur - text);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2200 raw_param[cur - text] = 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2201 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2202 out->raw = raw_param;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2203 out->args = NULL;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2204 out->num_args = 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2205 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2206 int arg_storage = 0;
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2207 int32_t max_args = def ? def->max_args : func->max_args;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2208 int32_t min_args = def ? def->min_args : func->min_args;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2209 if (max_args > 0) {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2210 arg_storage = max_args;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2211 } else if (max_args) {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2212 arg_storage = min_args > 0 ? 2 * min_args : 2;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2213 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2214 if (arg_storage) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2215 args = calloc(arg_storage, sizeof(command_arg));
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2216 }
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2217 while (*text && *text != '\n' && (!is_func || *text != ')'))
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2218 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2219 char *after;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2220 expr *e = parse_expression(text, &after);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2221 if (e) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2222 if (num_args == arg_storage) {
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2223 if (max_args >= 0) {
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2224 free_expr(e);
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2225 fprintf(stderr, "Command %s takes a max of %d arguments, but at least %d provided\n", name, max_args, max_args+1);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2226 goto cleanup_args;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2227 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2228 arg_storage *= 2;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2229 args = realloc(args, arg_storage * sizeof(command_arg));
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2230 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2231 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2232 args[num_args].parsed = e;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2233 args[num_args].raw = malloc(after - text + 1);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2234 memcpy(args[num_args].raw, text, after - text);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2235 args[num_args++].raw[after - text] = 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2236 text = after;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2237 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2238 goto cleanup_args;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2239 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2240 }
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2241 if (num_args < min_args) {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2242 fprintf(stderr, "Command %s requires at least %d arguments, but only %d provided\n", name, min_args, num_args);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2243 goto cleanup_args;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2244 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2245 out->raw = NULL;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2246 out->args = args;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2247 out->num_args = num_args;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2248 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2249 out->def = def;
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2250 out->func = func ? func - funcs : 0;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2251 out->format = format;
2186
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
2252
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2253 ret = 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2254 cleanup_args:
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2255 if (!ret) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2256 for (int i = 0; i < num_args; i++)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2257 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2258 free_expr(args[i].parsed);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2259 free(args[i].raw);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2260 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2261 free(args);
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
2262 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2263 cleanup_name:
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2264 free(name);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2265 return ret;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2266 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2267
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2268 static void free_parsed_command(parsed_command *cmd);
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2269 static void free_command_block(command_block *block)
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2270 {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2271 for (int i = 0; i < block->num_commands; i++)
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2272 {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2273 free_parsed_command(block->commands + i);
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2274 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2275 free(block->commands);
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2276 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2277
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2278 static void free_parsed_command(parsed_command *cmd)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2279 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2280 free(cmd->format);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2281 free(cmd->raw);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2282 for (int i = 0; i < cmd->num_args; i++)
2173
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
2283 {
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2284 free(cmd->args[i].raw);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2285 free_expr(cmd->args[i].parsed);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2286 }
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2287 free_command_block(&cmd->block);
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2288 free_command_block(&cmd->else_block);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2289 free(cmd->args);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2290 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2291
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2292 enum {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2293 READ_FAILED = 0,
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2294 NORMAL,
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2295 EMPTY,
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2296 ELSE,
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2297 END
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2298 };
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2299
2703
829205a9647a Pump events and allow debug window interaction while paused in CPU debugger on Windows
Michael Pavone <pavone@retrodev.com>
parents: 2701
diff changeset
2300 static void read_wait_progress(void)
829205a9647a Pump events and allow debug window interaction while paused in CPU debugger on Windows
Michael Pavone <pavone@retrodev.com>
parents: 2701
diff changeset
2301 {
829205a9647a Pump events and allow debug window interaction while paused in CPU debugger on Windows
Michael Pavone <pavone@retrodev.com>
parents: 2701
diff changeset
2302 process_events();
829205a9647a Pump events and allow debug window interaction while paused in CPU debugger on Windows
Michael Pavone <pavone@retrodev.com>
parents: 2701
diff changeset
2303 #ifndef IS_LIB
829205a9647a Pump events and allow debug window interaction while paused in CPU debugger on Windows
Michael Pavone <pavone@retrodev.com>
parents: 2701
diff changeset
2304 render_update_display();
2720
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
2305 if (current_system->get_vdp) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
2306 vdp_context *vdp = current_system->get_vdp(current_system);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
2307 if (vdp) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
2308 vdp_update_per_frame_debug(vdp);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
2309 }
2703
829205a9647a Pump events and allow debug window interaction while paused in CPU debugger on Windows
Michael Pavone <pavone@retrodev.com>
parents: 2701
diff changeset
2310 }
829205a9647a Pump events and allow debug window interaction while paused in CPU debugger on Windows
Michael Pavone <pavone@retrodev.com>
parents: 2701
diff changeset
2311 #endif
829205a9647a Pump events and allow debug window interaction while paused in CPU debugger on Windows
Michael Pavone <pavone@retrodev.com>
parents: 2701
diff changeset
2312 }
829205a9647a Pump events and allow debug window interaction while paused in CPU debugger on Windows
Michael Pavone <pavone@retrodev.com>
parents: 2701
diff changeset
2313
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2314 static uint8_t read_parse_command(debug_root *root, parsed_command *out, int indent_level)
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2315 {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2316 ++indent_level;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2317 for (int i = 0; i < indent_level; i++)
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2318 {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2319 putchar('>');
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2320 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2321 putchar(' ');
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2322 fflush(stdout);
2703
829205a9647a Pump events and allow debug window interaction while paused in CPU debugger on Windows
Michael Pavone <pavone@retrodev.com>
parents: 2701
diff changeset
2323 read_wait_progress();
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2324 char input_buf[1024];
2703
829205a9647a Pump events and allow debug window interaction while paused in CPU debugger on Windows
Michael Pavone <pavone@retrodev.com>
parents: 2701
diff changeset
2325 if (!fgets_timeout(input_buf, sizeof(input_buf), stdin, 16667, read_wait_progress)) {
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2326 fputs("fgets failed", stderr);
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2327 return READ_FAILED;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2328 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2329 char *stripped = strip_ws(input_buf);
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2330 if (!stripped[0]) {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2331 return EMPTY;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2332 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2333 if (indent_level > 1) {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2334 if (!strcmp(stripped, "else")) {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2335 return ELSE;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2336 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2337 if (!strcmp(stripped, "end")) {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2338 return END;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2339 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2340 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2341 if (parse_command(root, input_buf, out)) {
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2342 if (!out->def || !out->def->has_block) {
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2343 return NORMAL;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2344 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2345 int command_storage = 4;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2346 command_block *block = &out->block;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2347 block->commands = calloc(command_storage, sizeof(parsed_command));
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2348 block->num_commands = 0;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2349 for (;;)
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2350 {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2351 if (block->num_commands == command_storage) {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2352 command_storage *= 2;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2353 block->commands = realloc(block->commands, command_storage * sizeof(parsed_command));
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2354 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2355 switch (read_parse_command(root, block->commands + block->num_commands, indent_level))
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2356 {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2357 case READ_FAILED:
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2358 return READ_FAILED;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2359 case NORMAL:
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2360 block->num_commands++;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2361 break;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2362 case END:
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2363 return NORMAL;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2364 case ELSE:
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2365 if (block == &out->else_block) {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2366 fprintf(stderr, "Too many else blocks for command %s\n", out->def->names[0]);
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2367 return READ_FAILED;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2368 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2369 if (!out->def->accepts_else) {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2370 fprintf(stderr, "Command %s does not take an else block\n", out->def->names[0]);
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2371 return READ_FAILED;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2372 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2373 block = &out->else_block;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2374 block->commands = calloc(command_storage, sizeof(parsed_command));
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2375 block->num_commands = 0;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2376 break;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2377 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2378 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2379 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2380 return READ_FAILED;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2381 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2382
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2383 static uint8_t run_command(debug_root *root, parsed_command *cmd)
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2384 {
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2385 if (!cmd->def || (!cmd->def->raw_args && !cmd->def->skip_eval)) {
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2386 for (int i = 0; i < cmd->num_args; i++)
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2387 {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2388 if (!eval_expr(root, cmd->args[i].parsed, &cmd->args[i].value)) {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2389 fprintf(stderr, "Failed to eval %s\n", cmd->args[i].raw);
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2390 return 1;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2391 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2392 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2393 }
2665
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2394 if (cmd->def) {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2395 return cmd->def->impl(root, cmd);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2396 } else {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2397 debug_func *func = funcs + cmd->func;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2398 if (func->is_native) {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2399 debug_val *args = calloc(cmd->num_args, sizeof(debug_val));
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2400 for (int i = 0; i < cmd->num_args; i++)
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2401 {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2402 args[i] = cmd->args[i].value;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2403 }
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2404 func->impl.native(args, cmd->num_args);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2405 free(args);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2406 } else {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2407 debug_root *func_root = calloc(1, sizeof(debug_root));
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2408 for (int i = 0; i < cmd->num_args; i++)
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2409 {
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2410 new_user_variable(func_root, func->arg_names[i], cmd->args[i].value);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2411 }
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2412 func_root->other_roots = tern_insert_ptr(func_root->other_roots, "parent", root);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2413 execute_block(func_root, &func->impl.block);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2414 //FIXME: properly free root
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2415 tern_free(func_root->variables);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2416 tern_free(func_root->other_roots);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2417 free(func_root);
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2418 }
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2419 return 1;
54ac5fe14cf9 Allow calling functions directly as if they were commands
Michael Pavone <pavone@retrodev.com>
parents: 2506
diff changeset
2420 }
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2421 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2422
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2423 static void debugger_repl(debug_root *root)
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2424 {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2425
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2426 int debugging = 1;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2427 parsed_command cmds[2] = {0};
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2428 int cur = 0;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2429 uint8_t has_last = 0;
2193
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2430 if (root->last_cmd.def) {
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2431 memcpy(cmds + 1, &root->last_cmd, sizeof(root->last_cmd));
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2432 has_last = 1;
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2433 }
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2434 while(debugging) {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2435 switch (read_parse_command(root, cmds + cur, 0))
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2436 {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2437 case NORMAL:
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2438 debugging = run_command(root, cmds + cur);
2193
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2439 cur = !cur;
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2440 if (debugging && has_last) {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2441 free_parsed_command(cmds + cur);
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2442 memset(cmds + cur, 0, sizeof(cmds[cur]));
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2443 }
2193
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2444 has_last = 1;
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2445 break;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2446 case EMPTY:
2193
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2447 if (has_last) {
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2448 debugging = run_command(root, cmds + !cur);
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2449 }
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2450 break;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2451 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2452 }
2193
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2453 if (has_last) {
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2454 memcpy(&root->last_cmd, cmds + !cur, sizeof(root->last_cmd));
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2455 } else {
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2456 free_parsed_command(cmds + !cur);
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2457 }
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
2458 free_parsed_command(cmds + cur);
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2459 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2460
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2461 static uint8_t cmd_quit(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2462 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2463 exit(0);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2464 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2465
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2466 typedef struct {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2467 size_t num_commands;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2468 size_t longest_command;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2469 } help_state;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2470
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2471 static void help_first_pass(char *key, tern_val val, uint8_t valtype, void *data)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2472 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2473 command_def *def = val.ptrval;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2474 if (def->visited) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2475 return;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2476 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2477 def->visited = 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2478 help_state *state = data;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2479 state->num_commands++;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2480 size_t len = strlen(def->usage);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2481 if (len > state->longest_command) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2482 state->longest_command = len;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2483 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2484 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2485
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2486 static void help_reset_visited(char *key, tern_val val, uint8_t valtype, void *data)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2487 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2488 command_def *def = val.ptrval;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2489 def->visited = 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2490 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2491
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2492 static void help_second_pass(char *key, tern_val val, uint8_t valtype, void *data)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2493 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2494 command_def *def = val.ptrval;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2495 if (def->visited) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2496 return;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2497 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2498 def->visited = 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2499 help_state *state = data;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2500 size_t len = strlen(def->usage);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2501 printf(" %s", def->usage);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2502 while (len < state->longest_command) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2503 putchar(' ');
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2504 len++;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2505 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2506 int remaining = 80 - state->longest_command - 5;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2507 const char *extra_desc = NULL;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2508 if (strlen(def->desc) <= remaining) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2509 printf(" - %s\n", def->desc);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2510 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2511 char split[76];
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2512 int split_point = remaining;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2513 while (split_point > 0 && !isspace(def->desc[split_point]))
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2514 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2515 --split_point;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2516 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2517 if (!split_point) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2518 split_point = remaining;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2519 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2520 memcpy(split, def->desc, split_point);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2521 extra_desc = def->desc + split_point + 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2522 split[split_point] = 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2523 printf(" - %s\n", split);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2524 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2525 if (def->names[1]) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2526 fputs(" Aliases: ", stdout);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2527 len = strlen(" Aliases: ");
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2528 const char **name = def->names + 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2529 uint8_t first = 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2530 while (*name)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2531 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2532 if (first) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2533 first = 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2534 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2535 putchar(',');
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2536 putchar(' ');
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2537 len += 2;
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
2538 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2539 fputs(*name, stdout);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2540 len += strlen(*name);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2541 ++name;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2542 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2543 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2544 len = 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2545 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2546 if (extra_desc) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2547 while (len < state->longest_command + 5) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2548 putchar(' ');
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2549 len++;
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
2550 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2551 fputs(extra_desc, stdout);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2552 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2553 putchar('\n');
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2554 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2555
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2556 static uint8_t cmd_help(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2557 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2558 help_state state = {0,0};
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2559 tern_foreach(root->commands, help_first_pass, &state);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2560 tern_foreach(root->commands, help_reset_visited, &state);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2561 tern_foreach(root->commands, help_second_pass, &state);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2562 tern_foreach(root->commands, help_reset_visited, &state);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2563 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2564 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2565
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2566 static uint8_t cmd_continue(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2567 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2568 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2569 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2570
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2571 static void make_format_str(char *format_str, char *format)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2572 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2573 strcpy(format_str, "%s: %d\n");
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2574 if (format) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2575 switch (format[0])
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2576 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2577 case 'x':
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2578 case 'X':
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2579 case 'd':
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2580 case 'c':
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2581 case 's':
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2582 format_str[5] = format[0];
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2583 break;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2584 default:
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2585 fprintf(stderr, "Unrecognized format character: %c\n", format[0]);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2586 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2587 }
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2588 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2589
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2590 static void do_print(debug_root *root, char *format_str, char *raw, debug_val value)
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2591 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2592 switch(value.type)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2593 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2594 case DBG_VAL_U32:
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2595 if (format_str[5] == 's') {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2596 char tmp[128];
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2597 int j;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2598 uint32_t addr = value.v.u32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2599 for (j = 0; j < sizeof(tmp)-1; j++, addr++)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2600 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2601 uint32_t tmp_addr = addr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2602 root->read_mem(root, &tmp_addr, 'b');
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2603 char c = tmp_addr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2604 if (c < 0x20 || c > 0x7F) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2605 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2606 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2607 tmp[j] = c;
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2608 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2609 tmp[j] = 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2610 printf(format_str, raw, tmp);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2611 } else {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2612 printf(format_str, raw, value.v.u32);
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2613 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2614 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2615 case DBG_VAL_F32: {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2616 char tmp = format_str[5];
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2617 format_str[5] = 'f';
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2618 printf(format_str, raw, value.v.f32);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2619 format_str[5] = tmp;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2620 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2621 }
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2622 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2623 }
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2624
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2625 static uint8_t cmd_print(debug_root *root, parsed_command *cmd)
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2626 {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2627 char format_str[8];
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2628 make_format_str(format_str, cmd->format);
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2629 for (int i = 0; i < cmd->num_args; i++)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2630 {
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2631 do_print(root, format_str, cmd->args[i].raw, cmd->args[i].value);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2632 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2633 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2634 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2635
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2636 static uint8_t cmd_printf(debug_root *root, parsed_command *cmd)
2187
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2637 {
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
2638 char *fmt = get_cstring(cmd->args[0].value);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
2639 if (!fmt) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
2640 fprintf(stderr, "First parameter to printf must be a string\n");
2187
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2641 return 1;
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2642 }
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
2643 char *cur = fmt;
2187
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2644 char format_str[3] = {'%', 'd', 0};
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
2645 uint32_t cur_param = 1;
2187
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2646 while (*cur)
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2647 {
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2648 if (*cur == '%') {
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2649 switch(cur[1])
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2650 {
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2651 case 'x':
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2652 case 'X':
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2653 case 'c':
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2654 case 'd':
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2655 case 's':
2363
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
2656 case 'f':
2187
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2657 break;
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2658 default:
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2659 fprintf(stderr, "Unsupported format character %c\n", cur[1]);
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2660 return 1;
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2661 }
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2662 format_str[1] = cur[1];
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
2663 if (cur_param == cmd->num_args) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
2664 fprintf(stderr, "Not enough arguments for format char %c\n", *cur);
2187
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2665 return 1;
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2666 }
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
2667 debug_val val = cmd->args[cur_param++].value;
2187
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2668 if (cur[1] == 's') {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2669 if (val.type == DBG_VAL_STRING) {
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
2670 printf(format_str, get_cstring(val));
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2671 } else {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2672 char tmp[128];
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2673 uint32_t address;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2674 if (!debug_cast_int(val, &address)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2675 fprintf(stderr, "Format char 's' accepts only integers and strings\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2676 return 1;
2187
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2677 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2678 int j;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2679 for (j = 0; j < sizeof(tmp)-1; j++, address++)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2680 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2681 uint32_t addr = address;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2682 root->read_mem(root, &addr, 'b');
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2683 char c = addr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2684 if (c < 0x20 || c > 0x7F) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2685 break;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2686 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2687 tmp[j] = c;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2688 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2689 tmp[j] = 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2690 printf(format_str, tmp);
2187
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2691 }
2363
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
2692 } else if (cur[1] == 'f') {
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
2693 float fval;
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
2694 if (!debug_cast_float(val, &fval)) {
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
2695 fprintf(stderr, "Format char '%c' only accepts floats\n", cur[1]);
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
2696 return 1;
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
2697 }
b865f33fd47e Basic float support in debug language
Michael Pavone <pavone@retrodev.com>
parents: 2362
diff changeset
2698 printf(format_str, fval);
2187
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2699 } else {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2700 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2701 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2702 fprintf(stderr, "Format char '%c' only accepts integers\n", cur[1]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2703 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2704 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2705 printf(format_str, ival);
2187
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2706 }
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2707 cur += 2;
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2708 } else {
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2709 putchar(*cur);
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2710 ++cur;
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2711 }
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2712 }
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2713 return 1;
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2714 }
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
2715
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2716 static uint8_t cmd_display(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2717 {
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2718 cmd_print(root, cmd);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2719 disp_def *ndisp = calloc(1, sizeof(*ndisp));
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2720 ndisp->next = root->displays;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2721 ndisp->index = root->disp_index++;
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2722 ndisp->format = cmd->format ? strdup(cmd->format) : NULL;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2723 ndisp->num_args = cmd->num_args;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2724 ndisp->args = cmd->args;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2725 cmd->args = NULL;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2726 cmd->num_args = 0;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2727 root->displays = ndisp;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2728 printf("Added display %d\n", ndisp->index);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2729 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2730 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2731
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2732 static uint8_t cmd_delete_display(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2733 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2734 disp_def **cur = &root->displays;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2735 uint32_t index;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2736 if (!debug_cast_int(cmd->args[0].value, &index)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2737 fprintf(stderr, "Argument to deletedisplay must be an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2738 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2739 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2740 while (*cur)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2741 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2742 if ((*cur)->index == index) {
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2743 disp_def *del_disp = *cur;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2744 *cur = del_disp->next;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2745 free(del_disp->format);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2746 for (int i = 0; i < del_disp->num_args; i++)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2747 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2748 free(del_disp->args[i].raw);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2749 free_expr(del_disp->args[i].parsed);
2173
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
2750 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2751 free(del_disp->args);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2752 free(del_disp);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2753 break;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2754 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2755 cur = &(*cur)->next;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2756 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2757 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2758 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2759 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2760
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2761 static uint8_t cmd_softreset(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2762 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2763 if (current_system->soft_reset) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2764 current_system->soft_reset(current_system);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2765 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2766 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2767 fputs("Current system does not support soft reset", stderr);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2768 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2769 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2770 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2771
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2772 static uint8_t cmd_command(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2773 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2774 uint32_t index;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2775 if (!debug_cast_int(cmd->args[0].value, &index)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2776 fprintf(stderr, "Argument to commands must be an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2777 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2778 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2779 bp_def **target = find_breakpoint_idx(&root->breakpoints, index);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2780 if (!target) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2781 fprintf(stderr, "Breakpoint %d does not exist!\n", index);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2782 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2783 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2784 for (uint32_t i = 0; i < (*target)->num_commands; i++)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2785 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2786 free_parsed_command((*target)->commands + i);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2787 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2788 free((*target)->commands);
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2789 (*target)->commands = cmd->block.commands;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2790 (*target)->num_commands = cmd->block.num_commands;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2791 cmd->block.commands = NULL;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2792 cmd->block.num_commands = 0;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2793 return 1;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2794 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2795
2190
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2796 static uint8_t execute_block(debug_root *root, command_block * block)
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2797 {
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2798 uint8_t debugging = 1;
2371
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2799 for (int i = 0; i < block->num_commands && debugging; i++)
2190
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2800 {
2371
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2801 debugging = run_command(root, block->commands + i);
2190
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2802 }
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2803 return debugging;
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2804 }
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2805
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2806 static uint8_t cmd_if(debug_root *root, parsed_command *cmd)
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2807 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2808 return execute_block(root, debug_cast_bool(cmd->args[0].value) ? &cmd->block : &cmd->else_block);
2190
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2809 }
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2810
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2811 static uint8_t cmd_while(debug_root *root, parsed_command *cmd)
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2812 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2813 if (!debug_cast_bool(cmd->args[0].value)) {
2190
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2814 return execute_block(root, &cmd->else_block);
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2815 }
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2816 int debugging = 1;
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2817 do {
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2818 debugging = execute_block(root, &cmd->block) && debugging;
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2819 if (!eval_expr(root, cmd->args[0].parsed, &cmd->args[0].value)) {
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2820 fprintf(stderr, "Failed to eval %s\n", cmd->args[0].raw);
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2821 return 1;
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2822 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2823 } while (debug_cast_bool(cmd->args[0].value));
2190
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2824 return debugging;
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2825 }
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
2826
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2827 const char *expr_type_names[] = {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2828 "EXPR_NONE",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2829 "EXPR_SCALAR",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2830 "EXPR_UNARY",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2831 "EXPR_BINARY",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2832 "EXPR_SIZE",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2833 "EXPR_MEM"
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2834 };
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2835
2371
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2836 static uint8_t cmd_function(debug_root *root, parsed_command *cmd)
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2837 {
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2838 debug_root *set_root = root;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2839 expr *set_expr = cmd->args[0].parsed;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2840 while (set_expr->type == EXPR_NAMESPACE)
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2841 {
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2842 set_root = tern_find_ptr(set_root->other_roots, set_expr->op.v.str);
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2843 if (!set_root) {
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2844 fprintf(stderr, "%s is not a valid namespace\n", set_expr->op.v.str);
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2845 return 1;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2846 }
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2847 set_expr = set_expr->left;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2848 }
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2849 if (set_expr->type != EXPR_SCALAR || set_expr->op.type != TOKEN_NAME) {
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2850 fprintf(stderr, "Arguments to function must be names, bug argument 0 is %s\n", expr_type_names[set_expr->type]);
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2851 return 1;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2852 }
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2853 debug_var *var = tern_find_ptr(set_root->variables, set_expr->op.v.str);
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2854 if (var) {
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2855 fprintf(stderr, "%s is already defined\n", set_expr->op.v.str);
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2856 return 1;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2857 }
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2858 for (uint32_t i = 1; i < cmd->num_args; i++)
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2859 {
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2860 if (cmd->args[i].parsed->type != EXPR_SCALAR || cmd->args[i].parsed->op.type != TOKEN_NAME) {
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2861 fprintf(stderr, "Arguments to function must be names, bug argument %d is %s\n", i, expr_type_names[cmd->args[i].parsed->type]);
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2862 return 1;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2863 }
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2864 }
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2865 char **args = calloc(cmd->num_args - 1, sizeof(char *));
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2866 for (uint32_t i = 1; i < cmd->num_args; i++)
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2867 {
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2868 args[i - 1] = cmd->args[i].parsed->op.v.str;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2869 cmd->args[i].parsed->op.v.str = NULL;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2870 }
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2871 new_readonly_variable(set_root, set_expr->op.v.str, new_user_func(&cmd->block, args, cmd->num_args - 1));
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2872 cmd->block.commands = NULL;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2873 cmd->block.num_commands = 0;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2874 return 1;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2875 }
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2876
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2877 static uint8_t cmd_return(debug_root *root, parsed_command *cmd)
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2878 {
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2879 root->retval = cmd->args[0].value;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2880 return 0;
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2881 }
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
2882
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2883 static uint8_t cmd_set(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2884 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2885 char *name = NULL;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2886 char size = 0;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2887 debug_root *set_root = root;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2888 expr *set_expr = cmd->args[0].parsed;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2889 while (set_expr->type == EXPR_NAMESPACE)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2890 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2891 set_root = tern_find_ptr(set_root->other_roots, set_expr->op.v.str);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2892 if (!set_root) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2893 fprintf(stderr, "%s is not a valid namespace\n", set_expr->op.v.str);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2894 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2895 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2896 set_expr = set_expr->left;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2897 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2898 debug_val address;
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2899 debug_array *array = NULL;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2900 switch (set_expr->type)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2901 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2902 case EXPR_SCALAR:
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2903 if (set_expr->op.type == TOKEN_NAME) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2904 name = set_expr->op.v.str;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2905 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2906 fputs("First argument to set must be a name or memory expression, not a number", stderr);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2907 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2908 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2909 break;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2910 case EXPR_SIZE:
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2911 size = set_expr->op.v.op[0];
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2912 if (set_expr->left->op.type == TOKEN_NAME) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2913 name = set_expr->left->op.v.str;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2914 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2915 fputs("First argument to set must be a name or memory expression, not a number", stderr);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2916 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2917 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2918 break;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2919 case EXPR_MEM:
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2920 size = set_expr->op.v.op[0];
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2921 if (!eval_expr(root, set_expr->left, &address)) {
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2922 fprintf(stderr, "Failed to eval %s\n", cmd->args[0].raw);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2923 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2924 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2925 if (address.type != DBG_VAL_U32) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2926 fprintf(stderr, "Index in array expression must be integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2927 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2928 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2929 if (set_expr->right) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2930 debug_val right;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2931 if (!eval_expr(root, set_expr->right, &right)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2932 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2933 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2934 array = get_array(right);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2935 if (!array) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2936 fprintf(stderr, "%s does not refer to an array\n", cmd->args[0].raw);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2937 return 1;
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2938 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2939 if (!array->set) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2940 fprintf(stderr, "Array %s is read-only\n", set_expr->right->op.v.str);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2941 return 1;
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2942 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2943 if (address.v.u32 >= array->size) {
2386
9f178feb3cb0 Prefix most hex-formatted values output by debugger with $ for consistency with number literal parsing
Michael Pavone <pavone@retrodev.com>
parents: 2380
diff changeset
2944 fprintf(stderr, "Address $%X is out of bounds for array %s\n", address.v.u32, set_expr->right->op.v.str);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2945 return 1;
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2946 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2947 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2948 break;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2949 default:
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2950 fprintf(stderr, "First argument to set must be a name or memory expression, got %s\n", expr_type_names[set_expr->type]);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2951 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2952 }
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2953 if (!eval_expr(root, cmd->args[1].parsed, &cmd->args[1].value)) {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
2954 fprintf(stderr, "Failed to eval %s\n", cmd->args[1].raw);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2955 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2956 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2957 debug_val value = cmd->args[1].value;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2958 if (name) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2959 debug_var *var = tern_find_ptr(set_root->variables, name);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2960 if (!var) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2961 fprintf(stderr, "%s is not defined\n", name);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2962 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2963 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2964 if (!var->set) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2965 fprintf(stderr, "%s is read-only\n", name);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2966 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2967 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2968 if (size && size != 'l') {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2969 debug_val old = var->get(var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2970 if (size == 'b') {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2971 old.v.u32 &= 0xFFFFFF00;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2972 value.v.u32 &= 0xFF;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2973 value.v.u32 |= old.v.u32;
2358
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
2974 } else {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2975 old.v.u32 &= 0xFFFF0000;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2976 value.v.u32 &= 0xFFFF;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2977 value.v.u32 |= old.v.u32;
2358
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
2978 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2979 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2980 var->set(var, value);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
2981 } else if (array) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2982 array->set(array, address.v.u32, value);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2983 } else if (!root->write_mem(root, address.v.u32, value.v.u32, size)) {
2386
9f178feb3cb0 Prefix most hex-formatted values output by debugger with $ for consistency with number literal parsing
Michael Pavone <pavone@retrodev.com>
parents: 2380
diff changeset
2984 fprintf(stderr, "Failed to write to address $%X\n", address.v.u32);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2985 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2986 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2987 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
2988
2358
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
2989 static uint8_t cmd_variable(debug_root *root, parsed_command *cmd)
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
2990 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2991 debug_root *set_root = root;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2992 expr *set_expr = cmd->args[0].parsed;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2993 while (set_expr->type == EXPR_NAMESPACE)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2994 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2995 set_root = tern_find_ptr(set_root->other_roots, set_expr->op.v.str);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2996 if (!set_root) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2997 fprintf(stderr, "%s is not a valid namespace\n", set_expr->op.v.str);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2998 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
2999 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3000 set_expr = set_expr->left;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3001 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3002 if (set_expr->type != EXPR_SCALAR || set_expr->op.type != TOKEN_NAME) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3003 fprintf(stderr, "First argument to variable must be a name, got %s\n", expr_type_names[set_expr->type]);
2358
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
3004 return 1;
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
3005 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3006 debug_var *var = tern_find_ptr(set_root->variables, set_expr->op.v.str);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3007 if (var) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3008 fprintf(stderr, "%s is already defined\n", set_expr->op.v.str);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3009 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3010 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3011 debug_val value;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3012 value.type = DBG_VAL_U32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3013 value.v.u32 = 0;
2358
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
3014 if (cmd->num_args > 1) {
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
3015 if (!eval_expr(root, cmd->args[1].parsed, &cmd->args[1].value)) {
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
3016 fprintf(stderr, "Failed to eval %s\n", cmd->args[1].raw);
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
3017 return 1;
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
3018 }
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
3019 value = cmd->args[1].value;
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
3020 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3021 new_user_variable(set_root, set_expr->op.v.str, value);
2358
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
3022 return 1;
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
3023 }
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
3024
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3025 static uint8_t cmd_array(debug_root *root, parsed_command *cmd)
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3026 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3027 debug_root *set_root = root;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3028 expr *set_expr = cmd->args[0].parsed;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3029 while (set_expr->type == EXPR_NAMESPACE)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3030 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3031 set_root = tern_find_ptr(set_root->other_roots, set_expr->op.v.str);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3032 if (!set_root) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3033 fprintf(stderr, "%s is not a valid namespace\n", set_expr->op.v.str);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3034 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3035 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3036 set_expr = set_expr->left;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3037 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3038 if (set_expr->type != EXPR_SCALAR || set_expr->op.type != TOKEN_NAME) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3039 fprintf(stderr, "First argument to array must be a name, got %s\n", expr_type_names[set_expr->type]);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3040 return 1;
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3041 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3042 debug_var *var = tern_find_ptr(set_root->variables, set_expr->op.v.str);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3043 debug_array *array;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3044 if (var) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3045 debug_val val = var->get(var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3046 array = get_array(val);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3047 if (!array) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3048 fprintf(stderr, "%s is already defined as a non-array value\n", set_expr->op.v.str);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3049 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3050 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3051 } else {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3052 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3053 var->get = user_var_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3054 var->set = user_var_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3055 var->val = new_user_array(cmd->num_args - 1);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3056 set_root->variables = tern_insert_ptr(set_root->variables, set_expr->op.v.str, var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3057 array = get_array(var->val);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3058 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3059 if (array->set == user_array_set) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3060 array->size = cmd->num_args - 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3061 if (array->storage < array->size) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3062 array->storage = array->size;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3063 array->base = realloc(array->base, sizeof(debug_val) * array->storage);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3064 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3065 }
2367
48cc69b4c358 Add some more builtin functions to debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2366
diff changeset
3066 for (uint32_t i = 1; i < cmd->num_args && i <= array->size; i++)
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3067 {
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3068 if (!eval_expr(root, cmd->args[i].parsed, &cmd->args[i].value)) {
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3069 fprintf(stderr, "Failed to eval %s\n", cmd->args[i].raw);
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3070 return 1;
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3071 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3072 array->set(array, i - 1, cmd->args[i].value);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3073 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3074 return 1;
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3075 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3076
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3077 static uint8_t cmd_append(debug_root *root, parsed_command *cmd)
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3078 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3079 debug_array *array = get_array(cmd->args[0].value);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3080 if (!array) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3081 fprintf(stderr, "%s is not an array\n", cmd->args[0].raw);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3082 return 1;
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3083 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3084 if (!array->append) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3085 fprintf(stderr, "Array %s doesn't support appending\n", cmd->args[0].raw);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3086 return 1;
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3087 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3088 array->append(array, cmd->args[1].value);
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3089 return 1;
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3090 }
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
3091
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3092 static uint8_t cmd_frames(debug_root *root, parsed_command *cmd)
2179
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2178
diff changeset
3093 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3094 uint32_t frames;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3095 if (!debug_cast_int(cmd->args[0].value, &frames)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3096 fprintf(stderr, "Argument to frames must be an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3097 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3098 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3099 current_system->enter_debugger_frames = frames;
2179
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2178
diff changeset
3100 return 0;
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2178
diff changeset
3101 }
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2178
diff changeset
3102
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3103 static uint8_t cmd_bindup(debug_root *root, parsed_command *cmd)
2181
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
3104 {
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3105 char *bind = get_cstring(cmd->args[0].value);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3106 if (!bind) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3107 fprintf(stderr, "Argument to bindup must be a string\n");
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3108 return 1;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3109 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3110 if (!bind_up(bind)) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3111 fprintf(stderr, "%s is not a valid binding name\n", bind);
2181
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
3112 }
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
3113 return 1;
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
3114 }
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
3115
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3116 static uint8_t cmd_binddown(debug_root *root, parsed_command *cmd)
2181
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
3117 {
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3118 char *bind = get_cstring(cmd->args[0].value);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3119 if (!bind) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3120 fprintf(stderr, "Argument to binddown must be a string\n");
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3121 return 1;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3122 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3123 if (!bind_down(bind)) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3124 fprintf(stderr, "%s is not a valid binding name\n", bind);
2181
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
3125 }
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
3126 return 1;
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
3127 }
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
3128
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3129 static uint8_t cmd_condition(debug_root *root, parsed_command *cmd)
2182
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
3130 {
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3131 if (!eval_expr(root, cmd->args[0].parsed, &cmd->args[0].value)) {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3132 fprintf(stderr, "Failed to evaluate breakpoint number: %s\n", cmd->args[0].raw);
2182
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
3133 return 1;
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
3134 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3135 uint32_t index;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3136 if (!debug_cast_int(cmd->args[0].value, &index)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3137 fprintf(stderr, "First argument to condition must be an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3138 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3139 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3140 bp_def **target = find_breakpoint_idx(&root->breakpoints, index);
2182
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
3141 if (!*target) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3142 fprintf(stderr, "Failed to find breakpoint %u\n", index);
2182
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
3143 return 1;
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
3144 }
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
3145 free_expr((*target)->condition);
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3146 if (cmd->num_args > 1 && cmd->args[1].parsed) {
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3147 (*target)->condition = cmd->args[1].parsed;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3148 cmd->args[1].parsed = NULL;
2182
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
3149 } else {
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
3150 (*target)->condition = NULL;
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
3151 }
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
3152 return 1;
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
3153 }
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
3154
2214
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3155 static void symbol_max_len(char *key, tern_val val, uint8_t valtype, void *data)
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3156 {
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3157 size_t *max_len = data;
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3158 size_t len = strlen(key);
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3159 if (len > *max_len) {
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3160 *max_len = len;
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3161 }
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3162 }
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3163
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3164 static void print_symbol(char *key, tern_val val, uint8_t valtype, void *data)
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3165 {
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3166 size_t *padding = data;
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3167 size_t len = strlen(key);
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3168 fputs(key, stdout);
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3169 while (len < *padding)
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3170 {
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3171 putchar(' ');
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3172 len++;
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3173 }
2386
9f178feb3cb0 Prefix most hex-formatted values output by debugger with $ for consistency with number literal parsing
Michael Pavone <pavone@retrodev.com>
parents: 2380
diff changeset
3174 printf("$%X\n", (uint32_t)val.intval);
2214
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3175 }
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3176
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3177 static uint8_t cmd_symbols(debug_root *root, parsed_command *cmd)
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3178 {
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3179 if (cmd->num_args) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3180 char *filename = get_cstring(cmd->args[0].value);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3181 if (!filename) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3182 fprintf(stderr, "Argument to symbols must be a string if provided\n");
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3183 return 1;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3184 }
2214
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3185 FILE *f = fopen(filename, "r");
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3186 if (!f) {
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3187 fprintf(stderr, "Failed to open %s for reading\n", filename);
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3188 return 1;
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3189 }
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3190 char linebuf[1024];
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3191 while (fgets(linebuf, sizeof(linebuf), f))
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3192 {
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3193 char *line = strip_ws(linebuf);
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3194 if (*line) {
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3195 char *end;
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3196 uint32_t address = strtol(line, &end, 16);
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3197 if (end != line) {
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3198 if (*end == '=') {
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3199 char *name = strip_ws(end + 1);
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3200 add_label(root->disasm, name, address);
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3201 root->symbols = tern_insert_int(root->symbols, name, address);
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3202 }
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3203 }
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3204 }
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3205 }
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3206 } else {
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3207 size_t max_len = 0;
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3208 tern_foreach(root->symbols, symbol_max_len, &max_len);
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3209 max_len += 2;
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3210 tern_foreach(root->symbols, print_symbol, &max_len);
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3211 }
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3212 return 1;
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3213 }
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
3214
2393
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3215 static uint8_t cmd_save(debug_root *root, parsed_command *cmd)
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3216 {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3217 char size = cmd->format ? cmd->format[0] : 'b';
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3218 if (size != 'b' && size != 'w' && size != 'l') {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3219 fprintf(stderr, "Invalid size %s\n", cmd->format);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3220 return 1;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3221 }
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3222 if (!eval_expr(root, cmd->args[0].parsed, &cmd->args[0].value)) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3223 fprintf(stderr, "Failed to eval %s\n", cmd->args[0].raw);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3224 return 1;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3225 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3226 char *fname = get_cstring(cmd->args[0].value);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3227 if (!fname) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3228 fprintf(stderr, "First argument to save must be a string\n");
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3229 return 1;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3230 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3231 FILE *f = fopen(fname, "wb");
2393
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3232 if (!f) {
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3233 fprintf(stderr, "Failed to open %s for writing\n", fname);
2393
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3234 return 1;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3235 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3236 uint32_t start = 0;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3237 debug_val val;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3238 debug_array * arr = NULL;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3239 if (cmd->args[1].parsed->type == EXPR_MEM) {
2396
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3240
2393
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3241 if (!eval_expr(root, cmd->args[1].parsed->left, &val)) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3242 fprintf(stderr, "Failed to eval start index\n");
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3243 goto cleanup;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3244 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3245 if (!debug_cast_int(val, &start)) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3246 fprintf(stderr, "Start index must evaluate to integer\n");
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3247 goto cleanup;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3248 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3249 if (cmd->args[1].parsed->right) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3250 if (!eval_expr(root, cmd->args[1].parsed->right, &val)) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3251 fprintf(stderr, "Failed to eval array name in argument %s\n", cmd->args[1].raw);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3252 goto cleanup;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3253 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3254 arr = get_array(val);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3255 if (!arr) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3256 fprintf(stderr, "Name in argument %s did not evaluate to an array\n", cmd->args[1].raw);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3257 goto cleanup;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3258 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3259 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3260 } else {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3261 if (!eval_expr(root, cmd->args[1].parsed, &val)) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3262 fprintf(stderr, "Failed to eval %s\n", cmd->args[1].raw);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3263 goto cleanup;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3264 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3265 arr = get_array(val);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3266 if (!arr) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3267 fprintf(stderr, "Argument %s did not evaluate to an array\n", cmd->args[1].raw);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3268 goto cleanup;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3269 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3270 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3271 uint32_t count = 0;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3272 if (cmd->num_args > 2) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3273 if (!eval_expr(root, cmd->args[2].parsed, &val)) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3274 fprintf(stderr, "Failed to eval %s\n", cmd->args[2].raw);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3275 goto cleanup;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3276 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3277 if (!debug_cast_int(val, &count)) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3278 fprintf(stderr, "Count must evaluate to integer\n");
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3279 goto cleanup;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3280 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3281 } else if (arr) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3282 count = arr->size < start ? 0 : arr->size - start;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3283 } else {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3284 count = root->chunk_end(root, start) - start;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3285 if (size == 'l') {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3286 count /= 4;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3287 } else if (size == 'w') {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3288 count /= 2;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3289 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3290 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3291 union {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3292 uint8_t b[1024];
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3293 uint16_t w[512];
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3294 uint32_t l[256];
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3295 } buffer;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3296 uint32_t cur = start;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3297 if (size == 'l') {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3298 while (count)
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3299 {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3300 uint32_t n = count < 256 ? count : 256;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3301 count -= n;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3302 for (uint32_t i = 0; i < n ; i++)
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3303 {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3304 if (arr) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3305 val = arr->get(arr, cur++);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3306 if (!debug_cast_int(val, buffer.l + i)) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3307 n = i;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3308 count = 0;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3309 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3310 } else {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3311 buffer.l[i] = cur;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3312 cur += 4;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3313 if (!root->read_mem(root, buffer.l + i, 'l')) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3314 n = i;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3315 count = 0;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3316 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3317 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3318 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3319 fwrite(buffer.l, sizeof(uint32_t), n, f);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3320 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3321 } else if (size == 'w') {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3322 while (count)
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3323 {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3324 uint32_t n = count < 512 ? count : 512;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3325 count -= n;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3326 uint32_t tmp;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3327 for (uint32_t i = 0; i < n ; i++)
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3328 {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3329 if (arr) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3330 val = arr->get(arr, cur++);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3331 if (!debug_cast_int(val, &tmp)) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3332 n = i;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3333 count = 0;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3334 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3335 } else {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3336 tmp = cur;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3337 cur += 2;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3338 if (!root->read_mem(root, &tmp, 'w')) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3339 n = i;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3340 count = 0;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3341 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3342 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3343 buffer.w[i] = tmp;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3344 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3345 fwrite(buffer.w, sizeof(uint16_t), n, f);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3346 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3347 } else {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3348 while (count)
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3349 {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3350 uint32_t n = count < 1024 ? count : 1024;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3351 count -= n;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3352 uint32_t tmp;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3353 for (uint32_t i = 0; i < n ; i++)
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3354 {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3355 if (arr) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3356 val = arr->get(arr, cur++);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3357 if (!debug_cast_int(val, &tmp)) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3358 n = i;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3359 count = 0;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3360 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3361 } else {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3362 tmp = cur++;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3363 if (!root->read_mem(root, &tmp, 'b')) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3364 n = i;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3365 count = 0;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3366 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3367 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3368 buffer.b[i] = tmp;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3369 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3370 fwrite(buffer.b, sizeof(uint8_t), n, f);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3371 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3372 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3373 cleanup:
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3374 fclose(f);
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3375 return 1;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3376 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
3377
2394
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3378 static uint8_t cmd_load(debug_root *root, parsed_command *cmd)
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3379 {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3380 char size = cmd->format ? cmd->format[0] : 'b';
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3381 if (size != 'b' && size != 'w' && size != 'l') {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3382 fprintf(stderr, "Invalid size %s\n", cmd->format);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3383 return 1;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3384 }
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3385 if (!eval_expr(root, cmd->args[0].parsed, &cmd->args[0].value)) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3386 fprintf(stderr, "Failed to eval %s\n", cmd->args[0].raw);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3387 return 1;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3388 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3389 char *fname = get_cstring(cmd->args[0].value);
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3390 if (!fname) {
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3391 fprintf(stderr, "First argument to load must be a string\n");
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3392 return 1;
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3393 }
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3394 FILE *f = fopen(fname, "rb");
2394
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3395 if (!f) {
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
3396 fprintf(stderr, "Failed to open %s for reading\n", fname);
2394
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3397 return 1;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3398 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3399 uint32_t start = 0;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3400 debug_val val;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3401 debug_array * arr = NULL;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3402 if (cmd->args[1].parsed->type == EXPR_MEM) {
2396
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3403
2394
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3404 if (!eval_expr(root, cmd->args[1].parsed->left, &val)) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3405 fprintf(stderr, "Failed to eval start index\n");
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3406 goto cleanup;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3407 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3408 if (!debug_cast_int(val, &start)) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3409 fprintf(stderr, "Start index must evaluate to integer\n");
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3410 goto cleanup;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3411 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3412 if (cmd->args[1].parsed->right) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3413 if (!eval_expr(root, cmd->args[1].parsed->right, &val)) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3414 fprintf(stderr, "Failed to eval array name in argument %s\n", cmd->args[1].raw);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3415 goto cleanup;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3416 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3417 arr = get_array(val);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3418 if (!arr) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3419 fprintf(stderr, "Name in argument %s did not evaluate to an array\n", cmd->args[1].raw);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3420 goto cleanup;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3421 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3422 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3423 } else {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3424 if (!eval_expr(root, cmd->args[1].parsed, &val)) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3425 fprintf(stderr, "Failed to eval %s\n", cmd->args[1].raw);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3426 goto cleanup;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3427 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3428 arr = get_array(val);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3429 if (!arr) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3430 fprintf(stderr, "Argument %s did not evaluate to an array\n", cmd->args[1].raw);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3431 goto cleanup;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3432 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3433 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3434 uint32_t count = 0;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3435 uint8_t has_count = 0;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3436 if (cmd->num_args > 2) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3437 if (!eval_expr(root, cmd->args[2].parsed, &val)) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3438 fprintf(stderr, "Failed to eval %s\n", cmd->args[2].raw);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3439 goto cleanup;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3440 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3441 if (!debug_cast_int(val, &count)) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3442 fprintf(stderr, "Count must evaluate to integer\n");
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3443 goto cleanup;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3444 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3445 has_count = 1;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3446 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3447 union {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3448 uint8_t b[1024];
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3449 uint16_t w[512];
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3450 uint32_t l[256];
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3451 } buffer;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3452 uint32_t cur = start;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3453 if (size == 'l') {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3454 while (count || !has_count)
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3455 {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3456 uint32_t n = (has_count && count < 256) ? count : 256;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3457 count -= n;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3458 n = fread(buffer.l, sizeof(uint32_t), n, f);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3459 if (!n) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3460 break;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3461 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3462 for (uint32_t i = 0; i < n ; i++)
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3463 {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3464 if (arr) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3465 val = debug_int(buffer.l[i]);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3466 if (cur >= arr->size) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3467 if (arr->append) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3468 arr->append(arr, val);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3469 } else {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3470 goto cleanup;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3471 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3472 } else {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3473 arr->set(arr, cur, val);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3474 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3475 cur++;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3476 } else {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3477 if (!root->write_mem(root, cur, buffer.l[i], 'l')) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3478 goto cleanup;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3479 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3480 cur += 4;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3481 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3482 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3483 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3484 } else if (size == 'w') {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3485 while (count || !has_count)
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3486 {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3487 uint32_t n = (has_count && count < 512) ? count : 512;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3488 count -= n;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3489 n = fread(buffer.w, sizeof(uint16_t), n, f);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3490 if (!n) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3491 break;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3492 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3493 for (uint32_t i = 0; i < n ; i++)
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3494 {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3495 if (arr) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3496 val = debug_int(buffer.w[i]);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3497 if (cur >= arr->size) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3498 if (arr->append) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3499 arr->append(arr, val);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3500 } else {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3501 goto cleanup;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3502 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3503 } else {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3504 arr->set(arr, cur, val);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3505 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3506 cur++;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3507 } else {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3508 if (!root->write_mem(root, cur, buffer.w[i], 'w')) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3509 goto cleanup;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3510 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3511 cur += 2;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3512 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3513 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3514 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3515 } else {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3516 while (count || !has_count)
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3517 {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3518 uint32_t n = (has_count && count < 1024) ? count : 1024;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3519 count -= n;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3520 n = fread(buffer.b, sizeof(uint8_t), n, f);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3521 if (!n) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3522 break;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3523 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3524 for (uint32_t i = 0; i < n ; i++)
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3525 {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3526 if (arr) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3527 val = debug_int(buffer.b[i]);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3528 if (cur >= arr->size) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3529 if (arr->append) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3530 arr->append(arr, val);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3531 } else {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3532 goto cleanup;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3533 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3534 } else {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3535 arr->set(arr, cur, val);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3536 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3537 } else {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3538 if (!root->write_mem(root, cur, buffer.b[i], 'b')) {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3539 goto cleanup;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3540 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3541 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3542 cur++;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3543 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3544 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3545 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3546 cleanup:
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3547 fclose(f);
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3548 return 1;
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3549 }
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
3550
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3551 static uint8_t cmd_delete_m68k(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3552 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3553 uint32_t index;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3554 if (!debug_cast_int(cmd->args[0].value, &index)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3555 fprintf(stderr, "Argument to delete must be an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3556 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3557 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3558 bp_def **this_bp = find_breakpoint_idx(&root->breakpoints, index);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3559 if (!*this_bp) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3560 fprintf(stderr, "Breakpoint %d does not exist\n", index);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3561 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3562 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3563 bp_def *tmp = *this_bp;
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3564 if (tmp->type == BP_TYPE_CPU) {
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3565 remove_breakpoint(root->cpu_context, tmp->address);
2396
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3566 } else if (tmp->type == BP_TYPE_CPU_WATCH) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3567 m68k_remove_watchpoint(root->cpu_context, tmp->address, tmp->mask);
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3568 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3569 *this_bp = (*this_bp)->next;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3570 if (tmp->commands) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3571 for (uint32_t i = 0; i < tmp->num_commands; i++)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3572 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3573 free_parsed_command(tmp->commands + i);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3574 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3575 free(tmp->commands);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3576 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3577 free(tmp);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3578 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3579 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3580
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3581 static uint8_t cmd_breakpoint_m68k(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3582 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3583 uint32_t address;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3584 if (!debug_cast_int(cmd->args[0].value, &address)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3585 fprintf(stderr, "Argument to breakpoint must be an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3586 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3587 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3588 insert_breakpoint(root->cpu_context, address, debugger);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3589 bp_def *new_bp = calloc(1, sizeof(bp_def));
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3590 new_bp->next = root->breakpoints;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3591 new_bp->address = address;
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3592 new_bp->mask = 0xFFFFFF;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3593 new_bp->index = root->bp_index++;
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3594 new_bp->type = BP_TYPE_CPU;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3595 root->breakpoints = new_bp;
2386
9f178feb3cb0 Prefix most hex-formatted values output by debugger with $ for consistency with number literal parsing
Michael Pavone <pavone@retrodev.com>
parents: 2380
diff changeset
3596 printf("68K Breakpoint %d set at $%X\n", new_bp->index, address);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3597 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3598 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3599
2396
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3600 static uint8_t cmd_watchpoint_m68k(debug_root *root, parsed_command *cmd)
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3601 {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3602 uint32_t address;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3603 if (!debug_cast_int(cmd->args[0].value, &address)) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3604 fprintf(stderr, "First argument to watchpoint must be an integer\n");
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3605 return 1;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3606 }
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3607 uint32_t size;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3608 if (cmd->num_args > 1) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3609 if (!debug_cast_int(cmd->args[1].value, &size)) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3610 fprintf(stderr, "Second argument to watchpoint must be an integer if provided\n");
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3611 return 1;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3612 }
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3613 } else {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3614 //default to byte for odd addresses, word for even
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3615 size = (address & 1) ? 1 : 2;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3616 }
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3617 m68k_add_watchpoint(root->cpu_context, address, size);
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3618 bp_def *new_bp = calloc(1, sizeof(bp_def));
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3619 new_bp->next = root->breakpoints;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3620 new_bp->address = address;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3621 new_bp->mask = size;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3622 new_bp->index = root->bp_index++;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3623 new_bp->type = BP_TYPE_CPU_WATCH;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3624 root->breakpoints = new_bp;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3625 printf("68K Watchpoint %d set for $%X\n", new_bp->index, address);
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3626 return 1;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3627 }
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
3628
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3629 static void on_vdp_reg_write(vdp_context *context, uint16_t reg, uint16_t value)
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3630 {
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3631 value &= 0xFF;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3632 if (context->regs[reg] == value) {
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3633 return;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3634 }
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3635 genesis_context *gen = (genesis_context *)context->system;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3636 debug_root *root = find_m68k_root(gen->m68k);
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3637 bp_def **this_bp = find_breakpoint(&root->breakpoints, reg, BP_TYPE_VDPREG);
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3638 int debugging = 1;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3639 if (*this_bp) {
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3640 if ((*this_bp)->condition) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3641 debug_val condres;
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3642 if (eval_expr(root, (*this_bp)->condition, &condres)) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3643 if (!condres.v.u32) {
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3644 return;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3645 }
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3646 } else {
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3647 fprintf(stderr, "Failed to eval condition for VDP Register Breakpoint %u\n", (*this_bp)->index);
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3648 free_expr((*this_bp)->condition);
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3649 (*this_bp)->condition = NULL;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3650 }
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3651 }
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3652 for (uint32_t i = 0; debugging && i < (*this_bp)->num_commands; i++)
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3653 {
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3654 debugging = run_command(root, (*this_bp)->commands + i);
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3655 }
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3656 if (debugging) {
2386
9f178feb3cb0 Prefix most hex-formatted values output by debugger with $ for consistency with number literal parsing
Michael Pavone <pavone@retrodev.com>
parents: 2380
diff changeset
3657 printf("VDP Register Breakpoint %d hit on register write $%X - Old: $%X, New: $%X\n", (*this_bp)->index, reg, context->regs[reg], value);
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3658 gen->header.enter_debugger = 1;
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2459
diff changeset
3659 if (gen->m68k->sync_cycle > gen->m68k->cycles + 1) {
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2459
diff changeset
3660 gen->m68k->sync_cycle = gen->m68k->cycles + 1;
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3661 }
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3662 if (gen->m68k->target_cycle > gen->m68k->sync_cycle) {
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3663 gen->m68k->target_cycle = gen->m68k->sync_cycle;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3664 }
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3665 }
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3666 }
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3667 }
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3668
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3669 static uint8_t cmd_vdp_reg_break(debug_root *root, parsed_command *cmd)
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3670 {
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3671 bp_def *new_bp = calloc(1, sizeof(bp_def));
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3672 new_bp->next = root->breakpoints;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3673 if (cmd->num_args) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3674 if (!debug_cast_int(cmd->args[0].value, &new_bp->address)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3675 fprintf(stderr, "Arguments to vdpregbreak must be integers if provided\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3676 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3677 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3678 if (cmd->num_args > 1) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3679 if (!debug_cast_int(cmd->args[1].value, &new_bp->mask)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3680 fprintf(stderr, "Arguments to vdpregbreak must be integers if provided\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3681 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3682 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3683 } else {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3684 new_bp->mask = 0xFF;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3685 }
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3686 }
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3687 new_bp->index = root->bp_index++;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3688 new_bp->type = BP_TYPE_VDPREG;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3689 root->breakpoints = new_bp;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3690 m68k_context *m68k = root->cpu_context;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3691 genesis_context *gen = m68k->system;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3692 gen->vdp->reg_hook = on_vdp_reg_write;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3693 printf("VDP Register Breakpoint %d set\n", new_bp->index);
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3694 return 1;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3695 }
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
3696
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3697 static uint8_t cmd_advance_m68k(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3698 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3699 uint32_t address;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3700 if (!debug_cast_int(cmd->args[0].value, &address)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3701 fprintf(stderr, "Argument to advance must be an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3702 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3703 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3704 insert_breakpoint(root->cpu_context, address, debugger);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3705 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3706 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3707
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3708 static uint8_t cmd_step_m68k(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3709 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3710 m68kinst *inst = root->inst;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3711 m68k_context *context = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3712 uint32_t after = root->after;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3713 if (inst->op == M68K_RTS) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3714 after = m68k_read_long(context->aregs[7], context);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3715 } else if (inst->op == M68K_RTE || inst->op == M68K_RTR) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3716 after = m68k_read_long(context->aregs[7] + 2, context);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3717 } else if(m68k_is_branch(inst)) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3718 if (inst->op == M68K_BCC && inst->extra.cond != COND_TRUE) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3719 root->branch_f = after;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3720 root->branch_t = m68k_branch_target(inst, context->dregs, context->aregs) & 0xFFFFFF;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3721 insert_breakpoint(context, root->branch_t, debugger);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3722 } else if(inst->op == M68K_DBCC) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3723 if (inst->extra.cond == COND_FALSE) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3724 if (context->dregs[inst->dst.params.regs.pri] & 0xFFFF) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3725 after = m68k_branch_target(inst, context->dregs, context->aregs);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3726 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3727 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3728 root->branch_t = after;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3729 root->branch_f = m68k_branch_target(inst, context->dregs, context->aregs);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3730 insert_breakpoint(context, root->branch_f, debugger);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3731 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3732 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3733 after = m68k_branch_target(inst, context->dregs, context->aregs) & 0xFFFFFF;
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
3734 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3735 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3736 insert_breakpoint(root->cpu_context, after, debugger);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3737 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3738 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3739
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3740 static uint8_t cmd_over_m68k(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3741 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3742 m68kinst *inst = root->inst;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3743 m68k_context *context = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3744 uint32_t after = root->after;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3745 if (inst->op == M68K_RTS) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3746 after = m68k_read_long(context->aregs[7], context);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3747 } else if (inst->op == M68K_RTE || inst->op == M68K_RTR) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3748 after = m68k_read_long(context->aregs[7] + 2, context);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3749 } else if(m68k_is_noncall_branch(inst)) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3750 if (inst->op == M68K_BCC && inst->extra.cond != COND_TRUE) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3751 root->branch_t = m68k_branch_target(inst, context->dregs, context->aregs) & 0xFFFFFF;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3752 if (root->branch_t < after) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3753 root->branch_t = 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3754 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3755 root->branch_f = after;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3756 insert_breakpoint(context, root->branch_t, debugger);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3757 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3758 } else if(inst->op == M68K_DBCC) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3759 uint32_t target = m68k_branch_target(inst, context->dregs, context->aregs) & 0xFFFFFF;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3760 if (target > after) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3761 if (inst->extra.cond == COND_FALSE) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3762 after = target;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3763 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3764 root->branch_f = target;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3765 root->branch_t = after;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3766 insert_breakpoint(context, root->branch_f, debugger);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3767 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3768 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3769 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3770 after = m68k_branch_target(inst, context->dregs, context->aregs) & 0xFFFFFF;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3771 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3772 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3773 insert_breakpoint(root->cpu_context, after, debugger);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3774 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3775 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3776
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3777 static uint8_t cmd_next_m68k(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3778 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3779 m68kinst *inst = root->inst;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3780 m68k_context *context = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3781 uint32_t after = root->after;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3782 if (inst->op == M68K_RTS) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3783 after = m68k_read_long(context->aregs[7], context);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3784 } else if (inst->op == M68K_RTE || inst->op == M68K_RTR) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3785 after = m68k_read_long(context->aregs[7] + 2, context);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3786 } else if(m68k_is_noncall_branch(inst)) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3787 if (inst->op == M68K_BCC && inst->extra.cond != COND_TRUE) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3788 root->branch_f = after;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3789 root->branch_t = m68k_branch_target(inst, context->dregs, context->aregs);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3790 insert_breakpoint(context, root->branch_t, debugger);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3791 } else if(inst->op == M68K_DBCC) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3792 if ( inst->extra.cond == COND_FALSE) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3793 if (context->dregs[inst->dst.params.regs.pri] & 0xFFFF) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3794 after = m68k_branch_target(inst, context->dregs, context->aregs);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3795 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3796 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3797 root->branch_t = after;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3798 root->branch_f = m68k_branch_target(inst, context->dregs, context->aregs);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3799 insert_breakpoint(context, root->branch_f, debugger);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3800 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3801 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3802 after = m68k_branch_target(inst, context->dregs, context->aregs) & 0xFFFFFF;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3803 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3804 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3805 insert_breakpoint(root->cpu_context, after, debugger);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3806 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3807 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3808
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3809 static uint8_t cmd_backtrace_m68k(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3810 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3811 m68k_context *context = root->cpu_context;
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
3812 #ifdef NEW_CORE
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
3813 //TODO: implement me
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
3814 #else
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3815 uint32_t stack = context->aregs[7];
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3816 uint8_t non_adr_count = 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3817 do {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3818 uint32_t bt_address = m68k_instruction_fetch(stack, context);
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2459
diff changeset
3819 bt_address = get_instruction_start(context->opts, bt_address - 2);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3820 if (bt_address) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3821 stack += 4;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3822 non_adr_count = 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3823 m68kinst inst;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3824 char buf[128];
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3825 m68k_decode(m68k_instruction_fetch, context, &inst, bt_address);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3826 m68k_disasm(&inst, buf);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3827 printf("%X: %s\n", bt_address, buf);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3828 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3829 //non-return address value on stack can be word wide
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3830 stack += 2;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3831 non_adr_count++;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3832 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3833 //TODO: Make sure we don't wander into an invalid memory region
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3834 } while (stack && non_adr_count < 6);
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
3835 #endif
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3836 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3837 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3838
2216
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3839 static uint8_t cmd_disassemble_m68k(debug_root *root, parsed_command *cmd)
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3840 {
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3841 m68k_context *context = root->cpu_context;
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3842 uint32_t address = root->address;
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3843 if (cmd->num_args) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3844 if (!debug_cast_int(cmd->args[0].value, &address)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3845 fprintf(stderr, "Argument to disassemble must be an integer if provided\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3846 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3847 }
2216
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3848 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
3849 #ifndef NEW_CORE
2216
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3850 char disasm_buf[1024];
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3851 m68kinst inst;
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3852 do {
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3853 label_def *def = find_label(root->disasm, address);
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3854 if (def) {
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3855 for (uint32_t i = 0; i < def->num_labels; i++)
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3856 {
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3857 printf("%s:\n", def->labels[i]);
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3858 }
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3859 }
2252
6a07b13894f7 Fix input processing while waiting for console input in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2216
diff changeset
3860
2216
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3861 address = m68k_decode(m68k_instruction_fetch, context, &inst, address);
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3862 m68k_disasm_labels(&inst, disasm_buf, root->disasm);
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3863 printf("\t%s\n", disasm_buf);
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3864 } while(!m68k_is_terminal(&inst));
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
3865 #endif
2216
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3866 return 1;
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3867 }
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
3868
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3869 static uint8_t cmd_vdp_sprites(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3870 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3871 m68k_context *context = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3872 genesis_context * gen = context->system;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3873 vdp_print_sprite_table(gen->vdp);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3874 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3875 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3876
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3877 static uint8_t cmd_vdp_regs(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3878 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3879 m68k_context *context = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3880 genesis_context * gen = context->system;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3881 vdp_print_reg_explain(gen->vdp);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3882 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3883 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3884
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3885 static uint8_t cmd_ym_channel(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3886 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3887 m68k_context *context = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3888 genesis_context * gen = context->system;
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3889 if (cmd->num_args) {
2505
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
3890 if (cmd->args[0].value.v.u32 < 1 || cmd->args[0].value.v.u32 > 6) {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
3891 printf("%d is not a valid YM2612 channel number. Valid values are 1-6\n", cmd->args[0].value.v.u32);
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
3892 return 1;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
3893 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
3894 ym_print_channel_info(gen->ym, cmd->args[0].value.v.u32 - 1);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3895 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3896 for (int i = 0; i < 6; i++) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3897 ym_print_channel_info(gen->ym, i);
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
3898 }
2173
894c7873a2b1 Consume all expressions in debugger print command
Michael Pavone <pavone@retrodev.com>
parents: 2172
diff changeset
3899 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3900 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3901 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3902
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3903 static uint8_t cmd_ym_timer(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3904 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3905 m68k_context *context = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3906 genesis_context * gen = context->system;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3907 ym_print_timer_info(gen->ym);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3908 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3909 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3910
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3911 static uint8_t cmd_sub(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3912 {
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3913 char *param = cmd->raw;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3914 while (param && *param && isblank(*param))
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3915 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3916 ++param;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3917 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3918 m68k_context *m68k = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3919 genesis_context *gen = m68k->system;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3920 segacd_context *cd = gen->expansion;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3921 if (param && *param && !isspace(*param)) {
2193
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
3922 parsed_command cmd = {0};
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3923 debug_root *sub_root = find_m68k_root(cd->m68k);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3924 if (!sub_root) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3925 fputs("Failed to get debug root for Sub CPU\n", stderr);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3926 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3927 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3928 if (!parse_command(sub_root, param, &cmd)) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3929 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3930 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3931 uint8_t ret = run_command(sub_root, &cmd);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3932 free_parsed_command(&cmd);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3933 return ret;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3934 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3935 cd->enter_debugger = 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3936 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3937 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3938 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3939
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3940 static uint8_t cmd_main(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3941 {
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3942 char *param = cmd->raw;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3943 while (param && *param && isblank(*param))
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3944 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3945 ++param;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3946 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3947 m68k_context *m68k = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3948 segacd_context *cd = m68k->system;
2186
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
3949
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3950 if (param && *param && !isspace(*param)) {
2193
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
3951 parsed_command cmd = {0};
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3952 debug_root *main_root = find_m68k_root(cd->genesis->m68k);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3953 if (!main_root) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3954 fputs("Failed to get debug root for Main CPU\n", stderr);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3955 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3956 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3957 if (!parse_command(main_root, param, &cmd)) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3958 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3959 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3960 uint8_t ret = run_command(main_root, &cmd);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3961 free_parsed_command(&cmd);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3962 return ret;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3963 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3964 cd->genesis->header.enter_debugger = 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3965 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3966 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3967 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3968
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3969 static uint8_t cmd_gen_z80(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3970 {
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
3971 char *param = cmd->raw;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3972 while (param && *param && isblank(*param))
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3973 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3974 ++param;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3975 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3976 m68k_context *m68k = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3977 genesis_context *gen = m68k->system;
2186
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
3978
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3979 if (param && *param && !isspace(*param)) {
2193
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
3980 parsed_command cmd = {0};
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3981 debug_root *z80_root = find_z80_root(gen->z80);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3982 if (!z80_root) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3983 fputs("Failed to get debug root for Z80\n", stderr);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3984 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3985 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3986 if (!parse_command(z80_root, param, &cmd)) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3987 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3988 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3989 uint8_t ret = run_command(z80_root, &cmd);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3990 free_parsed_command(&cmd);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3991 return ret;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3992 } else {
2184
408fb8a7e990 Implement argumentless variant of z80 debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2183
diff changeset
3993 gen->enter_z80_debugger = 1;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3994 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3995 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3996 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3997
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3998 command_def common_commands[] = {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
3999 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4000 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4001 "quit", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4002 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4003 .usage = "quit",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4004 .desc = "Quit BlastEm",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4005 .impl = cmd_quit,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4006 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4007 .max_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4008 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4009 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4010 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4011 "help", "?", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4012 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4013 .usage = "help",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4014 .desc = "Print a list of available commands for the current debug context",
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4015 .impl = cmd_help,
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4016 .min_args = 0,
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4017 .max_args = 1,
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4018 .raw_args = 1
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4019 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4020 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4021 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4022 "continue", "c", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4023 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4024 .usage = "continue",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4025 .desc = "Resume execution",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4026 .impl = cmd_continue,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4027 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4028 .max_args = 0
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4029 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4030 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4031 .names = (const char *[]){
2189
6b33ce6bc740 Add an explicit p alias for the print command now that printf prevents use of it as an implicit alias
Michael Pavone <pavone@retrodev.com>
parents: 2188
diff changeset
4032 "print", "p", NULL
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4033 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4034 .usage = "print[/FORMAT] EXPRESSION...",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4035 .desc = "Print one or more expressions using the optional format character",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4036 .impl = cmd_print,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4037 .min_args = 1,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4038 .max_args = -1
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4039 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4040 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4041 .names = (const char *[]){
2187
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
4042 "printf", NULL
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
4043 },
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
4044 .usage = "printf FORMAT EXPRESSION...",
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
4045 .desc = "Print a string with C-style formatting specifiers replaced with the value of the remaining arguments",
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4046 .impl = cmd_printf,
2187
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
4047 .min_args = 1,
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
4048 .max_args = -1
2187
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
4049 },
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
4050 {
d0129f19ca52 Add a printf command to the debugger
Michael Pavone <pavone@retrodev.com>
parents: 2186
diff changeset
4051 .names = (const char *[]){
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4052 "softreset", "sr", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4053 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4054 .usage = "softreset",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4055 .desc = "Perform a soft-reset for the current system",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4056 .impl = cmd_softreset,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4057 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4058 .max_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4059 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4060 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4061 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4062 "display", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4063 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4064 .usage = "display[/FORMAT] EXPRESSION...",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4065 .desc = "Print one or more expressions every time the debugger is entered",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4066 .impl = cmd_display,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4067 .min_args = 1,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4068 .max_args = -1
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4069 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4070 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4071 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4072 "deletedisplay", "dd", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4073 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4074 .usage = "deletedisplay DISPLAYNUM",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4075 .desc = "Remove expressions added with the `display` command",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4076 .impl = cmd_delete_display,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4077 .min_args = 1,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4078 .max_args = 1
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4079 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4080 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4081 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4082 "commands", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4083 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4084 .usage = "command BREAKPOINT",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4085 .desc = "Set a list of debugger commands to be executed when the given breakpoint is hit",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4086 .impl = cmd_command,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4087 .min_args = 1,
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4088 .max_args = 1,
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4089 .has_block = 1
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4090 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4091 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4092 .names = (const char *[]){
2371
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4093 "function", NULL
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4094 },
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4095 .usage = "function NAME [ARGS...]",
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4096 .desc = "Creates a user-defined function named NAME with arguments ARGS",
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4097 .impl = cmd_function,
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4098 .min_args = 1,
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4099 .max_args = -1,
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4100 .has_block = 1,
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4101 .skip_eval = 1
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4102 },
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4103 {
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4104 .names = (const char *[]){
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4105 "return", NULL
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4106 },
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4107 .usage = "return VALUE",
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4108 .desc = "Return from a user defined function with the result VALUE",
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4109 .impl = cmd_return,
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4110 .min_args = 1,
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4111 .max_args = 1
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4112 },
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4113 {
1fe5afe263f3 Initial stab at user-defined functions in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2367
diff changeset
4114 .names = (const char *[]){
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4115 "set", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4116 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4117 .usage = "set MEM|NAME VALUE",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4118 .desc = "Set a register, symbol or memory location to the result of evaluating VALUE",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4119 .impl = cmd_set,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4120 .min_args = 2,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4121 .max_args = 2,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4122 .skip_eval = 1
2179
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2178
diff changeset
4123 },
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2178
diff changeset
4124 {
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2178
diff changeset
4125 .names = (const char *[]){
2358
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
4126 "variable", NULL
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
4127 },
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
4128 .usage = "variable NAME [VALUE]",
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
4129 .desc = "Create a new variable called NAME and set it to VALUE or 0 if no value provided",
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
4130 .impl = cmd_variable,
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
4131 .min_args = 1,
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
4132 .max_args = 2,
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
4133 .skip_eval = 1
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
4134 },
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
4135 {
4b2ac43c106e Give debugger expression engine access to VDP and Sub CPU values. Add basic variable support
Michael Pavone <pavone@retrodev.com>
parents: 2357
diff changeset
4136 .names = (const char *[]){
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4137 "array", NULL
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4138 },
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4139 .usage = "array NAME [VALUE...]",
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4140 .desc = "Create a new array called NAME if it doesn't already exist. The array is initialized with the remaining parameters",
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4141 .impl = cmd_array,
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4142 .min_args = 1,
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4143 .max_args = -1,
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4144 .skip_eval = 1
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4145 },
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4146 {
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4147 .names = (const char *[]){
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4148 "append", NULL
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4149 },
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4150 .usage = "append NAME VALUE",
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4151 .desc = "Increase the size of array NAME by 1 and set the last element to VALUE",
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4152 .impl = cmd_append,
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4153 .min_args = 2,
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4154 .max_args = 2
2359
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4155 },
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4156 {
04d29635d238 Support for arrays in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2358
diff changeset
4157 .names = (const char *[]){
2179
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2178
diff changeset
4158 "frames", NULL
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2178
diff changeset
4159 },
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2178
diff changeset
4160 .usage = "frames EXPRESSION",
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2178
diff changeset
4161 .desc = "Resume execution for EXPRESSION video frames",
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2178
diff changeset
4162 .impl = cmd_frames,
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2178
diff changeset
4163 .min_args = 1,
9a8dd4ba2753 Implement frame advance debugger command
Michael Pavone <pavone@retrodev.com>
parents: 2178
diff changeset
4164 .max_args = 1
2181
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4165 },
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4166 {
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4167 .names = (const char *[]){
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4168 "bindup", NULL
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4169 },
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4170 .usage = "bindup NAME",
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4171 .desc = "Simulate a keyup for binding NAME",
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4172 .impl = cmd_bindup,
2181
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4173 .min_args = 1,
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
4174 .max_args = 1
2181
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4175 },
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4176 {
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4177 .names = (const char *[]){
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4178 "binddown", NULL
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4179 },
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4180 .usage = "bindown NAME",
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4181 .desc = "Simulate a keydown for binding NAME",
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4182 .impl = cmd_binddown,
2181
0c723b8b637c Add bindup and binddown debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2180
diff changeset
4183 .min_args = 1,
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
4184 .max_args = 1
2182
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
4185 },
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
4186 {
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
4187 .names = (const char *[]){
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
4188 "condition", NULL
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
4189 },
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
4190 .usage = "condition BREAKPOINT [EXPRESSION]",
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
4191 .desc = "Makes breakpoint BREAKPOINT conditional on the value of EXPRESSION or removes a condition if EXPRESSION is omitted",
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
4192 .impl = cmd_condition,
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
4193 .min_args = 1,
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4194 .max_args = 2,
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4195 .skip_eval = 1
2190
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4196 },
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4197 {
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4198 .names = (const char *[]){
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4199 "if", NULL
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4200 },
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4201 .usage = "if CONDITION",
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4202 .desc = "If the condition is true, the following block is executed. Otherwise the else block is executed if present",
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4203 .impl = cmd_if,
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4204 .min_args = 1,
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4205 .max_args = 1,
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4206 .has_block = 1,
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4207 .accepts_else = 1
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4208 },
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4209 {
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4210 .names = (const char *[]){
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4211 "while", NULL
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4212 },
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4213 .usage = "while CONDITION",
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4214 .desc = "The following block is executed repeatedly until the condition is false. If the condition is false at the start, the else block is executed if present",
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4215 .impl = cmd_while,
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4216 .min_args = 1,
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4217 .max_args = 1,
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4218 .has_block = 1,
59e0dcc01b2c Add 'if' and 'while' debugger commands
Michael Pavone <pavone@retrodev.com>
parents: 2189
diff changeset
4219 .accepts_else = 1
2214
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4220 },
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4221 {
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4222 .names = (const char *[]){
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4223 "symbols", NULL
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4224 },
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4225 .usage = "symbols [FILENAME]",
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4226 .desc = "Loads a list of symbols from the file indicated by FILENAME or lists currently loaded symbols if FILENAME is omitted",
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4227 .impl = cmd_symbols,
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4228 .min_args = 0,
2395
ebca8ab02701 Basic string support in debugger language
Michael Pavone <pavone@retrodev.com>
parents: 2394
diff changeset
4229 .max_args = 1
2393
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4230 },
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4231 {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4232 .names = (const char *[]){
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4233 "save", NULL
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4234 },
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4235 .usage = "save[/SIZE] FILENAME ARRAY [COUNT]",
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4236 .desc = "Saves COUNT elements of size SIZE from the array or memory region specified by ARRAY to a file",
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4237 .impl = cmd_save,
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4238 .min_args = 2,
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4239 .max_args = 3,
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4240 .skip_eval = 1
2394
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
4241 },
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
4242 {
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
4243 .names = (const char *[]){
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
4244 "load", NULL
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
4245 },
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
4246 .usage = "load[/SIZE] FILENAME ARRAY [COUNT]",
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
4247 .desc = "Loads COUNT elements of size SIZE from a file to the array or memory region specified by ARRAY",
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
4248 .impl = cmd_load,
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
4249 .min_args = 2,
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
4250 .max_args = 3,
340299a76db7 Add debugger load command
Michael Pavone <pavone@retrodev.com>
parents: 2393
diff changeset
4251 .skip_eval = 1
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4252 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4253 };
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4254 #define NUM_COMMON (sizeof(common_commands)/sizeof(*common_commands))
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4255
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4256 command_def m68k_commands[] = {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4257 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4258 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4259 "breakpoint", "b", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4260 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4261 .usage = "breakpoint ADDRESSS",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4262 .desc = "Set a breakpoint at ADDRESS",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4263 .impl = cmd_breakpoint_m68k,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4264 .min_args = 1,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4265 .max_args = 1
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4266 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4267 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4268 .names = (const char *[]){
2396
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
4269 "watchpoint", NULL
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
4270 },
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
4271 .usage = "watchpoint ADDRESS [SIZE]",
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
4272 .desc = "Set a watchpoint at ADDRESS with an optional SIZE in bytes. SIZE defaults to 2 for even address and 1 for odd",
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
4273 .impl = cmd_watchpoint_m68k,
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
4274 .min_args = 1,
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
4275 .max_args = 2
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
4276 },
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
4277 {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
4278 .names = (const char *[]){
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4279 "advance", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4280 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4281 .usage = "advance ADDRESS",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4282 .desc = "Advance to ADDRESS",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4283 .impl = cmd_advance_m68k,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4284 .min_args = 1,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4285 .max_args = 1
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4286 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4287 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4288 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4289 "step", "s", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4290 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4291 .usage = "step",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4292 .desc = "Advance to the next instruction, stepping into subroutines",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4293 .impl = cmd_step_m68k,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4294 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4295 .max_args = 0
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4296 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4297 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4298 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4299 "over", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4300 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4301 .usage = "over",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4302 .desc = "Advance to the next instruction, ignoring branches to lower addresses",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4303 .impl = cmd_over_m68k,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4304 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4305 .max_args = 0
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4306 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4307 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4308 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4309 "next", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4310 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4311 .usage = "next",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4312 .desc = "Advance to the next instruction",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4313 .impl = cmd_next_m68k,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4314 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4315 .max_args = 0
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4316 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4317 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4318 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4319 "backtrace", "bt", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4320 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4321 .usage = "backtrace",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4322 .desc = "Print a backtrace",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4323 .impl = cmd_backtrace_m68k,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4324 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4325 .max_args = 0
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4326 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4327 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4328 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4329 "delete", "d", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4330 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4331 .usage = "delete BREAKPOINT",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4332 .desc = "Remove breakpoint identified by BREAKPOINT",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4333 .impl = cmd_delete_m68k,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4334 .min_args = 1,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4335 .max_args = 1
2216
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4336 },
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4337 {
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4338 .names = (const char *[]){
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4339 "disassemble", "disasm", NULL
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4340 },
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4341 .usage = "disassemble [ADDRESS]",
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4342 .desc = "Disassemble code starting at ADDRESS if provided or the current address if not",
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4343 .impl = cmd_disassemble_m68k,
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4344 .min_args = 0,
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4345 .max_args = 1
2112
3abb64bd0da6 Add support for printing strings in 68K debugger
Michael Pavone <pavone@retrodev.com>
parents: 2107
diff changeset
4346 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4347 };
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4348
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4349 #define NUM_68K (sizeof(m68k_commands)/sizeof(*m68k_commands))
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4350
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4351 command_def genesis_commands[] = {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4352 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4353 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4354 "vdpsprites", "vs", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4355 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4356 .usage = "vdpsprites",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4357 .desc = "Print the VDP sprite table",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4358 .impl = cmd_vdp_sprites,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4359 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4360 .max_args = 0
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4361 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4362 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4363 .names = (const char *[]){
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
4364 "vdpregs", "vr", NULL
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4365 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4366 .usage = "vdpregs",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4367 .desc = "Print VDP register values with a short description",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4368 .impl = cmd_vdp_regs,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4369 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4370 .max_args = 0
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4371 },
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
4372 {
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
4373 .names = (const char *[]){
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
4374 "vdpregbreak", "vregbreak", "vrb", NULL
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
4375 },
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
4376 .usage = "vdpregbreak [REGISTER [MASK]]",
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
4377 .desc = "Enter debugger on VDP register write. If REGISTER is provided, breakpoint will only fire for writes to that register. If MASK is also provided, it will be applied to the register number before comparison with REGISTER",
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
4378 .impl = cmd_vdp_reg_break,
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
4379 .min_args = 0,
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
4380 .max_args = 2
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
4381 },
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4382 #ifndef NO_Z80
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4383 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4384 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4385 "z80", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4386 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4387 .usage = "z80 [COMMAND]",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4388 .desc = "Run a Z80 debugger command or switch to Z80 context when no command is given",
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4389 .impl = cmd_gen_z80,
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4390 .min_args = 0,
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4391 .max_args = -1,
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4392 .raw_args = 1
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4393 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4394 #endif
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4395 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4396 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4397 "ymchannel", "yc", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4398 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4399 .usage = "ymchannel [CHANNEL]",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4400 .desc = "Print YM-2612 channel and operator params. Limited to CHANNEL if specified",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4401 .impl = cmd_ym_channel,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4402 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4403 .max_args = 1
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4404 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4405 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4406 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4407 "ymtimer", "yt", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4408 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4409 .usage = "ymtimer",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4410 .desc = "Print YM-2612 timer info",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4411 .impl = cmd_ym_timer,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4412 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4413 .max_args = 0
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4414 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4415 };
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4416
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4417 #define NUM_GENESIS (sizeof(genesis_commands)/sizeof(*genesis_commands))
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4418
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4419 command_def scd_main_commands[] = {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4420 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4421 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4422 "subcpu", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4423 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4424 .usage = "subcpu [COMMAND]",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4425 .desc = "Run a Sub-CPU debugger command or switch to Sub-CPU context when no command is given",
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4426 .impl = cmd_sub,
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4427 .min_args = 0,
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4428 .max_args = -1,
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4429 .raw_args = 1
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4430 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4431 };
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4432
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4433 #define NUM_SCD_MAIN (sizeof(scd_main_commands)/sizeof(*scd_main_commands))
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4434
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4435 command_def scd_sub_commands[] = {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4436 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4437 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4438 "maincpu", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4439 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4440 .usage = "maincpu [COMMAND]",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4441 .desc = "Run a Main-CPU debugger command or switch to Main-CPU context when no command is given",
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4442 .impl = cmd_main,
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4443 .min_args = 0,
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4444 .max_args = -1,
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4445 .raw_args = 1
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4446 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4447 };
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4448
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4449 #define NUM_SCD_SUB (sizeof(scd_main_commands)/sizeof(*scd_main_commands))
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4450
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4451 #ifndef NO_Z80
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
4452 #ifndef NEW_CORE
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4453
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4454 static uint8_t cmd_delete_z80(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4455 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4456 uint32_t index;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4457 if (!debug_cast_int(cmd->args[0].value, &index)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4458 fprintf(stderr, "Argument to delete must be an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4459 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4460 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4461 bp_def **this_bp = find_breakpoint_idx(&root->breakpoints, index);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4462 if (!*this_bp) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4463 fprintf(stderr, "Breakpoint %d does not exist\n", index);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4464 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4465 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4466 bp_def *tmp = *this_bp;
2400
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4467 if (tmp->type == BP_TYPE_CPU) {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4468 zremove_breakpoint(root->cpu_context, tmp->address);
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4469 } else if (tmp->type == BP_TYPE_CPU_WATCH) {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4470 z80_remove_watchpoint(root->cpu_context, tmp->address, tmp->mask);
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4471 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4472 *this_bp = (*this_bp)->next;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4473 if (tmp->commands) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4474 for (uint32_t i = 0; i < tmp->num_commands; i++)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4475 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4476 free_parsed_command(tmp->commands + i);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4477 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4478 free(tmp->commands);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4479 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4480 free(tmp);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4481 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4482 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4483
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4484 static uint8_t cmd_breakpoint_z80(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4485 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4486 uint32_t address;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4487 if (!debug_cast_int(cmd->args[0].value, &address)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4488 fprintf(stderr, "Argument to breakpoint must be an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4489 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4490 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4491 zinsert_breakpoint(root->cpu_context, address, (uint8_t *)zdebugger);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4492 bp_def *new_bp = calloc(1, sizeof(bp_def));
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4493 new_bp->next = root->breakpoints;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4494 new_bp->address = address;
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
4495 new_bp->mask = 0xFFFF;
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
4496 new_bp->type = BP_TYPE_CPU;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4497 new_bp->index = root->bp_index++;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4498 root->breakpoints = new_bp;
2386
9f178feb3cb0 Prefix most hex-formatted values output by debugger with $ for consistency with number literal parsing
Michael Pavone <pavone@retrodev.com>
parents: 2380
diff changeset
4499 printf("Z80 Breakpoint %d set at $%X\n", new_bp->index, address);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4500 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4501 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4502
2400
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4503 static uint8_t cmd_watchpoint_z80(debug_root *root, parsed_command *cmd)
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4504 {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4505 uint32_t address;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4506 if (!debug_cast_int(cmd->args[0].value, &address)) {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4507 fprintf(stderr, "First argument to watchpoint must be an integer\n");
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4508 return 1;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4509 }
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4510 uint32_t size = 1;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4511 if (cmd->num_args > 1) {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4512 if (!debug_cast_int(cmd->args[1].value, &size)) {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4513 fprintf(stderr, "Second argument to watchpoint must be an integer if provided\n");
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4514 return 1;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4515 }
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4516 }
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4517 z80_add_watchpoint(root->cpu_context, address, size);
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4518 bp_def *new_bp = calloc(1, sizeof(bp_def));
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4519 new_bp->next = root->breakpoints;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4520 new_bp->address = address;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4521 new_bp->mask = size;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4522 new_bp->index = root->bp_index++;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4523 new_bp->type = BP_TYPE_CPU_WATCH;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4524 root->breakpoints = new_bp;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4525 printf("Z80 Watchpoint %d set for $%X\n", new_bp->index, address);
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4526 return 1;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4527 }
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4528
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4529 static uint8_t cmd_advance_z80(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4530 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4531 uint32_t address;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4532 if (!debug_cast_int(cmd->args[0].value, &address)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4533 fprintf(stderr, "Argument to advance must be an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4534 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4535 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4536 zinsert_breakpoint(root->cpu_context, address, (uint8_t *)zdebugger);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4537 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4538 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4539
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4540 static uint8_t cmd_step_z80(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4541 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4542 z80inst *inst = root->inst;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4543 z80_context *context = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4544 uint32_t after = root->after;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4545 //TODO: handle conditional branches
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4546 if (inst->op == Z80_JP || inst->op == Z80_CALL || inst->op == Z80_RST) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4547 if (inst->addr_mode == Z80_IMMED) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4548 after = inst->immed;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4549 } else if (inst->ea_reg == Z80_HL) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4550 #ifndef NEW_CORE
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4551 after = context->regs[Z80_H] << 8 | context->regs[Z80_L];
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4552 } else if (inst->ea_reg == Z80_IX) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4553 after = context->regs[Z80_IXH] << 8 | context->regs[Z80_IXL];
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4554 } else if (inst->ea_reg == Z80_IY) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4555 after = context->regs[Z80_IYH] << 8 | context->regs[Z80_IYL];
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4556 #endif
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4557 }
2505
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4558 #ifndef NEW_CORE
2506
b0f314b19964 Some more improvements to Z80 step, next and over commands
Michael Pavone <pavone@retrodev.com>
parents: 2505
diff changeset
4559 } else if (inst->op == Z80_JPCC || inst->op == Z80_CALLCC) {
2505
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4560 uint8_t invert = 0;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4561 uint8_t flag = 0;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4562 switch (inst->reg)
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4563 {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4564 case Z80_CC_NZ:
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4565 invert = 1;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4566 case Z80_CC_Z:
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4567 flag = context->flags[ZF_Z];
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4568 break;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4569 case Z80_CC_NC:
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4570 invert = 1;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4571 case Z80_CC_C:
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4572 flag = context->flags[ZF_C];
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4573 break;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4574 case Z80_CC_PO:
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4575 invert = 1;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4576 case Z80_CC_PE:
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4577 flag = context->flags[ZF_PV];
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4578 break;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4579 case Z80_CC_P:
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4580 invert = 1;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4581 case Z80_CC_M:
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4582 flag = context->flags[ZF_S];
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4583 break;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4584 }
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4585 if (invert) {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4586 flag = !flag;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4587 }
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4588 if (flag) {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4589 after = inst->immed;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4590 }
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4591 } else if (inst->op == Z80_JRCC) {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4592 uint8_t invert = 0;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4593 uint8_t flag = 0;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4594 switch (inst->reg)
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4595 {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4596 case Z80_CC_NZ:
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4597 invert = 1;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4598 case Z80_CC_Z:
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4599 flag = context->flags[ZF_Z];
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4600 break;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4601 case Z80_CC_NC:
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4602 invert = 1;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4603 case Z80_CC_C:
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4604 flag = context->flags[ZF_C];
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4605 break;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4606 }
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4607 if (invert) {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4608 flag = !flag;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4609 }
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4610 if (flag) {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4611 after += inst->immed;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4612 }
2506
b0f314b19964 Some more improvements to Z80 step, next and over commands
Michael Pavone <pavone@retrodev.com>
parents: 2505
diff changeset
4613 } else if (inst->op == Z80_DJNZ) {
b0f314b19964 Some more improvements to Z80 step, next and over commands
Michael Pavone <pavone@retrodev.com>
parents: 2505
diff changeset
4614 if (context->regs[Z80_B] != 1) {
b0f314b19964 Some more improvements to Z80 step, next and over commands
Michael Pavone <pavone@retrodev.com>
parents: 2505
diff changeset
4615 after += inst->immed;
b0f314b19964 Some more improvements to Z80 step, next and over commands
Michael Pavone <pavone@retrodev.com>
parents: 2505
diff changeset
4616 }
2505
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4617 #endif
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4618 } else if(inst->op == Z80_JR) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4619 after += inst->immed;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4620 } else if(inst->op == Z80_RET) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4621 uint8_t *sp = get_native_pointer(context->sp, (void **)context->mem_pointers, &context->Z80_OPTS->gen);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4622 if (sp) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4623 after = *sp;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4624 sp = get_native_pointer((context->sp + 1) & 0xFFFF, (void **)context->mem_pointers, &context->Z80_OPTS->gen);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4625 if (sp) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4626 after |= *sp << 8;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4627 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4628 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4629 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4630 zinsert_breakpoint(context, after, (uint8_t *)zdebugger);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4631 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4632 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4633
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4634 static uint8_t cmd_next_z80(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4635 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4636 z80inst *inst = root->inst;
2506
b0f314b19964 Some more improvements to Z80 step, next and over commands
Michael Pavone <pavone@retrodev.com>
parents: 2505
diff changeset
4637 if (inst->op != Z80_CALL && inst->op != Z80_CALLCC && inst->op != Z80_RST) {
b0f314b19964 Some more improvements to Z80 step, next and over commands
Michael Pavone <pavone@retrodev.com>
parents: 2505
diff changeset
4638 return cmd_step_z80(root, cmd);
b0f314b19964 Some more improvements to Z80 step, next and over commands
Michael Pavone <pavone@retrodev.com>
parents: 2505
diff changeset
4639 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4640 z80_context *context = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4641 uint32_t after = root->after;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4642 zinsert_breakpoint(context, after, (uint8_t *)zdebugger);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4643 return 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4644 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4645
2505
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4646 static uint8_t cmd_over_z80(debug_root *root, parsed_command *cmd)
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4647 {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4648 z80inst *inst = root->inst;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4649 z80_context *context = root->cpu_context;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4650 uint32_t after = root->after;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4651 #ifndef NEW_CORE
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4652 if (inst->op == Z80_JPCC) {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4653 if (inst->immed < after) {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4654 zinsert_breakpoint(context, inst->immed, (uint8_t *)zdebugger);
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4655 return 0;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4656 }
2506
b0f314b19964 Some more improvements to Z80 step, next and over commands
Michael Pavone <pavone@retrodev.com>
parents: 2505
diff changeset
4657 } else if (inst->op == Z80_JRCC || inst->op == Z80_DJNZ) {
2505
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4658 after += inst->immed;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4659 if (after < root->after) {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4660 zinsert_breakpoint(context, after, (uint8_t *)zdebugger);
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4661 return 0;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4662 }
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4663 }
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4664 #endif
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4665 return cmd_next_z80(root, cmd);
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4666 }
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4667
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4668 static uint8_t cmd_backtrace_z80(debug_root *root, parsed_command *cmd)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4669 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4670 z80_context *context = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4671 uint32_t stack = context->sp;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4672 uint8_t non_adr_count = 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4673 do {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4674 uint32_t bt_address = stack;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4675 if (!root->read_mem(root, &bt_address, 'w')) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4676 break;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4677 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4678 bt_address = z80_get_instruction_start(context, bt_address - 1);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4679 if (bt_address != 0xFEEDFEED) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4680 stack += 4;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4681 non_adr_count = 0;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4682 z80inst inst;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4683 char buf[128];
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4684 uint8_t *pc = get_native_pointer(bt_address, (void **)context->mem_pointers, &context->Z80_OPTS->gen);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4685 z80_decode(pc, &inst);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4686 z80_disasm(&inst, buf, bt_address);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4687 printf("%X: %s\n", bt_address, buf);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4688 } else {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4689 //non-return address value on stack can be byte wide
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4690 stack++;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4691 non_adr_count++;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4692 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4693 //TODO: Make sure we don't wander into an invalid memory region
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4694 } while (stack && non_adr_count < 6);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4695 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4696 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4697
2216
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4698 static uint8_t cmd_disassemble_z80(debug_root *root, parsed_command *cmd)
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4699 {
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4700 z80_context *context = root->cpu_context;
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4701 uint32_t address = root->address;
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4702 if (cmd->num_args) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4703 if (!debug_cast_int(cmd->args[0].value, &address)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4704 fprintf(stderr, "Argument to disassemble must be an integer if provided\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4705 return 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4706 }
2216
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4707 }
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4708 char disasm_buf[1024];
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4709 z80inst inst;
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4710 do {
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4711 label_def *def = find_label(root->disasm, address);
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4712 if (def) {
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4713 for (uint32_t i = 0; i < def->num_labels; i++)
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4714 {
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4715 printf("%s:\n", def->labels[i]);
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4716 }
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4717 }
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4718 uint8_t *pc = get_native_pointer(address, (void **)context->mem_pointers, &context->Z80_OPTS->gen);
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4719 uint8_t *after = z80_decode(pc, &inst);
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4720 z80_disasm(&inst, disasm_buf, address);
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4721 address += after - pc;
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4722 printf("\t%s\n", disasm_buf);
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4723 } while(!z80_is_terminal(&inst));
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4724 return 1;
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4725 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
4726 #endif //NEW_CORE
2216
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4727
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4728 static uint8_t cmd_gen_m68k(debug_root *root, parsed_command *cmd)
2185
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4729 {
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4730 char *param = cmd->raw;
2185
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4731 while (param && *param && isblank(*param))
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4732 {
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4733 ++param;
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4734 }
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4735 genesis_context *gen = (genesis_context *)current_system;
2186
935e684f2d58 Fix crash bug in expression parser
Michael Pavone <pavone@retrodev.com>
parents: 2185
diff changeset
4736
2185
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4737 if (param && *param && !isspace(*param)) {
2193
d00fb9c6a6a2 Fix a couple of debugger regressions introduced with changes to support blocks
Michael Pavone <pavone@retrodev.com>
parents: 2191
diff changeset
4738 parsed_command cmd = {0};
2185
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4739 debug_root *m68k_root = find_m68k_root(gen->m68k);
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4740 if (!m68k_root) {
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4741 fputs("Failed to get debug root for M68K\n", stderr);
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4742 return 1;
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4743 }
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4744 if (!parse_command(m68k_root, param, &cmd)) {
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4745 return 1;
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4746 }
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4747 uint8_t ret = run_command(m68k_root, &cmd);
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4748 free_parsed_command(&cmd);
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4749 return ret;
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4750 } else {
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4751 gen->header.enter_debugger = 1;
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4752 return 0;
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4753 }
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4754 }
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4755
2505
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4756 static uint8_t cmd_ym_channel_z80(debug_root *root, parsed_command *cmd)
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4757 {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4758 z80_context *context = root->cpu_context;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4759 genesis_context * gen = context->system;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4760 if (cmd->num_args) {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4761 if (cmd->args[0].value.v.u32 < 1 || cmd->args[0].value.v.u32 > 6) {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4762 printf("%d is not a valid YM2612 channel number. Valid values are 1-6\n", cmd->args[0].value.v.u32);
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4763 return 1;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4764 }
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4765 ym_print_channel_info(gen->ym, cmd->args[0].value.v.u32 - 1);
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4766 } else {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4767 for (int i = 0; i < 6; i++) {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4768 ym_print_channel_info(gen->ym, i);
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4769 }
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4770 }
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4771 return 1;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4772 }
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4773
2198
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4774 static uint8_t cmd_vdp_sprites_sms(debug_root *root, parsed_command *cmd)
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4775 {
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4776 z80_context *context = root->cpu_context;
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4777 sms_context * sms = context->system;
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4778 vdp_print_sprite_table(sms->vdp);
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4779 return 1;
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4780 }
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4781
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4782 static uint8_t cmd_vdp_regs_sms(debug_root *root, parsed_command *cmd)
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4783 {
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4784 z80_context *context = root->cpu_context;
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4785 sms_context * sms = context->system;
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4786 vdp_print_reg_explain(sms->vdp);
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4787 return 1;
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4788 }
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4789
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4790 command_def z80_commands[] = {
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
4791 #ifndef NEW_CORE
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4792 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4793 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4794 "breakpoint", "b", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4795 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4796 .usage = "breakpoint ADDRESSS",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4797 .desc = "Set a breakpoint at ADDRESS",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4798 .impl = cmd_breakpoint_z80,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4799 .min_args = 1,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4800 .max_args = 1
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4801 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4802 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4803 .names = (const char *[]){
2400
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4804 "watchpoint", NULL
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4805 },
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4806 .usage = "watchpoint ADDRESS [SIZE]",
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4807 .desc = "Set a watchpoint at ADDRESS with an optional SIZE in bytes. SIZE defaults to 1",
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4808 .impl = cmd_watchpoint_z80,
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4809 .min_args = 1,
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4810 .max_args = 2
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4811 },
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4812 {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
4813 .names = (const char *[]){
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4814 "advance", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4815 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4816 .usage = "advance ADDRESS",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4817 .desc = "Advance to ADDRESS",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4818 .impl = cmd_advance_z80,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4819 .min_args = 1,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4820 .max_args = 1
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4821 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4822 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4823 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4824 "step", "s", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4825 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4826 .usage = "step",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4827 .desc = "Advance to the next instruction, stepping into subroutines",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4828 .impl = cmd_step_z80,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4829 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4830 .max_args = 0
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4831 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4832 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4833 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4834 "over", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4835 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4836 .usage = "over",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4837 .desc = "Advance to the next instruction, ignoring branches to lower addresses",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4838 .impl = cmd_over_z80,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4839 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4840 .max_args = 0
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4841 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4842 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4843 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4844 "next", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4845 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4846 .usage = "next",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4847 .desc = "Advance to the next instruction",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4848 .impl = cmd_next_z80,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4849 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4850 .max_args = 0
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4851 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4852 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4853 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4854 "backtrace", "bt", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4855 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4856 .usage = "backtrace",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4857 .desc = "Print a backtrace",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4858 .impl = cmd_backtrace_z80,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4859 .min_args = 0,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4860 .max_args = 0
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4861 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4862 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4863 .names = (const char *[]){
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4864 "delete", "d", NULL
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4865 },
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4866 .usage = "delete BREAKPOINT",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4867 .desc = "Remove breakpoint identified by BREAKPOINT",
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4868 .impl = cmd_delete_z80,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4869 .min_args = 1,
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4870 .max_args = 1
2216
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4871 },
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4872 {
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4873 .names = (const char *[]){
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4874 "disassemble", "disasm", NULL
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4875 },
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4876 .usage = "disassemble [ADDRESS]",
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4877 .desc = "Disassemble code starting at ADDRESS if provided or the current address if not",
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4878 .impl = cmd_disassemble_z80,
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4879 .min_args = 0,
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
4880 .max_args = 1
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4881 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
4882 #endif //NEW_CORE
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4883 };
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4884
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4885 #define NUM_Z80 (sizeof(z80_commands)/sizeof(*z80_commands))
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4886
2185
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4887 command_def gen_z80_commands[] = {
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4888 {
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4889 .names = (const char *[]){
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4890 "m68k", NULL
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4891 },
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4892 .usage = "m68k [COMMAND]",
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4893 .desc = "Run a M68K debugger command or switch to M68K context when no command is given",
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4894 .impl = cmd_gen_m68k,
2185
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4895 .min_args = 0,
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4896 .max_args = -1,
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
4897 .raw_args = 1
2505
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4898 },
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4899 {
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4900 .names = (const char *[]){
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4901 "ymchannel", NULL
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4902 },
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4903 .usage = "ymchannel [CHANNEL]",
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4904 .desc = "Print YM-2612 channel and operator params. Limited to CHANNEL if specified",
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4905 .impl = cmd_ym_channel_z80,
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4906 .min_args = 0,
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
4907 .max_args = 1
2185
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4908 }
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4909 };
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4910
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4911 #define NUM_GEN_Z80 (sizeof(gen_z80_commands)/sizeof(*gen_z80_commands))
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
4912
2198
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4913 command_def sms_commands[] = {
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4914 {
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4915 .names = (const char *[]){
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4916 "vdpsprites", "vs", NULL
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4917 },
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4918 .usage = "vdpsprites",
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4919 .desc = "Print the VDP sprite table",
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4920 .impl = cmd_vdp_sprites_sms,
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4921 .min_args = 0,
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4922 .max_args = 0
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4923 },
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4924 {
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4925 .names = (const char *[]){
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4926 "vdpsregs", "vr", NULL
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4927 },
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4928 .usage = "vdpregs",
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4929 .desc = "Print VDP register values with a short description",
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4930 .impl = cmd_vdp_regs_sms,
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4931 .min_args = 0,
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4932 .max_args = 0
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4933 }
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4934 };
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4935
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4936 #define NUM_SMS (sizeof(sms_commands)/sizeof(*sms_commands))
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
4937
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4938 #endif
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4939
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4940 void add_commands(debug_root *root, command_def *defs, uint32_t num_commands)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4941 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4942 for (uint32_t i = 0; i < num_commands; i++)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4943 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4944 for (int j = 0; defs[i].names[j]; j++)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4945 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4946 root->commands = tern_insert_ptr(root->commands, defs[i].names[j], defs + i);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4947 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4948 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4949 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4950
2214
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4951 static void symbol_map(char *key, tern_val val, uint8_t valtype, void *data)
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4952 {
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4953 debug_root *root = data;
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4954 label_def *label = val.ptrval;
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4955 for (uint32_t i = 0; i < label->num_labels; i++)
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4956 {
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4957 root->symbols = tern_insert_int(root->symbols, label->labels[i], label->full_address);
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4958 }
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4959 }
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4960
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4961 static debug_val debug_frame_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4962 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4963 vdp_context *vdp = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4964 return debug_int(vdp->frame);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4965 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4966
2393
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4967 static uint32_t m68k_chunk_end(debug_root *root, uint32_t start_address)
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4968 {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4969 m68k_context *m68k = root->cpu_context;
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2459
diff changeset
4970 memmap_chunk const *chunk = find_map_chunk(start_address, &m68k->opts->gen, 0, NULL);
2393
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4971 if (!chunk) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4972 return start_address;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4973 }
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2459
diff changeset
4974 if (chunk->mask == m68k->opts->gen.address_mask) {
2393
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4975 return chunk->end;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4976 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4977 return (start_address & ~chunk->mask) + chunk->mask + 1;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4978 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4979
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4980 debug_root *find_m68k_root(m68k_context *context)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4981 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4982 debug_root *root = find_root(context);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4983 if (root && !root->commands) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4984 add_commands(root, common_commands, NUM_COMMON);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4985 add_commands(root, m68k_commands, NUM_68K);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4986 root->read_mem = read_m68k;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4987 root->write_mem = write_m68k;
2393
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
4988 root->chunk_end = m68k_chunk_end;
2214
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
4989 root->disasm = create_68000_disasm();
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4990 m68k_names(root);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
4991 debug_var *var;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4992 switch (current_system->type)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4993 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4994 case SYSTEM_GENESIS:
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4995 case SYSTEM_SEGACD:
2459
cb62730d5c99 Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents: 2422
diff changeset
4996 case SYSTEM_PICO:
cb62730d5c99 Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents: 2422
diff changeset
4997 case SYSTEM_COPERA:
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4998 //check if this is the main CPU
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
4999 if (context->system == current_system) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5000 genesis_context *gen = context->system;
2459
cb62730d5c99 Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents: 2422
diff changeset
5001 if (current_system->type == SYSTEM_GENESIS || current_system->type == SYSTEM_SEGACD) {
cb62730d5c99 Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents: 2422
diff changeset
5002 root->other_roots = tern_insert_ptr(root->other_roots, "z80", find_z80_root(gen->z80));
cb62730d5c99 Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents: 2422
diff changeset
5003 root->other_roots = tern_insert_ptr(root->other_roots, "io", find_io_root(&gen->io));
cb62730d5c99 Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents: 2422
diff changeset
5004 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5005 root->other_roots = tern_insert_ptr(root->other_roots, "vdp", find_vdp_root(gen->vdp));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5006 root->other_roots = tern_insert_ptr(root->other_roots, "psg", find_psg_root(gen->psg));
2459
cb62730d5c99 Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents: 2422
diff changeset
5007 uint32_t num_commands = NUM_GENESIS;
cb62730d5c99 Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents: 2422
diff changeset
5008 if (current_system->type == SYSTEM_PICO || current_system->type == SYSTEM_COPERA) {
cb62730d5c99 Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents: 2422
diff changeset
5009 num_commands -= 3;
cb62730d5c99 Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents: 2422
diff changeset
5010 } else {
cb62730d5c99 Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents: 2422
diff changeset
5011 root->other_roots = tern_insert_ptr(root->other_roots, "ym", find_ym2612_root(gen->ym));
cb62730d5c99 Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents: 2422
diff changeset
5012 }
cb62730d5c99 Initial work on Copera emulation
Michael Pavone <pavone@retrodev.com>
parents: 2422
diff changeset
5013 add_commands(root, genesis_commands, num_commands);
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5014 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5015 var->get = debug_frame_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5016 var->ptr = gen->vdp;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5017 root->variables = tern_insert_ptr(root->variables, "frame", var);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5018 if (current_system->type == SYSTEM_SEGACD) {
2214
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
5019 add_segacd_maincpu_labels(root->disasm);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5020 add_commands(root, scd_main_commands, NUM_SCD_MAIN);
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5021 segacd_context *scd = gen->expansion;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5022 root->other_roots = tern_insert_ptr(root->other_roots, "sub", find_m68k_root(scd->m68k));
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5023 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5024 break;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5025 } else {
2214
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
5026 add_segacd_subcpu_labels(root->disasm);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5027 add_commands(root, scd_sub_commands, NUM_SCD_SUB);
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5028 segacd_context *scd = context->system;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5029 root->other_roots = tern_insert_ptr(root->other_roots, "main", find_m68k_root(scd->genesis->m68k));
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5030 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5031 default:
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5032 break;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5033 }
2214
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
5034 tern_foreach(root->disasm->labels, symbol_map, root);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5035 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5036 return root;
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
5037 }
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
5038
2720
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5039 static uint8_t read_upd_byte(upd78k2_context *upd, uint32_t address)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5040 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5041 if (address > 0xFE00 && address < 0xFF00) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5042 return upd->iram[address & 0xFF];
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5043 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5044 return read_byte(address, (void **)upd->mem_pointers, &upd->opts->gen, upd);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5045 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5046
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5047 static uint8_t read_upd(debug_root *root, uint32_t *out, char size)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5048 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5049 upd78k2_context *upd = root->cpu_context;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5050 uint32_t address = *out;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5051 *out = read_upd_byte(upd, address);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5052 if (size != 'b') {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5053 *out |= read_upd_byte(upd, address + 1) << 8;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5054 if (size == 'l') {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5055 *out |= read_upd_byte(upd, address + 2) << 16;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5056 *out |= read_upd_byte(upd, address + 3) << 24;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5057 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5058 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5059 return 1;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5060 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5061
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5062 static void write_upd_byte(upd78k2_context *upd, uint32_t address, uint8_t value)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5063 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5064 if (address > 0xFE00 && address < 0xFF00) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5065 upd->iram[address & 0xFF] = value;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5066 } else {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5067 write_byte(address, value, (void **)upd->mem_pointers, &upd->opts->gen, upd);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5068 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5069 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5070
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5071 static uint8_t write_upd(debug_root *root, uint32_t address, uint32_t value, char size)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5072 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5073 upd78k2_context *upd = root->cpu_context;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5074 write_upd_byte(upd, address, value);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5075 if (size != 'b') {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5076 write_upd_byte(upd, address + 1, value >> 8);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5077 if (size == 'l') {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5078 write_upd_byte(upd, address + 2, value >> 16);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5079 write_upd_byte(upd, address + 3, value >> 24);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5080 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5081 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5082 return 1;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5083 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5084
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5085 static uint32_t upd_chunk_end(debug_root *root, uint32_t start_address)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5086 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5087 upd78k2_context *upd = root->cpu_context;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5088 memmap_chunk const *chunk = find_map_chunk(start_address, &upd->opts->gen, 0, NULL);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5089 if (!chunk) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5090 return start_address;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5091 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5092 if (chunk->mask == upd->opts->gen.address_mask) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5093 return chunk->end;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5094 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5095 return (start_address & ~chunk->mask) + chunk->mask + 1;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5096 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5097
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5098 static debug_val upd_reg_get(debug_var *var)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5099 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5100 upd78k2_context *upd = var->ptr;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5101 return debug_int(upd->main[var->val.v.u32]);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5102 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5103
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5104 static void upd_reg_set(debug_var *var, debug_val val)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5105 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5106 upd78k2_context *upd = var->ptr;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5107 uint32_t ival;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5108 if (!debug_cast_int(val, &ival)) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5109 static const char regs[] = "xacbedlh";
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5110 fprintf(stderr, "uPD78K/II register %c can only be set to an integer\n", regs[var->val.v.u32]);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5111 return;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5112 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5113 upd->main[var->val.v.u32] = ival;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5114 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5115
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5116 static debug_val upd_regpair_get(debug_var *var)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5117 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5118 upd78k2_context *upd = var->ptr;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5119 uint16_t val = upd->main[var->val.v.u32 * 2];
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5120 val |= upd->main[var->val.v.u32 * 2 + 1] << 8;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5121 return debug_int(val);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5122 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5123
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5124 static void upd_regpair_set(debug_var *var, debug_val val)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5125 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5126 upd78k2_context *upd = var->ptr;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5127 uint32_t ival;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5128 if (!debug_cast_int(val, &ival)) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5129 static const char regs[] = "xacbedlh";
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5130 fprintf(stderr, "uPD78K/II register %c can only be set to an integer\n", regs[var->val.v.u32]);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5131 return;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5132 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5133 upd->main[var->val.v.u32 * 2] = ival;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5134 upd->main[var->val.v.u32 * 2 + 1] = ival >> 8;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5135 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5136
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5137 debug_root *find_upd_root(upd78k2_context *upd)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5138 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5139 debug_root *root = find_root(upd);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5140 if (root && !root->commands) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5141 add_commands(root, common_commands, NUM_COMMON);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5142 root->read_mem = read_upd;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5143 root->write_mem = write_upd;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5144 root->chunk_end = upd_chunk_end;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5145 root->disasm = create_upd78k2_disasm();
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5146 static const char *regs[] = {"x","a","c","b","e","d","l","h"};
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5147 static const char *regpairs[] = {"ax", "bc", "de", "hl"};
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5148 debug_var *var;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5149 for (int i = 0; i < sizeof(regs)/sizeof(*regs); i++)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5150 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5151 var = calloc(1, sizeof(debug_var));
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5152 var->get = upd_reg_get;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5153 var->set = upd_reg_set;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5154 var->ptr = root->cpu_context;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5155 var->val.v.u32 = i;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5156 root->variables = tern_insert_ptr(root->variables, regs[i], var);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5157 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5158 for (int i = 0; i < sizeof(regpairs)/sizeof(*regpairs); i++)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5159 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5160 var = calloc(1, sizeof(debug_var));
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5161 var->get = upd_regpair_get;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5162 var->set = upd_regpair_set;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5163 var->ptr = root->cpu_context;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5164 var->val.v.u32 = i;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5165 root->variables = tern_insert_ptr(root->variables, regpairs[i], var);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5166 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5167 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5168 return root;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5169 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5170
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
5171 #ifndef NO_Z80
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5172 #ifdef NEW_CORE
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5173 #define Z80_OPTS opts
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5174 #else
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5175 #define Z80_OPTS options
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5176 #endif
548
a3afee2271ce Initial work on the x86-32 target
Michael Pavone <pavone@retrodev.com>
parents: 525
diff changeset
5177
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5178 static uint8_t read_z80(debug_root *root, uint32_t *out, char size)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5179 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5180 z80_context *context = root->cpu_context;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5181 uint32_t address = *out;
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5182 *out = read_byte(address, (void **)context->mem_pointers, &context->Z80_OPTS->gen, context);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5183 if (size == 'w') {
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5184 *out |= read_byte(address + 1, (void **)context->mem_pointers, &context->Z80_OPTS->gen, context) << 8;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5185 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5186 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5187 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5188
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5189 static uint8_t write_z80(debug_root *root, uint32_t address, uint32_t value, char size)
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5190 {
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5191 z80_context *context = root->cpu_context;
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5192 write_byte(address, value, (void **)context->mem_pointers, &context->Z80_OPTS->gen, context);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5193 if (size == 'w') {
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5194 write_byte(address + 1, value >> 8, (void **)context->mem_pointers, &context->Z80_OPTS->gen, context);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5195 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5196 return 1;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5197 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5198
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5199 #ifndef NEW_CORE
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5200 static debug_val z80_reg8_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5201 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5202 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5203 return debug_int(context->regs[var->val.v.u32]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5204 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5205
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5206 static void z80_reg8_set(debug_var *var, debug_val val)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5207 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5208 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5209 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5210 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5211 fprintf(stderr, "Z80 register %s can only be set to an integer\n", z80_regs[var->val.v.u32]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5212 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5213 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5214 context->regs[var->val.v.u32] = ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5215 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5216
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5217
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5218 static debug_val z80_alt_reg8_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5219 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5220 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5221 return debug_int(context->alt_regs[var->val.v.u32]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5222 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5223
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5224 static void z80_alt_reg8_set(debug_var *var, debug_val val)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5225 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5226 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5227 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5228 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5229 fprintf(stderr, "Z80 register %s' can only be set to an integer\n", z80_regs[var->val.v.u32]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5230 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5231 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5232 context->alt_regs[var->val.v.u32] = ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5233 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5234
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5235 static debug_val z80_flags_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5236 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5237 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5238 debug_val ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5239 ret.type = DBG_VAL_U32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5240 ret.v.u32 = context->flags[ZF_S] << 7;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5241 ret.v.u32 |= context->flags[ZF_Z] << 6;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5242 ret.v.u32 |= context->flags[ZF_H] << 4;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5243 ret.v.u32 |= context->flags[ZF_PV] << 2;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5244 ret.v.u32 |= context->flags[ZF_N] << 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5245 ret.v.u32 |= context->flags[ZF_C];
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5246 return ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5247 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5248
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5249 static debug_val z80_alt_flags_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5250 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5251 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5252 debug_val ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5253 ret.type = DBG_VAL_U32;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5254 ret.v.u32 = context->alt_flags[ZF_S] << 7;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5255 ret.v.u32 |= context->alt_flags[ZF_Z] << 6;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5256 ret.v.u32 |= context->alt_flags[ZF_H] << 4;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5257 ret.v.u32 |= context->alt_flags[ZF_PV] << 2;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5258 ret.v.u32 |= context->alt_flags[ZF_N] << 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5259 ret.v.u32 |= context->alt_flags[ZF_C];
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5260 return ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5261 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5262
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5263 static void z80_flags_set(debug_var *var, debug_val val)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5264 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5265 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5266 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5267 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5268 fprintf(stderr, "Z80 register F can only be set to an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5269 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5270 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5271 context->flags[ZF_S] = ival >> 7 & 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5272 context->flags[ZF_Z] = ival >> 6 & 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5273 context->flags[ZF_H] = ival >> 4 & 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5274 context->flags[ZF_PV] = ival >> 2 & 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5275 context->flags[ZF_N] = ival >> 1 & 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5276 context->flags[ZF_C] = ival & 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5277 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5278
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5279 static void z80_alt_flags_set(debug_var *var, debug_val val)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5280 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5281 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5282 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5283 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5284 fprintf(stderr, "Z80 register F' can only be set to an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5285 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5286 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5287 context->alt_flags[ZF_S] = ival >> 7 & 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5288 context->alt_flags[ZF_Z] = ival >> 6 & 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5289 context->alt_flags[ZF_H] = ival >> 4 & 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5290 context->alt_flags[ZF_PV] = ival >> 2 & 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5291 context->alt_flags[ZF_N] = ival >> 1 & 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5292 context->alt_flags[ZF_C] = ival & 1;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5293 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5294
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5295 static debug_val z80_regpair_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5296 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5297 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5298 debug_val ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5299 if (var->val.v.u32 == Z80_AF) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5300 ret = z80_flags_get(var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5301 ret.v.u32 |= context->regs[Z80_A] << 8;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5302 } else {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5303 ret = debug_int(context->regs[z80_high_reg(var->val.v.u32)] << 8 | context->regs[z80_low_reg(var->val.v.u32)]);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5304 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5305 return ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5306 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5307
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5308 static void z80_regpair_set(debug_var *var, debug_val val)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5309 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5310 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5311 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5312 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5313 fprintf(stderr, "Z80 register %s can only be set to an integer\n", z80_regs[var->val.v.u32]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5314 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5315 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5316 if (var->val.v.u32 == Z80_AF) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5317 context->regs[Z80_A] = ival >> 8;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5318 z80_flags_set(var, val);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5319 } else {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5320 context->regs[z80_high_reg(var->val.v.u32)] = ival >> 8;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5321 context->regs[z80_low_reg(var->val.v.u32)] = ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5322 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5323 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5324
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5325 static debug_val z80_alt_regpair_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5326 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5327 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5328 debug_val ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5329 if (var->val.v.u32 == Z80_AF) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5330 ret = z80_alt_flags_get(var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5331 ret.v.u32 |= context->alt_regs[Z80_A] << 8;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5332 } else {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5333 ret = debug_int(context->alt_regs[z80_high_reg(var->val.v.u32)] << 8 | context->alt_regs[z80_low_reg(var->val.v.u32)]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5334 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5335 return ret;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5336 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5337
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5338 static void z80_alt_regpair_set(debug_var *var, debug_val val)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5339 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5340 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5341 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5342 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5343 fprintf(stderr, "Z80 register %s' can only be set to an integer\n", z80_regs[var->val.v.u32]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5344 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5345 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5346 if (var->val.v.u32 == Z80_AF) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5347 context->regs[Z80_A] = ival >> 8;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5348 z80_alt_flags_set(var, val);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5349 } else {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5350 context->alt_regs[z80_high_reg(var->val.v.u32)] = ival >> 8;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5351 context->alt_regs[z80_low_reg(var->val.v.u32)] = ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5352 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5353 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5354
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5355 static debug_val z80_sp_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5356 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5357 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5358 return debug_int(context->sp);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5359 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5360
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5361 static void z80_sp_set(debug_var *var, debug_val val)
2198
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
5362 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5363 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5364 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5365 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5366 fprintf(stderr, "Z80 register sp can only be set to an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5367 return;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5368 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5369 context->sp = ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5370 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5371
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5372 static debug_val z80_im_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5373 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5374 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5375 return debug_int(context->im);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5376 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5377
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5378 static void z80_im_set(debug_var *var, debug_val val)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5379 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5380 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5381 uint32_t ival;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5382 if (!debug_cast_int(val, &ival)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5383 fprintf(stderr, "Z80 register im can only be set to an integer\n");
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5384 return;
2198
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
5385 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5386 context->im = ival & 3;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5387 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5388
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5389 static debug_val z80_iff1_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5390 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5391 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5392 return debug_int(context->iff1);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5393 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5394
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5395 static void z80_iff1_set(debug_var *var, debug_val val)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5396 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5397 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5398 context->iff1 = debug_cast_bool(val);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5399 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5400
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5401 static debug_val z80_iff2_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5402 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5403 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5404 return debug_int(context->iff2);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5405 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5406
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5407 static void z80_iff2_set(debug_var *var, debug_val val)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5408 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5409 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5410 context->iff2 = debug_cast_bool(val);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5411 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5412
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5413 static debug_val z80_cycle_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5414 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5415 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5416 return debug_int(context->current_cycle);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5417 }
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5418
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5419 static debug_val z80_pc_get(debug_var *var)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5420 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5421 z80_context *context = var->ptr;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5422 return debug_int(context->pc);
2198
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
5423 }
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
5424
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5425 static void z80_names(debug_root *root)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5426 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5427 debug_var *var;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5428 for (int i = 0; i < Z80_UNUSED; i++)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5429 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5430 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5431 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5432 if (i < Z80_BC) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5433 var->get = z80_reg8_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5434 var->set = z80_reg8_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5435 } else if (i == Z80_SP) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5436 var->get = z80_sp_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5437 var->set = z80_sp_set;
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5438 } else {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5439 var->get = z80_regpair_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5440 var->set = z80_regpair_set;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5441 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5442 var->val.v.u32 = i;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5443 root->variables = tern_insert_ptr(root->variables, z80_regs[i], var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5444 size_t name_size = strlen(z80_regs[i]);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5445 char *name = malloc(name_size + 2);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5446 char *d = name;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5447 for (const char *c = z80_regs[i]; *c; c++, d++)
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5448 {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5449 *d = toupper(*c);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5450 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5451 name[name_size] = 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5452 root->variables = tern_insert_ptr(root->variables, name, var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5453
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5454 if (i < Z80_IXL || (i > Z80_R && i < Z80_IX && i != Z80_SP)) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5455 memcpy(name, z80_regs[i], name_size);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5456 name[name_size] = '\'';
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5457 name[name_size + 1] = 0;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5458 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5459 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5460 if (i < Z80_BC) {
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5461 var->get = z80_alt_reg8_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5462 var->set = z80_alt_reg8_set;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5463 } else {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5464 var->get = z80_alt_regpair_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5465 var->set = z80_alt_regpair_set;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5466 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5467 var->val.v.u32 = i;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5468 root->variables = tern_insert_ptr(root->variables, name, var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5469 d = name;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5470 for (const char *c = z80_regs[i]; *c; c++, d++)
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5471 {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5472 *d = toupper(*c);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5473 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5474 root->variables = tern_insert_ptr(root->variables, name, var);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5475 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5476 free(name);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5477 }
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5478 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5479 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5480 var->get = z80_flags_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5481 var->set = z80_flags_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5482 root->variables = tern_insert_ptr(root->variables, "f", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5483 root->variables = tern_insert_ptr(root->variables, "F", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5484 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5485 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5486 var->get = z80_alt_flags_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5487 var->set = z80_alt_flags_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5488 root->variables = tern_insert_ptr(root->variables, "f'", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5489 root->variables = tern_insert_ptr(root->variables, "F'", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5490 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5491 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5492 var->get = z80_im_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5493 var->set = z80_im_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5494 root->variables = tern_insert_ptr(root->variables, "im", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5495 root->variables = tern_insert_ptr(root->variables, "IM", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5496 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5497 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5498 var->get = z80_iff1_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5499 var->set = z80_iff1_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5500 root->variables = tern_insert_ptr(root->variables, "iff1", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5501 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5502 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5503 var->get = z80_iff2_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5504 var->set = z80_iff2_set;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5505 root->variables = tern_insert_ptr(root->variables, "iff2", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5506 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5507 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5508 var->get = z80_cycle_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5509 root->variables = tern_insert_ptr(root->variables, "cycle", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5510 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5511 var->ptr = root->cpu_context;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5512 var->get = z80_pc_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5513 root->variables = tern_insert_ptr(root->variables, "pc", var);
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5514 root->variables = tern_insert_ptr(root->variables, "PC", var);
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5515 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5516 #endif //NEW_CORE
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5517
2393
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
5518 static uint32_t z80_chunk_end(debug_root *root, uint32_t start_address)
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
5519 {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
5520 z80_context *z80 = root->cpu_context;
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5521 memmap_chunk const *chunk = find_map_chunk(start_address, &z80->Z80_OPTS->gen, 0, NULL);
2393
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
5522 if (!chunk) {
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
5523 return start_address;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
5524 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5525 if (chunk->mask == z80->Z80_OPTS->gen.address_mask) {
2393
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
5526 return chunk->end;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
5527 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
5528 return (start_address & ~chunk->mask) + chunk->mask + 1;
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
5529 }
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
5530
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5531 debug_root *find_z80_root(z80_context *context)
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5532 {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5533 debug_root *root = find_root(context);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5534 if (root && !root->commands) {
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5535 add_commands(root, common_commands, NUM_COMMON);
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5536 add_commands(root, z80_commands, NUM_Z80);
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5537 #ifndef NEW_CORE
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5538 z80_names(root);
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5539 #endif
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5540 genesis_context *gen;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5541 sms_context *sms;
2413
64cf80e683aa Initial support for Colecovision emulation
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
5542 coleco_context *coleco;
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5543 debug_var *var;
2198
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
5544 switch (current_system->type)
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
5545 {
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
5546 case SYSTEM_GENESIS:
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
5547 case SYSTEM_SEGACD:
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5548 gen = context->system;
2185
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
5549 add_commands(root, gen_z80_commands, NUM_GEN_Z80);
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5550 root->other_roots = tern_insert_ptr(root->other_roots, "m68k", find_m68k_root(gen->m68k));
2505
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
5551 root->other_roots = tern_insert_ptr(root->other_roots, "io", find_io_root(&gen->io));
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
5552 root->other_roots = tern_insert_ptr(root->other_roots, "vdp", find_vdp_root(gen->vdp));
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
5553 root->other_roots = tern_insert_ptr(root->other_roots, "psg", find_psg_root(gen->psg));
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
5554 root->other_roots = tern_insert_ptr(root->other_roots, "ym", find_ym2612_root(gen->ym));
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
5555 var = calloc(1, sizeof(debug_var));
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
5556 var->get = debug_frame_get;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
5557 var->ptr = gen->vdp;
927083238a39 Z80 debugger improvements
Michael Pavone <pavone@retrodev.com>
parents: 2500
diff changeset
5558 root->variables = tern_insert_ptr(root->variables, "frame", var);
2198
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
5559 break;
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
5560 case SYSTEM_SMS:
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5561 sms = context->system;
2198
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
5562 add_commands(root, sms_commands, NUM_SMS);
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5563 root->other_roots = tern_insert_ptr(root->other_roots, "vdp", find_vdp_root(sms->vdp));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5564 root->other_roots = tern_insert_ptr(root->other_roots, "psg", find_psg_root(sms->psg));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5565 var = calloc(1, sizeof(debug_var));
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5566 var->get = debug_frame_get;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5567 var->ptr = sms->vdp;
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5568 root->variables = tern_insert_ptr(root->variables, "frame", var);
2198
0dcb9e4dee7f Give SMS debugger a bit more parity to the Genesis one
Michael Pavone <pavone@retrodev.com>
parents: 2193
diff changeset
5569 break;
2413
64cf80e683aa Initial support for Colecovision emulation
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
5570 case SYSTEM_COLECOVISION:
64cf80e683aa Initial support for Colecovision emulation
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
5571 coleco = context->system;
64cf80e683aa Initial support for Colecovision emulation
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
5572 root->other_roots = tern_insert_ptr(root->other_roots, "vdp", find_vdp_root(coleco->vdp));
64cf80e683aa Initial support for Colecovision emulation
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
5573 root->other_roots = tern_insert_ptr(root->other_roots, "psg", find_psg_root(coleco->psg));
64cf80e683aa Initial support for Colecovision emulation
Michael Pavone <pavone@retrodev.com>
parents: 2400
diff changeset
5574 break;
2185
3d2cc2af1da3 Add an m68k command for switching back to 68K debugger from Z80
Michael Pavone <pavone@retrodev.com>
parents: 2184
diff changeset
5575 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5576 root->read_mem = read_z80;
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5577 root->write_mem = write_z80;
2216
4e27c36f947c Add disassemble command to debugger
Michael Pavone <pavone@retrodev.com>
parents: 2214
diff changeset
5578 root->disasm = create_z80_disasm();
2393
5f4917b9ecfa Add debugger save command
Michael Pavone <pavone@retrodev.com>
parents: 2386
diff changeset
5579 root->chunk_end = z80_chunk_end;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5580 }
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5581 return root;
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5582 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5583
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5584 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
5585 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5586 static char last_cmd[1024];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5587 char input_buf[1024];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5588 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
5589 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
5590 init_terminal();
2180
b87658ba3b94 Fix bug in Z80 debugger for SMS mode post-refactor
Michael Pavone <pavone@retrodev.com>
parents: 2179
diff changeset
5591 debug_root *root = find_z80_root(context);
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
5592 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
5593 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
5594 }
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
5595 root->address = address;
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5596 //Check if this is a user set breakpoint, or just a temporary one
2400
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5597 int debugging;
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
5598 bp_def ** this_bp = find_breakpoint(&root->breakpoints, address, BP_TYPE_CPU);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5599 if (*this_bp) {
2182
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5600 if ((*this_bp)->condition) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5601 debug_val condres;
2182
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5602 if (eval_expr(root, (*this_bp)->condition, &condres)) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5603 if (!condres.v.u32) {
2182
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5604 return context;
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5605 }
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5606 } else {
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5607 fprintf(stderr, "Failed to eval condition for Z80 breakpoint %u\n", (*this_bp)->index);
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5608 free_expr((*this_bp)->condition);
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5609 (*this_bp)->condition = NULL;
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5610 }
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5611 }
2400
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5612 debugging = 1;
2208
3809a0bd680e Fix a couple of Z80 debugger issues
Michael Pavone <pavone@retrodev.com>
parents: 2198
diff changeset
5613 for (uint32_t i = 0; debugging && i < (*this_bp)->num_commands; i++)
3809a0bd680e Fix a couple of Z80 debugger issues
Michael Pavone <pavone@retrodev.com>
parents: 2198
diff changeset
5614 {
3809a0bd680e Fix a couple of Z80 debugger issues
Michael Pavone <pavone@retrodev.com>
parents: 2198
diff changeset
5615 debugging = run_command(root, (*this_bp)->commands + i);
3809a0bd680e Fix a couple of Z80 debugger issues
Michael Pavone <pavone@retrodev.com>
parents: 2198
diff changeset
5616 }
3809a0bd680e Fix a couple of Z80 debugger issues
Michael Pavone <pavone@retrodev.com>
parents: 2198
diff changeset
5617 if (debugging) {
3809a0bd680e Fix a couple of Z80 debugger issues
Michael Pavone <pavone@retrodev.com>
parents: 2198
diff changeset
5618 printf("Z80 Breakpoint %d hit\n", (*this_bp)->index);
3809a0bd680e Fix a couple of Z80 debugger issues
Michael Pavone <pavone@retrodev.com>
parents: 2198
diff changeset
5619 } else {
2400
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5620 fflush(stdout);
2208
3809a0bd680e Fix a couple of Z80 debugger issues
Michael Pavone <pavone@retrodev.com>
parents: 2198
diff changeset
5621 return context;
3809a0bd680e Fix a couple of Z80 debugger issues
Michael Pavone <pavone@retrodev.com>
parents: 2198
diff changeset
5622 }
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5623 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5624 zremove_breakpoint(context, address);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5625 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5626 #ifndef NEW_CORE
2400
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5627 if (context->wp_hit) {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5628 context->wp_hit = 0;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5629 this_bp = find_breakpoint(&root->breakpoints, context->wp_hit_address, BP_TYPE_CPU_WATCH);
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5630 if (*this_bp) {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5631 if ((*this_bp)->condition) {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5632 debug_val condres;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5633 if (eval_expr(root, (*this_bp)->condition, &condres)) {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5634 if (!condres.v.u32) {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5635 return context;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5636 }
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5637 } else {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5638 fprintf(stderr, "Failed to eval condition for Z80 watchpoint %u\n", (*this_bp)->index);
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5639 free_expr((*this_bp)->condition);
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5640 (*this_bp)->condition = NULL;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5641 }
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5642 }
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5643 debugging = 1;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5644 for (uint32_t i = 0; debugging && i < (*this_bp)->num_commands; i++)
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5645 {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5646 debugging = run_command(root, (*this_bp)->commands + i);
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5647 }
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5648 if (debugging) {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5649 if (context->wp_old_value != context->wp_hit_value) {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5650 printf("Z80 Watchpoint %d hit, old value: %X, new value %X\n", (*this_bp)->index, context->wp_old_value, context->wp_hit_value);
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5651 } else {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5652 printf("Z80 Watchpoint %d hit\n", (*this_bp)->index);
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5653 }
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5654 } else {
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5655 fflush(stdout);
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5656 return context;
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5657 }
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5658 }
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5659 }
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5660 #endif
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
5661 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
5662 if (!pc) {
6b5c92b6205c Enabled Z80 debugger in PBC mode
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
5663 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
5664 }
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
5665 uint8_t * after_pc = z80_decode(pc, &inst);
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
5666 uint16_t after = address + (after_pc-pc);
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
5667 root->after = after;
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
5668 root->inst = &inst;
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
5669 for (disp_def * cur = root->displays; cur; cur = cur->next) {
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
5670 char format_str[8];
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
5671 make_format_str(format_str, cur->format);
2183
eb2e0e61b1b4 Fix stale values in display
Michael Pavone <pavone@retrodev.com>
parents: 2182
diff changeset
5672 for (int i = 0; i < cur->num_args; i++)
eb2e0e61b1b4 Fix stale values in display
Michael Pavone <pavone@retrodev.com>
parents: 2182
diff changeset
5673 {
eb2e0e61b1b4 Fix stale values in display
Michael Pavone <pavone@retrodev.com>
parents: 2182
diff changeset
5674 eval_expr(root, cur->args[i].parsed, &cur->args[i].value);
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
5675 do_print(root, format_str, cur->args[i].raw, cur->args[i].value);
2183
eb2e0e61b1b4 Fix stale values in display
Michael Pavone <pavone@retrodev.com>
parents: 2182
diff changeset
5676 }
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5677 }
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
5678
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5679 z80_disasm(&inst, input_buf, address);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5680 printf("%X:\t%s\n", address, input_buf);
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
5681 debugger_repl(root);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5682 return context;
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5683 }
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5684
548
a3afee2271ce Initial work on the x86-32 target
Michael Pavone <pavone@retrodev.com>
parents: 525
diff changeset
5685 #endif
a3afee2271ce Initial work on the x86-32 target
Michael Pavone <pavone@retrodev.com>
parents: 525
diff changeset
5686
2676
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2665
diff changeset
5687 void debugger(void *vcontext, uint32_t address)
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5688 {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5689 static char last_cmd[1024];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5690 char input_buf[1024];
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5691 m68kinst inst;
2676
7e86ec94c899 Implement breakpoints in new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2665
diff changeset
5692 m68k_context *context = vcontext;
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
5693
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
5694 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
5695
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5696 #ifndef NEW_CORE
2499
d74d3998482c Make some progress on compiling full emulator with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2459
diff changeset
5697 context->opts->sync_components(context, 0);
2500
d44fe974fb85 Get blastem compiling with new 68K core
Michael Pavone <pavone@retrodev.com>
parents: 2499
diff changeset
5698 #endif
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5699 debug_root *root = find_m68k_root(context);
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
5700 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
5701 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
5702 }
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5703 //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
5704 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
5705 if (address == root->branch_t) {
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
5706 bp_def ** f_bp = find_breakpoint(&root->breakpoints, root->branch_f, BP_TYPE_CPU);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5707 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
5708 remove_breakpoint(context, root->branch_f);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5709 }
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
5710 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
5711 } else if(address == root->branch_f) {
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
5712 bp_def ** t_bp = find_breakpoint(&root->breakpoints, root->branch_t, BP_TYPE_CPU);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5713 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
5714 remove_breakpoint(context, root->branch_t);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5715 }
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
5716 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
5717 }
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
5718
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5719 root->address = 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
5720 int debugging = 1;
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5721 //Check if this is a user set breakpoint, or just a temporary one
2361
3350b3c8faa8 Initial implementation of VDP register write breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2360
diff changeset
5722 bp_def ** this_bp = find_breakpoint(&root->breakpoints, address, BP_TYPE_CPU);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5723 if (*this_bp) {
2182
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5724 if ((*this_bp)->condition) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5725 debug_val condres;
2182
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5726 if (eval_expr(root, (*this_bp)->condition, &condres)) {
2362
b6c5a0fa3dfc Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
Michael Pavone <pavone@retrodev.com>
parents: 2361
diff changeset
5727 if (!condres.v.u32) {
2182
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5728 return;
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5729 }
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5730 } else {
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5731 fprintf(stderr, "Failed to eval condition for M68K breakpoint %u\n", (*this_bp)->index);
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5732 free_expr((*this_bp)->condition);
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5733 (*this_bp)->condition = NULL;
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5734 }
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5735 }
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5736 for (uint32_t i = 0; debugging && i < (*this_bp)->num_commands; i++)
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
5737 {
2178
f6d5bde4d07f Finish debugger refactor started with expression parser changes
Michael Pavone <pavone@retrodev.com>
parents: 2177
diff changeset
5738 debugging = run_command(root, (*this_bp)->commands + i);
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
5739 }
5a3ac6093ea2 Add support for executing a list of debugger commands when a breakpoint is hit
Michael Pavone <pavone@retrodev.com>
parents: 829
diff changeset
5740 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
5741 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
5742 } else {
2396
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5743 fflush(stdout);
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
5744 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
5745 }
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5746 } else {
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5747 remove_breakpoint(context, address);
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5748 }
2396
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5749 if (context->wp_hit) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5750 context->wp_hit = 0;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5751 this_bp = find_breakpoint(&root->breakpoints, context->wp_hit_address, BP_TYPE_CPU_WATCH);
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5752 if (*this_bp) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5753 if ((*this_bp)->condition) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5754 debug_val condres;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5755 if (eval_expr(root, (*this_bp)->condition, &condres)) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5756 if (!condres.v.u32) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5757 return;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5758 }
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5759 } else {
2400
c97609fe8315 Implement watchpoints in Z80 debugger
Michael Pavone <pavone@retrodev.com>
parents: 2396
diff changeset
5760 fprintf(stderr, "Failed to eval condition for M68K watchpoint %u\n", (*this_bp)->index);
2396
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5761 free_expr((*this_bp)->condition);
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5762 (*this_bp)->condition = NULL;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5763 }
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5764 }
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5765 for (uint32_t i = 0; debugging && i < (*this_bp)->num_commands; i++)
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5766 {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5767 debugging = run_command(root, (*this_bp)->commands + i);
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5768 }
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5769 if (debugging) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5770 if (context->wp_old_value != context->wp_hit_value) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5771 printf("68K Watchpoint %d hit, old value: %X, new value %X\n", (*this_bp)->index, context->wp_old_value, context->wp_hit_value);
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5772 } else {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5773 printf("68K Watchpoint %d hit\n", (*this_bp)->index);
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5774 }
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5775 } else {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5776 fflush(stdout);
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5777 return;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5778 }
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5779 }
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5780 }
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5781 if (context->system == current_system) {
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5782 genesis_context *gen = context->system;
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5783 vdp_force_update_framebuffer(gen->vdp);
bf4f1a8d1d48 Implement 68K watchpoints in internal debugger
Michael Pavone <pavone@retrodev.com>
parents: 2395
diff changeset
5784 }
2182
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5785 uint32_t after = m68k_decode(m68k_instruction_fetch, context, &inst, address);
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5786 root->after = after;
2d7f8195be3b Add support for conditional breakpoints
Michael Pavone <pavone@retrodev.com>
parents: 2181
diff changeset
5787 root->inst = &inst;
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
5788 for (disp_def * cur = root->displays; cur; cur = cur->next) {
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
5789 char format_str[8];
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
5790 make_format_str(format_str, cur->format);
2183
eb2e0e61b1b4 Fix stale values in display
Michael Pavone <pavone@retrodev.com>
parents: 2182
diff changeset
5791 for (int i = 0; i < cur->num_args; i++)
eb2e0e61b1b4 Fix stale values in display
Michael Pavone <pavone@retrodev.com>
parents: 2182
diff changeset
5792 {
eb2e0e61b1b4 Fix stale values in display
Michael Pavone <pavone@retrodev.com>
parents: 2182
diff changeset
5793 eval_expr(root, cur->args[i].parsed, &cur->args[i].value);
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
5794 do_print(root, format_str, cur->args[i].raw, cur->args[i].value);
2183
eb2e0e61b1b4 Fix stale values in display
Michael Pavone <pavone@retrodev.com>
parents: 2182
diff changeset
5795 }
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
5796 }
2214
7591c67b8d1e Support for loading symbols in debugger for use during name resolution and disassembly
Michael Pavone <pavone@retrodev.com>
parents: 2208
diff changeset
5797 m68k_disasm_labels(&inst, input_buf, root->disasm);
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5798 printf("%X: %s\n", address, input_buf);
2188
e17d99c96c89 Make blocks an explicitly supported concept in the debugger rather than a one-off for the commands command
Michael Pavone <pavone@retrodev.com>
parents: 2187
diff changeset
5799 debugger_repl(root);
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
5800 return;
524
fb39534b6604 Move debugging code outside of main source file
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5801 }
2720
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5802
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5803 static uint8_t upd_debug_fetch(uint16_t address, void *data)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5804 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5805 upd78k2_context *upd = data;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5806 return read_byte(address, (void **)upd->mem_pointers, &upd->opts->gen, upd);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5807 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5808
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5809 void upd_debugger(upd78k2_context *upd)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5810 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5811 static char last_cmd[1024];
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5812 char input_buf[1024];
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5813
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5814 init_terminal();
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5815
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5816 debug_root *root = find_upd_root(upd);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5817 if (!root) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5818 return;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5819 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5820 /*
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5821 if (upd->pc == root->branch_t) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5822 bp_def ** f_bp = find_breakpoint(&root->breakpoints, root->branch_f, BP_TYPE_CPU);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5823 if (!*f_bp) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5824 remove_breakpoint(context, root->branch_f);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5825 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5826 root->branch_t = root->branch_f = 0;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5827 } else if(upd->pc == root->branch_f) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5828 bp_def ** t_bp = find_breakpoint(&root->breakpoints, root->branch_t, BP_TYPE_CPU);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5829 if (!*t_bp) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5830 remove_breakpoint(context, root->branch_t);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5831 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5832 root->branch_t = root->branch_f = 0;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5833 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5834 */
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5835
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5836 root->address = upd->pc;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5837 int debugging = 1;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5838 //Check if this is a user set breakpoint, or just a temporary one
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5839 bp_def ** this_bp = find_breakpoint(&root->breakpoints, upd->pc, BP_TYPE_CPU);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5840 if (*this_bp) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5841 if ((*this_bp)->condition) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5842 debug_val condres;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5843 if (eval_expr(root, (*this_bp)->condition, &condres)) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5844 if (!condres.v.u32) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5845 return;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5846 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5847 } else {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5848 fprintf(stderr, "Failed to eval condition for uPD78K/II breakpoint %u\n", (*this_bp)->index);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5849 free_expr((*this_bp)->condition);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5850 (*this_bp)->condition = NULL;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5851 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5852 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5853 for (uint32_t i = 0; debugging && i < (*this_bp)->num_commands; i++)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5854 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5855 debugging = run_command(root, (*this_bp)->commands + i);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5856 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5857 if (debugging) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5858 printf("uPD78K/II Breakpoint %d hit\n", (*this_bp)->index);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5859 } else {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5860 fflush(stdout);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5861 return;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5862 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5863 } else {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5864 //remove_breakpoint(context, address);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5865 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5866 upd_address_ref ref;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5867 uint16_t after = upd78k2_disasm(input_buf, &ref, upd->pc, upd_debug_fetch, upd, root->disasm);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5868 root->after = after;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5869 root->inst = &ref;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5870 for (disp_def * cur = root->displays; cur; cur = cur->next) {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5871 char format_str[8];
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5872 make_format_str(format_str, cur->format);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5873 for (int i = 0; i < cur->num_args; i++)
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5874 {
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5875 eval_expr(root, cur->args[i].parsed, &cur->args[i].value);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5876 do_print(root, format_str, cur->args[i].raw, cur->args[i].value);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5877 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5878 }
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5879 printf("%X: %s\n", root->address, input_buf);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5880 debugger_repl(root);
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5881 return;
7dcc84cb14ee Get uPD78K/II partially hooked up in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2703
diff changeset
5882 }