static int breakpoint_add_checkpoint(MON_ADDR start_addr, MON_ADDR end_addr, bool is_trace, bool is_load, bool is_store, bool is_temp, bool do_print) { breakpoint_t *new_bp; MEMSPACE mem; long len; len = mon_evaluate_address_range(&start_addr, &end_addr, FALSE, 0); new_bp = (breakpoint_t *)lib_malloc(sizeof(breakpoint_t)); new_bp->brknum = breakpoint_count++; new_bp->start_addr = start_addr; new_bp->end_addr = end_addr; new_bp->trace = is_trace; new_bp->enabled = e_ON; new_bp->hit_count = 0; new_bp->ignore_count = 0; new_bp->condition = NULL; new_bp->command = NULL; new_bp->watch_load = is_load; new_bp->watch_store = is_store; new_bp->temporary = is_temp; mem = addr_memspace(start_addr); if (!is_load && !is_store) { if (!any_breakpoints(mem)) { monitor_mask[mem] |= MI_BREAK; interrupt_monitor_trap_on(mon_interfaces[mem]->int_status); } add_to_checkpoint_list(&(breakpoints[mem]), new_bp); } else { if (!any_watchpoints(mem)) { monitor_mask[mem] |= MI_WATCH; mon_interfaces[mem]->toggle_watchpoints_func(1, mon_interfaces[mem]->context); interrupt_monitor_trap_on(mon_interfaces[mem]->int_status); } if (is_load) add_to_checkpoint_list(&(watchpoints_load[mem]), new_bp); if (is_store) add_to_checkpoint_list(&(watchpoints_store[mem]), new_bp); } if (is_temp) exit_mon = 1; if (do_print) print_checkpoint_info(new_bp); return new_bp->brknum; }
void mon_breakpoint_delete_checkpoint(int brknum) { int i; breakpoint_t *bp = NULL; MEMSPACE mem; if (brknum == -1) { /* Add user confirmation here. */ mon_out("Deleting all breakpoints\n"); for (i = 1; i < breakpoint_count; i++) { bp = find_checkpoint(i); if (bp) mon_breakpoint_delete_checkpoint(i); } } else if (!(bp = find_checkpoint(brknum))) { mon_out("#%d not a valid breakpoint\n", brknum); return; } else { mem = addr_memspace(bp->start_addr); if (!(bp->watch_load) && !(bp->watch_store)) { remove_checkpoint_from_list(&(breakpoints[mem]), bp); if (!any_breakpoints(mem)) { monitor_mask[mem] &= ~MI_BREAK; if (!monitor_mask[mem]) interrupt_monitor_trap_off(mon_interfaces[mem]->int_status); } } else { if (bp->watch_load) remove_checkpoint_from_list(&(watchpoints_load[mem]), bp); if (bp->watch_store) remove_checkpoint_from_list(&(watchpoints_store[mem]), bp); if (!any_watchpoints(mem)) { monitor_mask[mem] &= ~MI_WATCH; mon_interfaces[mem]->toggle_watchpoints_func(0, mon_interfaces[mem]->context); if (!monitor_mask[mem]) interrupt_monitor_trap_off(mon_interfaces[mem]->int_status); } } } if (bp != NULL) { mon_delete_conditional(bp->condition); if (bp->command) lib_free(bp->command); } }
void mem_update_config(int config) { mem_config = config; if (any_watchpoints(e_comp_space)) { _mem_read_tab_ptr = mem_read_tab_watch; _mem_write_tab_ptr = mem_write_tab_watch; } else { _mem_read_tab_ptr = mem_read_tab[mem_config]; _mem_write_tab_ptr = mem_write_tab[vbank][mem_config]; } _mem_read_base_tab_ptr = mem_read_base_tab[config]; mem_read_limit_tab_ptr = mem_read_limit_tab[config]; if (bank_limit != NULL) { *bank_base = _mem_read_base_tab_ptr[mem_old_reg_pc >> 8]; if (*bank_base != 0) *bank_base = _mem_read_base_tab_ptr[mem_old_reg_pc >> 8] - (mem_old_reg_pc & 0xff00); *bank_limit = mem_read_limit_tab_ptr[mem_old_reg_pc >> 8]; }
void mem_pla_config_changed(void) { mem_config = (((~pport.dir | pport.data) & 0x7)); c64pla_config_changed(0, 1, 0x17); if (any_watchpoints(e_comp_space)) { _mem_read_tab_ptr = mem_read_tab_watch; _mem_write_tab_ptr = mem_write_tab_watch; } else { _mem_read_tab_ptr = mem_read_tab[mem_config]; _mem_write_tab_ptr = mem_write_tab[vbank][mem_config]; } _mem_read_base_tab_ptr = mem_read_base_tab[mem_config]; mem_read_limit_tab_ptr = mem_read_limit_tab[mem_config]; if (bank_limit != NULL) { *bank_base = _mem_read_base_tab_ptr[mem_old_reg_pc >> 8]; if (*bank_base != 0) *bank_base = _mem_read_base_tab_ptr[mem_old_reg_pc >> 8] - (mem_old_reg_pc & 0xff00); *bank_limit = mem_read_limit_tab_ptr[mem_old_reg_pc >> 8]; }