void mem_wr_block(uint32_t a, uint8_t *d, uint16_t len) { int i; for(i = 0; i < len; i++) mem_wr_byte(a+i, d[i]); }
// called when cell has been edited static void renderer_edited(GtkCellRendererText *cell, const gchar *path_string, const gchar *new_text, 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 = gtk_tree_path_new_from_string(path_string); GtkTreeIter iter, child; IO_DEF *s; gchar *str; uint32_t value; gboolean valid; if (!gtk_tree_model_get_iter(model, &iter, path)) return; gtk_tree_model_get(model, &iter, COL_VALUE, &str, COL_S, &s, -1); sscanf(str, "%x", &value); g_free(str); // change value in memory if(validate_value(new_text, 2 *s->size)) { sscanf(new_text, "%x", &value); switch(s->size) { case 1: mem_wr_byte(s->addr, (uint8_t )value); break; case 2: mem_wr_word(s->addr, (uint16_t)value); break; case 4: mem_wr_long(s->addr, (uint32_t)value); break; default: break; } } // and change displayed value (don't rely on typed value !) str = rd_mem_as_str(s); gtk_tree_store_set(store, &iter, COL_VALUE, str, -1); g_free(str); // update bits (children nodes) for(valid = gtk_tree_model_iter_children(model, &child, &iter); valid; valid = gtk_tree_model_iter_next(model, &child)) { gchar* bit_adr; int bit_num; gtk_tree_model_get(model, &child, COL_NAME, &str, COL_ADDR, &bit_adr, -1); sscanf(bit_adr, "%i", &bit_num); gtk_tree_store_set(store, &child, COL_BTNACT, rd_bit(s, bit_num), -1); } gtk_tree_path_free(path); }
// 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); } }
static void renderer_edited(GtkCellRendererText * cell, const gchar * path_string, const gchar * new_text, gpointer user_data) { GtkWidget *list = user_data; GtkTreeView *view = GTK_TREE_VIEW(list); GtkTreeModel *model = gtk_tree_view_get_model(view); GtkListStore *store = GTK_LIST_STORE(model); GtkTreeViewColumn *column; GtkTreeIter iter; GtkTreePath *path; gint col; gchar *str_addr; gchar *str_data = (char *)new_text; int addr, data, i; gchar *ascii, *utf; gsize bw; // get column gtk_tree_view_get_cursor(view, &path, &column); if(!path || !column) return; // get iterator if (!gtk_tree_model_get_iter(model, &iter, path)) return; // get address col = column2index(list, column); gtk_tree_model_get(model, &iter, COL_ADDR, &str_addr, COL_ASCII, &ascii, -1); // check for new value if((strlen(str_data) % 2) != 0) { gtk_tree_path_free(path); return; } for(i = 0; i < (int)strlen(str_data); i++) if(!isxdigit(str_data[i])) { gtk_tree_path_free(path); return; } // set new value(s) and update memory for(i = 0; (i < (int)strlen(str_data)/2) && ((col+i) <= COL_F); i++) { char digits[3]; int offset = col - COL_0 + i; strncpy(digits, &new_text[2*i], 2); digits[2] = '\0'; sscanf(str_addr, "%x", &addr); sscanf(digits, "%x", &data); mem_wr_byte(addr + offset, (uint8_t)data); // don't rely on typed value data = mem_rd_byte(addr + offset); sprintf(digits, "%02x", data); ascii[offset] = (isprint(data) && !iscntrl(data) ? data : '.'); gtk_list_store_set(store, &iter, col+i, digits, -1); dbgstack_refresh_window(); // refresh stack, too } // and ascii area, too utf = g_locale_to_utf8(ascii, -1, NULL, &bw, NULL); gtk_list_store_set(store, &iter, COL_ASCII, utf, -1); g_free(str_addr); gtk_tree_path_free(path); }