Example #1
0
void mem_rd_block(uint32_t a, uint8_t *d, uint16_t len)
{
	int i;

	for(i = 0; i < len; i++)
		d[i] = mem_rd_byte(a+i);
}
Example #2
0
// 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("");
}
Example #3
0
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;
}
Example #4
0
void mem_rd_block(uint32_t a, uint8_t *d, uint16_t len)
{
	/*
	int q = len / 4;
	int r = len % 4;
	int i, j;

	for(i = 0; i < q; i++)
		d[4*i] = mem_rd_long(a + 4*i);
	for(j = 0; j < r; j++)
		d[4*i+j] = mem_rd_byte(a + 4*i + j);
	*/
	int i;

	for(i = 0; i < len; i++)
		d[i] = mem_rd_byte(a+i);
}
Example #5
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);
	}
}
Example #6
0
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);
}
Example #7
0
static void refresh_page(int page, int offset)
{
	GtkNotebook *nb = GTK_NOTEBOOK(notebook);
	GtkWidget *tab;
	GtkWidget *label;
	G_CONST_RETURN gchar *text;
	uint32_t addr, len = DUMP_SIZE;

	GList *l, *elt;
	GtkWidget *list;
	GtkTreeView *view;
	GtkTreeModel *model;
	GtkListStore *store;
	gchar *str;

    gint i;

	// retrieve addr by tab name
	tab = gtk_notebook_get_nth_page(nb, page);
	label = gtk_notebook_get_tab_label(nb, tab);
	text = gtk_label_get_text(GTK_LABEL(label));

	// get list pointer (we have 1 child)
	l = gtk_container_get_children(GTK_CONTAINER(nb));
	elt = g_list_nth(l, page);
	list = GTK_WIDGET(elt->data);
	view = GTK_TREE_VIEW(list);
	model = gtk_tree_view_get_model(view);
	store = GTK_LIST_STORE(model);

    // get new address
	sscanf(text, "%x", &addr);
	len = DUMP_SIZE;

	addr += offset;
	addr &= 0xffffff;

    // refresh only if mem changed (speed-up)
#ifndef FORCE_REFRESH
    if(!offset)
    {
        static uint8_t old_array[DUMP_SIZE] = { 0 };
        gint diff = 0;

        // can't use memcmp due to banking
        for(i = 0; i < DUMP_SIZE; i++)
        {
			uint8_t old = old_array[i];
			uint8_t mem = mem_rd_byte(addr + i);

            if(old != mem)
            {
                old = mem;
                diff = !0;
            }
        }

        if(!diff) return;
    }
#endif

    // refresh tab
	str = g_strdup_printf("%06x", addr);
	gtk_label_set_text(GTK_LABEL(label), str);
	g_free(str);

    // and list
   	clist_refresh(store, addr, len <= DUMP_SIZE ? len : DUMP_SIZE);

    // set column
	for(i = COL_0; i <= COL_F; i++)
    {
        GtkTreeViewColumn *col;

		col = gtk_tree_view_get_column(view, i);
        str = g_strdup_printf("%X", (addr + i - 1) & 0xf);
        gtk_tree_view_column_set_title(col, str);
        g_free(str);
    }
}
Example #8
0
static void clist_populate(GtkListStore *store, uint32_t start, int length)
{
    GtkTreeIter iter;
    int i;
    gchar *str;
    char ascii[17];
    uint32_t a;
	GdkColor gray, black, red, white;
	gboolean success;
    GdkColor *color = &black;

    //static uint8_t old[DUMP_SIZE] = { 0 };
    //static uint8_t *old_ptr;

	gdk_color_parse("DarkGray", &gray);
	gdk_colormap_alloc_colors(gdk_colormap_get_system(), &gray, 1,
				  FALSE, FALSE, &success);

	gdk_color_parse("Black", &black);
	gdk_colormap_alloc_colors(gdk_colormap_get_system(), &black, 1,
				  FALSE, FALSE, &success);

	gdk_color_parse("Red", &red);
	gdk_colormap_alloc_colors(gdk_colormap_get_system(), &red, 1,
				  FALSE, FALSE, &success);

    gdk_color_parse("White", &white);
	gdk_colormap_alloc_colors(gdk_colormap_get_system(), &white, 1,
				  FALSE, FALSE, &success);

    //old_ptr = old;
    for(a = start; a < start+length; a += 0x10)
    {
		uint32_t addr = a & 0xffffff;
		uint8_t mem;

		char *utf;
		gsize bw;

        gtk_list_store_append(store, &iter);

		str = g_strdup_printf("%06x", addr);
		gtk_list_store_set(store, &iter, 
			COL_ADDR, str, 
			COL_GRAY, &gray,
			-1);
		g_free(str);

		if(options3.dbg_font_type)
			gtk_list_store_set(store, &iter, COL_FONT, options3.dbg_font_name, -1);
		else
			gtk_list_store_set(store, &iter, COL_FONT, "courier", -1);

		for(i = COL_0; i <= COL_F; i++)
		{
			if(addr + (i-COL_0) != 0x60000f)
				mem = mem_rd_byte(addr + (i-COL_0)); 
			else
				mem = 0xff;

			str = g_strdup_printf("%02x", mem);
			ascii[i-COL_0] = (isprint(mem) && !iscntrl(mem) ? mem : '.');
/*
            if(*old_ptr != *mem_ptr)
            {
                *old_ptr++ = *mem_ptr;
                color = &red;
                printf("$");
            }
            else
            {
                old_ptr++;
                color = &black;
                printf(".");
            }
*/
			gtk_list_store_set(store, &iter, 
				i, str, 
				COL_EDITABLE, TRUE, 
                COL_COLOR, color,
                i + CLIST_NVCOLS - COL_0, &white,
				-1);

			g_free(str);            
        }
	 
		ascii[16] = '\0';
		utf = g_locale_to_utf8(ascii, -1, NULL, &bw, NULL);
		gtk_list_store_set(store, &iter, COL_ASCII, utf, -1);
    }
}
Example #9
0
static gint search_engine(char *str, int ascii, int casse, uint32_t *address, int *length)
{
    uint8_t *data;
    uint16_t len;
    gchar *tmp;
    gint i;
    uint32_t addr;

    data = (uint8_t *) g_strdup((gchar *) str);
    len = strlen((char *) data);

    // ASCII mode ?
    if(!ascii)
    {
        char *p, *q;

        // compact string
        p = str;
        q = tmp = g_strdup(str);

        while(*p)
        {
            if(*p != ' ')
                *q++ = *p++;
            else
                p++;
        }
        *q = '\0';

        // and converts
        len = strlen(tmp) / 2;
        for(i = 0; i < len; i++)
        {
            char digits[3];
            unsigned int temp;

            strncpy(digits, &tmp[2*i], 2); 
            digits[2] = '\0';
            sscanf(digits, "%02x", &temp);
            data[i] = temp;
        }

        g_free(tmp);
    }

    // search (we don't use memcmp because mem space may be not contiguous)
    i = 0;
    for(addr = *address; addr <= 0xffffff; addr++)
    {
		if(mem_rd_byte(addr) == data[i])
            i++;
        else
            i = 0;

        if(i == len)
            break;
    }

    if(i == len)
    {
        *address = addr - len + 1;
        *length = len;
        return !0;
    }

    return 0;
}