comparison backend_x86.c @ 2396:bf4f1a8d1d48

Implement 68K watchpoints in internal debugger
author Michael Pavone <pavone@retrodev.com>
date Sat, 23 Dec 2023 17:37:57 -0800
parents 8990c2f431b1
children c97609fe8315
comparison
equal deleted inserted replaced
2395:ebca8ab02701 2396:bf4f1a8d1d48
127 if (opts->address_size == SZ_D && opts->address_mask != 0xFFFFFFFF) { 127 if (opts->address_size == SZ_D && opts->address_mask != 0xFFFFFFFF) {
128 and_ir(code, opts->address_mask, adr_reg, SZ_D); 128 and_ir(code, opts->address_mask, adr_reg, SZ_D);
129 } else if (opts->address_size == SZ_W && opts->address_mask != 0xFFFF) { 129 } else if (opts->address_size == SZ_W && opts->address_mask != 0xFFFF) {
130 and_ir(code, opts->address_mask, adr_reg, SZ_W); 130 and_ir(code, opts->address_mask, adr_reg, SZ_W);
131 } 131 }
132
133 code_ptr check_watchpoints = size == SZ_W ? (code_ptr)opts->check_watchpoints_16 : (code_ptr)opts->check_watchpoints_8;
134 if (is_write && check_watchpoints) {
135 //watchpoints are enabled, check if the address is within the watchpoint range
136 cmp_rdispr(code, opts->context_reg, opts->watchpoint_range_off, adr_reg, opts->address_size);
137 code_ptr watch_lb = code->cur + 1;
138 jcc(code, CC_C, code->cur + 2);
139 cmp_rdispr(code, opts->context_reg, opts->watchpoint_range_off + (opts->address_size == SZ_D ? 4 : 2), adr_reg, opts->address_size);
140 code_ptr watch_ub = code->cur + 1;
141 jcc(code, CC_NC, code->cur + 2);
142
143 push_r(code, opts->scratch1);
144 push_r(code, opts->scratch2);
145 call(code, opts->save_context);
146 call_args_abi(code, check_watchpoints, 3, opts->scratch2, opts->context_reg, opts->scratch1);
147 mov_rr(code, RAX, opts->context_reg, SZ_PTR);
148 call(code, opts->load_context);
149 pop_r(code, opts->scratch2);
150 pop_r(code, opts->scratch1);
151
152 *watch_lb = code->cur - (watch_lb + 1);
153 *watch_ub = code->cur - (watch_ub + 1);
154 }
155
132 code_ptr lb_jcc = NULL, ub_jcc = NULL; 156 code_ptr lb_jcc = NULL, ub_jcc = NULL;
133 uint16_t access_flag = is_write ? MMAP_WRITE : MMAP_READ; 157 uint16_t access_flag = is_write ? MMAP_WRITE : MMAP_READ;
134 uint32_t ram_flags_off = opts->ram_flags_off; 158 uint32_t ram_flags_off = opts->ram_flags_off;
135 uint32_t min_address = 0; 159 uint32_t min_address = 0;
136 uint32_t max_address = opts->max_address; 160 uint32_t max_address = opts->max_address;