X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;f=src%2Fmemwin.c;h=58ce1d2e6b7f87fae080c4fe57d1b2202a78c3d3;hb=c2ef73ab945d0c668e000aef58a1ad227d8910c1;hp=ffe5e56500516b0fa724a641e048bc5bdb67b428;hpb=7657e4d7db609460aa6d7bc993ee1ec2aa94670f;p=emu8051.git diff --git a/src/memwin.c b/src/memwin.c index ffe5e56..58ce1d2 100644 --- a/src/memwin.c +++ b/src/memwin.c @@ -33,17 +33,19 @@ #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; @@ -94,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); @@ -152,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); @@ -181,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) { @@ -197,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); @@ -210,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); @@ -260,12 +282,12 @@ memwin_refresh(int memory_id) 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); @@ -277,7 +299,7 @@ memwin_refresh(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) { @@ -300,7 +322,7 @@ memwin_refresh(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); @@ -319,6 +341,6 @@ memwin_refresh(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; } }