GLADE_CB void on_disassemble_indirect1_activate (GtkMenuItem *menuitem, gpointer user_data) { uint32_t addr = column2address(menuitem, user_data); // populate code at the address contained at this address dbgcode_disasm_at(mem_rd_long(addr)); }
// return value as string static char* rd_mem_as_str(IO_DEF *t) { switch(t->size) { case 1: return g_strdup_printf("%02x", mem_rd_byte(t->addr)); break; case 2: return g_strdup_printf("%04x", mem_rd_word(t->addr)); break; case 4: return g_strdup_printf("%08x", mem_rd_long(t->addr)); break; default: return g_strdup("???"); break; } return g_strdup(""); }
GLADE_CB void on_dbgmem_view_memory1_activate (GtkMenuItem *menuitem, gpointer user_data) { uint32_t addr = column2address(menuitem, user_data); gchar *str; // open a new tab at the address contained at this address str = g_strdup_printf("%06x", mem_rd_long(addr)); notebook_add_page(notebook, str); g_free(str); }
static int rd_bit(IO_DEF *s, int bit_num) { switch(s->size) { case 1: return mem_rd_byte(s->addr) & (1 << bit_num); break; case 2: return mem_rd_word(s->addr) & (1 << bit_num); break; case 4: return mem_rd_long(s->addr) & (1 << bit_num); break; } return -1; }
gint display_dbgcause_dbox2(GtkWidget *sb) { gint type, id, mode; guint sb_id; gchar *str = NULL; // get context ti68k_bkpt_get_cause(&type, &mode, &id); if(!type && !mode && !id) return 0; // user break if(!type && !mode) { uint32_t value; ti68k_register_get_pc(&value); str = g_strdup_printf("User break (pc=$0x%06x)", value); } // exception or code/mem ? else if(type == BK_TYPE_EXCEPTION) { // exception uint32_t sp; uint32_t pc; uint32_t sr; ti68k_register_get_sp(&sp); sr = mem_rd_long(sp); ti68k_register_get_sp(&sp); pc = mem_rd_long(sp+2); str = g_strdup_printf("type=<%s>, id=#%i, SR=%04x, PC=%06x\n", ti68k_exception_to_string(mode), id, str, pc); } else if(type == BK_TYPE_CODE) { // code uint32_t value; ti68k_register_get_pc(&value); str = g_strdup_printf("type=<%s>, id=#%i, PC=$0x%06x", ti68k_bkpt_type_to_string(type), id, value); } else if((type == BK_TYPE_ACCESS) || (type ==BK_TYPE_RANGE)) { // mem access or range uint32_t value, min, max; gchar *str1, *str2; ti68k_register_get_pc(&value); str1 = g_strdup_printf("type=<%s>, id=#%i, mode=<%s>, PC=$0x%06x", ti68k_bkpt_type_to_string(type), id, ti68k_bkpt_mode_to_string(type, mode), value); switch(type) { case BK_TYPE_ACCESS: ti68k_bkpt_get_access(id, &min, mode); str2 = g_strdup_printf("mem=$0x%06x", min); break; case BK_TYPE_RANGE: ti68k_bkpt_get_range(id, &min, &max, mode); str2 = g_strdup_printf("mem=$0x%06x-$0x%06x", min, max); break; default: str2 = g_strdup("n/a"); break; } str = g_strconcat(str1, ", ", str2, NULL); g_free(str1); g_free(str2); } else if(type == BK_TYPE_PROTECT) { uint32_t value; ti68k_register_get_pc(&value); switch(bkpts.id) { case 1: str = g_strdup_printf("hw protection violation: FLASH execution at $%06x.\nExecution allowed until $%06x.", value, 0x390000+tihw.archive_limit*0x10000); break; case 2: str = g_strdup_printf("hw protection violation: RAM execution at $%06x.\n", value); break; case 3: str = g_strdup_printf("hw protection violation: FLASH execution at $%06x.\nExecution allowed until $%06x.", value, tihw.rom_base + 0x10000 + tihw.io2[0x13]*0x10000); break; default: str = g_strdup("bug !\n"); break; } } else if(type == BK_TYPE_PGMENTRY) { uint16_t handle; uint32_t pc; ti68k_register_get_pc(&pc); ti68k_bkpt_get_pgmentry(id, &handle); str = g_strdup_printf("type=<%s>, id=#%i, handle=$%04x, PC=$0x%06x", ti68k_bkpt_type_to_string(type), id, handle, pc); } else { str = g_strdup("bug !\n"); } sb_id = gtk_statusbar_get_context_id(GTK_STATUSBAR(sb), str); gtk_statusbar_push(GTK_STATUSBAR(sb), sb_id, str); g_free(str); return 0; }
gint dbgcause2_display_dbox() { GladeXML *xml; GtkWidget *dbox; GtkWidget *label; gint result; gchar *str; gint type, id, mode; uint32_t sp; uint32_t pc; uint32_t sr; // get context ti68k_bkpt_get_cause(&type, &mode, &id); if(!type && !mode && !id) return 0; // load GUI xml = glade_xml_new (tilp_paths_build_glade("dbg_cause-2.glade"), "dbgcause2_dbox", PACKAGE); if (!xml) g_error(_("%s: GUI loading failed !\n"), __FILE__); glade_xml_signal_autoconnect(xml); dbox = glade_xml_get_widget(xml, "dbgcause2_dbox"); // set exception type label = glade_xml_get_widget(xml, "label41"); gtk_label_set_text(GTK_LABEL(label), ti68k_exception_to_string(mode)); // set id label = glade_xml_get_widget(xml, "label42"); str = g_strdup_printf("%i", id); gtk_label_set_text(GTK_LABEL(label), str); g_free(str); // set pushed PC ti68k_register_get_sp(&sp); sr = mem_rd_long(sp); str = g_strdup_printf("%04x", sr); label = glade_xml_get_widget(xml, "label43"); gtk_label_set_text(GTK_LABEL(label), str); g_free(str); // set pushed SR ti68k_register_get_sp(&sp); pc = mem_rd_long(sp+2); str = g_strdup_printf("%06x", pc); label = glade_xml_get_widget(xml, "label44"); gtk_label_set_text(GTK_LABEL(label), str); g_free(str); result = gtk_dialog_run(GTK_DIALOG(dbox)); switch (result) { case GTK_RESPONSE_OK: break; default: break; } gtk_widget_destroy(dbox); return 0; }
// called when a check button has been toggled static void renderer_toggled(GtkCellRendererToggle *cell, gchar *path_string, gpointer user_data) { GtkWidget *tree = user_data; GtkTreeView *view = GTK_TREE_VIEW(tree); GtkTreeModel *model = gtk_tree_view_get_model(view); GtkTreeStore *store = GTK_TREE_STORE(model); GtkTreePath *path; GtkTreeIter parent, iter; IO_DEF *s; gboolean state, result; gchar* bit_str; gint bit_num; gchar* str; path = gtk_tree_path_new_from_string(path_string); if (!gtk_tree_model_get_iter(model, &iter, path)) return; if (!gtk_tree_model_get_iter(model, &iter, path)) return; gtk_tree_model_get(model, &iter, COL_BTNACT, &state, COL_S, &s, COL_ADDR, &bit_str, -1); // change button state state = !state; sscanf(bit_str, "%i", &bit_num); // change value in memory switch(s->size) { case 1: if(state) mem_wr_byte(s->addr, (uint8_t)(mem_rd_byte(s->addr) | (1 << bit_num))); else mem_wr_byte(s->addr, (uint8_t)(mem_rd_byte(s->addr) & ~(1 << bit_num))); break; case 2: if(state) mem_wr_word(s->addr, (uint16_t)(mem_rd_word(s->addr) | (1 << bit_num))); else mem_wr_word(s->addr, (uint16_t)(mem_rd_word(s->addr) & ~(1 << bit_num))); break; case 4: if(state) mem_wr_long(s->addr, mem_rd_long(s->addr) | (1 << bit_num)); else mem_wr_long(s->addr, mem_rd_long(s->addr) & ~(1 << bit_num)); break; } // and change displayed value (parent node) gtk_tree_store_set(store, &iter, COL_BTNACT, state, -1); g_free(bit_str); result = gtk_tree_model_iter_parent(model, &parent, &iter); if(result) { str = rd_mem_as_str(s); gtk_tree_store_set(store, &parent, COL_VALUE, str, -1); g_free(str); } }