Mercurial > repos > blastem
diff 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 |
line wrap: on
line diff
--- a/backend_x86.c Wed Dec 13 20:09:18 2023 -0800 +++ b/backend_x86.c Sat Dec 23 17:37:57 2023 -0800 @@ -129,6 +129,30 @@ } else if (opts->address_size == SZ_W && opts->address_mask != 0xFFFF) { and_ir(code, opts->address_mask, adr_reg, SZ_W); } + + code_ptr check_watchpoints = size == SZ_W ? (code_ptr)opts->check_watchpoints_16 : (code_ptr)opts->check_watchpoints_8; + if (is_write && check_watchpoints) { + //watchpoints are enabled, check if the address is within the watchpoint range + cmp_rdispr(code, opts->context_reg, opts->watchpoint_range_off, adr_reg, opts->address_size); + code_ptr watch_lb = code->cur + 1; + jcc(code, CC_C, code->cur + 2); + cmp_rdispr(code, opts->context_reg, opts->watchpoint_range_off + (opts->address_size == SZ_D ? 4 : 2), adr_reg, opts->address_size); + code_ptr watch_ub = code->cur + 1; + jcc(code, CC_NC, code->cur + 2); + + push_r(code, opts->scratch1); + push_r(code, opts->scratch2); + call(code, opts->save_context); + call_args_abi(code, check_watchpoints, 3, opts->scratch2, opts->context_reg, opts->scratch1); + mov_rr(code, RAX, opts->context_reg, SZ_PTR); + call(code, opts->load_context); + pop_r(code, opts->scratch2); + pop_r(code, opts->scratch1); + + *watch_lb = code->cur - (watch_lb + 1); + *watch_ub = code->cur - (watch_ub + 1); + } + code_ptr lb_jcc = NULL, ub_jcc = NULL; uint16_t access_flag = is_write ? MMAP_WRITE : MMAP_READ; uint32_t ram_flags_off = opts->ram_flags_off;