X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;f=src%2Fmemwin.c;h=58ce1d2e6b7f87fae080c4fe57d1b2202a78c3d3;hb=82819ebb72819f4a39c5a9aa95fbb2cef22d510f;hp=17b94136fefae5b783bbe8716285c9bd786281b7;hpb=fcc8caad9c6c54d1bd1fa3b6e37dd392aac6eb47;p=emu8051.git diff --git a/src/memwin.c b/src/memwin.c index 17b9413..58ce1d2 100644 --- a/src/memwin.c +++ b/src/memwin.c @@ -32,17 +32,20 @@ #include "cpu8051.h" #include "regwin.h" #include "memwin.h" +#include "emugtk.h" +#include "options.h" +#include "app-config.h" -#define DATA_COLS 16 /* Must be a power of 2 */ -#define DATA_ROWS_INT (INT_MEM_SIZE / DATA_COLS) -#define DATA_ROWS_EXT (1024 / DATA_COLS) +extern struct app_config_t *cfg; +extern struct options_t options; + +static int COL_ASCII; +static int N_COLUMNS; enum { COL_ADDRESS = 0, COL_DATA0, - COL_ASCII = DATA_COLS + 1, - N_COLUMNS, }; static GtkWidget *memlist_internal; @@ -93,6 +96,7 @@ memwin_cell_edited(GtkCellRendererText *cell, gchar *path_string, columnptr = g_object_get_data(G_OBJECT(cell), "column"); column = GPOINTER_TO_UINT(columnptr); + /* Memory ID is passed as renderer object data */ memory_id_ptr = g_object_get_data(G_OBJECT(cell), "memory_id"); memory_id = GPOINTER_TO_UINT(memory_id_ptr); @@ -132,7 +136,7 @@ memwin_cell_edited(GtkCellRendererText *cell, gchar *path_string, * Make sure to update all registers and memory. * For example, BANKed registers depends on internal memory. */ - regwin_Show(); + emugtk_UpdateDisplay(); }; static void @@ -151,27 +155,31 @@ memwin_init_columns(GtkWidget *listview, int memory_id) gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); gtk_tree_view_append_column(GTK_TREE_VIEW(listview), column); - for (i = COL_DATA0; i < (COL_DATA0 + DATA_COLS); i++) { + for (i = COL_DATA0; i < (COL_DATA0 + cfg->bits_per_row); i++) { char col_name[8]; /* Create new renderer for each editable cell. */ renderer = gtk_cell_renderer_text_new(); - /* Allow edition, align to right side. */ - g_object_set(renderer, "editable", TRUE, "xalign", 1.0, NULL); + /* Allow edition, align to left side. */ + g_object_set(renderer, "editable", TRUE, "xalign", 0, NULL); g_signal_connect(renderer, "edited", G_CALLBACK(memwin_cell_edited), gtk_tree_view_get_model( GTK_TREE_VIEW(listview))); - /* Add column index, used when editing the cell. */ + /* Add column index and memory_id, used when editing the cell. */ g_object_set_data(G_OBJECT(renderer), "column", GUINT_TO_POINTER(i)); g_object_set_data(G_OBJECT(renderer), "memory_id", GUINT_TO_POINTER(memory_id)); - sprintf(col_name, "B%02d", i - COL_DATA0); + /* Use two digits only if DATA_ROWS > 10 */ + if (cfg->bits_per_row < 10) + sprintf(col_name, "B%1d", i - COL_DATA0); + else + sprintf(col_name, "B%02d", i - COL_DATA0); column = gtk_tree_view_column_new_with_attributes( col_name, renderer, "text", i, NULL); @@ -180,13 +188,32 @@ memwin_init_columns(GtkWidget *listview, int memory_id) gtk_tree_view_append_column(GTK_TREE_VIEW(listview), column); } - /* Add ASCII column */ + /* Add ASCII column, using fixed-font. */ + renderer = gtk_cell_renderer_text_new(); + g_object_set(renderer, "family", "Monospace", NULL); column = gtk_tree_view_column_new_with_attributes( "ASCII", renderer, "text", COL_ASCII, NULL); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); gtk_tree_view_append_column(GTK_TREE_VIEW(listview), column); } +static int +compute_data_rows(int memory_id) +{ + int data_rows; + + if (memory_id == INT_MEM_ID) { + data_rows = options.iram_size / cfg->bits_per_row; + } else if (memory_id == EXT_MEM_ID) { + data_rows = options.xram_size / cfg->bits_per_row; + } else { + log_fail("Invalid memory type"); + exit(1); + } + + return data_rows; +} + GtkWidget * memwin_init(char *title, int memory_id) { @@ -196,6 +223,9 @@ memwin_init(char *title, int memory_id) GtkWidget *memlist; int data_rows; + COL_ASCII = cfg->bits_per_row + 1; + N_COLUMNS = COL_ASCII + 1; + frame = gtk_frame_new(title); scrollwin = gtk_scrolled_window_new(NULL, NULL); @@ -209,14 +239,7 @@ memwin_init(char *title, int memory_id) gtk_container_add(GTK_CONTAINER(frame), scrollwin); - if (memory_id == INT_MEM_ID) { - data_rows = DATA_ROWS_INT; - } else if (memory_id == EXT_MEM_ID) { - data_rows = DATA_ROWS_EXT; - } else { - log_fail("Invalid memory type"); - exit(1); - } + data_rows = compute_data_rows(memory_id); /* Creating a model */ store = memwin_init_store(data_rows); @@ -247,9 +270,9 @@ memwin_init(char *title, int memory_id) return frame; } -/* Dump up to 256 bytes from Address in Memory (direct addressing) */ +/* Dump internal or external memory. */ void -memwin_DumpD(int memory_id) +memwin_refresh(int memory_id) { int row; unsigned int Address; @@ -257,16 +280,14 @@ memwin_DumpD(int memory_id) GtkWidget *memlist; int data_rows; - log_info("memwin_DumpD()"); - Address = 0; + data_rows = compute_data_rows(memory_id); + if (memory_id == INT_MEM_ID) { memlist = memlist_internal; - data_rows = DATA_ROWS_INT; } else if (memory_id == EXT_MEM_ID) { memlist = memlist_external; - data_rows = DATA_ROWS_EXT; } else { log_fail("Invalid memory type"); exit(1); @@ -278,7 +299,7 @@ memwin_DumpD(int memory_id) int valid; GtkTreeIter iter; char str[4+1]; /* Maximum str len is for address column (4 digits) */ - char ascii_str[DATA_COLS+1]; + char ascii_str[16+1]; /* Maximum 16 data columns. */ int col; if (row == 0) { @@ -301,7 +322,7 @@ memwin_DumpD(int memory_id) gtk_list_store_set(store, &iter, COL_ADDRESS, str, -1); - for (col = 0; col < DATA_COLS; col++) { + for (col = 0; col < cfg->bits_per_row; col++) { u_int8_t data; data = memory_read8(memory_id, Address + col); @@ -320,6 +341,6 @@ memwin_DumpD(int memory_id) /* Display ASCII characters. */ gtk_list_store_set(store, &iter, COL_ASCII, ascii_str, -1); - Address += DATA_COLS; + Address += cfg->bits_per_row; } }