| 4384 | } |
| 4385 | |
| 4386 | static int memwatch_func (uaecptr addr, int rwi, int size, uae_u32 *valp, uae_u32 accessmask, uae_u32 reg) |
| 4387 | { |
| 4388 | uae_u32 val = *valp; |
| 4389 | |
| 4390 | if (inside_debugger) |
| 4391 | return 1; |
| 4392 | |
| 4393 | if (mungwall) |
| 4394 | mungwall_memwatch(addr, rwi, size, val); |
| 4395 | |
| 4396 | if (illgdebug) |
| 4397 | illg_debug_do (addr, rwi, size, val); |
| 4398 | |
| 4399 | if (heatmap) |
| 4400 | memwatch_heatmap (addr, rwi, size, accessmask); |
| 4401 | |
| 4402 | addr = munge24 (addr); |
| 4403 | |
| 4404 | if (smc_table && (rwi >= 2)) |
| 4405 | smc_detector (addr, rwi, size, valp); |
| 4406 | |
| 4407 | for (int i = mwnodes_start; i <= mwnodes_end; i++) { |
| 4408 | struct memwatch_node *m = &mwnodes[i]; |
| 4409 | uaecptr addr2 = m->addr; |
| 4410 | uaecptr addr3 = addr2 + m->size; |
| 4411 | int rwi2 = m->rwi; |
| 4412 | uae_u32 oldval = 0; |
| 4413 | int isoldval = 0; |
| 4414 | int brk = 0; |
| 4415 | uae_u32 newval = 0; |
| 4416 | |
| 4417 | if (m->size == 0) |
| 4418 | continue; |
| 4419 | if (!(rwi & rwi2)) |
| 4420 | continue; |
| 4421 | if (!(m->access_mask & accessmask)) |
| 4422 | continue; |
| 4423 | |
| 4424 | if (addr >= addr2 && addr < addr3) |
| 4425 | brk = 1; |
| 4426 | if (!brk && size == 2 && (addr + 1 >= addr2 && addr + 1 < addr3)) |
| 4427 | brk = 1; |
| 4428 | if (!brk && size == 4 && ((addr + 2 >= addr2 && addr + 2 < addr3) || (addr + 3 >= addr2 && addr + 3 < addr3))) |
| 4429 | brk = 1; |
| 4430 | |
| 4431 | if (!brk) |
| 4432 | continue; |
| 4433 | |
| 4434 | if (m->bus_error) { |
| 4435 | if (((m->bus_error & 1) && (rwi & 1)) || ((m->bus_error & 4) && (rwi & 4)) || ((m->bus_error & 2) && (rwi & 2))) { |
| 4436 | hardware_exception2(addr, val, (rwi & 2) != 0, (rwi & 4) != 0, size == 4 ? sz_long : (size == 2 ? sz_word : sz_byte)); |
| 4437 | } |
| 4438 | continue; |
| 4439 | } |
| 4440 | |
| 4441 | if (mem_banks[addr >> 16]->check (addr, size)) { |
| 4442 | uae_u8 *p = mem_banks[addr >> 16]->xlateaddr (addr); |
| 4443 | if (size == 1) { |
no test coverage detected