Mercurial > repos > blastem
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; |