X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;f=src%2Fpgmwin.c;h=69410bc190be39ce2d5f803b8b8f3be8dea31df3;hb=5905b40585298defb8e4230adfe90dfbccb465b9;hp=e4f9b46e75704d673f5ee5ddc0cf73f7003cc02b;hpb=8dc9dd02e68db51bf93d4061233399e55957d48e;p=emu8051.git diff --git a/src/pgmwin.c b/src/pgmwin.c index e4f9b46..69410bc 100644 --- a/src/pgmwin.c +++ b/src/pgmwin.c @@ -29,10 +29,11 @@ #include "memory.h" #include "cpu8051.h" #include "pgmwin.h" +#include "hexfile.h" static GtkWidget *pgmlist; -#define DATA_ROWS 24 +#define DATA_ROWS 100 enum { @@ -43,6 +44,7 @@ enum COL_B2, COL_INST, COL_ARGS, + COL_COLOR, N_COLUMNS, }; @@ -54,6 +56,7 @@ char *col_names[N_COLUMNS] = { "B2", "Mnemonic", "Arguments", + "COLOR", /* Not displayed, used to set foreground color of cell. */ }; /* Creating a model */ @@ -61,20 +64,28 @@ static GtkListStore * pgmwin_init_store(void) { GtkTreeIter iter; - int rows; + int row; int col; GtkListStore *store; GType col_types[N_COLUMNS]; + /* No need for static array, all our columns are of the same type. */ for (col = 0; col < N_COLUMNS; col++) col_types[col] = G_TYPE_STRING; store = gtk_list_store_newv(N_COLUMNS, col_types); - /* Initialize with rows of dummy data... */ - for (rows = 0; rows < DATA_ROWS; rows++) + /* Add rows. */ + for (row = 0; row < DATA_ROWS; row++) { gtk_list_store_append(store, &iter); + /* Color first row in red (current instruction). */ + if (row == 0) + gtk_list_store_set(store, &iter, COL_COLOR, "red", -1); + else + gtk_list_store_set(store, &iter, COL_COLOR, "black", -1); + } + return store; } @@ -84,18 +95,27 @@ pgmwin_init_columns(void) int k; GtkCellRenderer *renderer; - /* Columns and cell renderers */ + /* Create renderer */ renderer = gtk_cell_renderer_text_new(); - /* Add columns */ - for (k = 0; k < N_COLUMNS; k++) { + /* Add columns, except for last one (COL_COLOR). */ + for (k = 0; k < COL_COLOR; k++) { GtkTreeViewColumn *col; - col = gtk_tree_view_column_new_with_attributes( - col_names[k], renderer, "text", k, NULL); + /* Create tree view column */ + col = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(col, col_names[k]); gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_AUTOSIZE); gtk_tree_view_append_column(GTK_TREE_VIEW(pgmlist), col); + + /* Pack cell renderer into column */ + gtk_tree_view_column_pack_start(col, renderer, TRUE); + + /* Establish connection between cell renderer and data store. */ + gtk_tree_view_column_set_attributes(col, renderer, "text", k, + "foreground", COL_COLOR, + NULL); } } @@ -119,12 +139,12 @@ pgmwin_sel_changed_event(GtkWidget *widget, GdkEvent *event, gpointer data) gtk_tree_model_get(model, &iter, COL_ADDR, &str_addr, -1); /* Convert hex address in ASCII to integer. */ - sscanf(str_addr, "%x", &val); + val = asciihex2int(str_addr); log_debug(" row address is: $%04X", val); ToggleBreakpoint(val); - pgmwin_Disasm(); + pgmwin_refresh(); g_free(str_addr); } else { @@ -185,7 +205,7 @@ pgmwin_init(void) /* Show disassembled program. */ void -pgmwin_Disasm(void) +pgmwin_refresh(void) { int row; GtkListStore *store; @@ -199,8 +219,7 @@ pgmwin_Disasm(void) int valid; GtkTreeIter iter; char str[128]; - int k; - int col_id; + int k; int col_id; int InstSize; unsigned char OpCode; @@ -228,7 +247,8 @@ pgmwin_Disasm(void) gtk_list_store_set(store, &iter, COL_BREAKPT, str, -1); /* Display base address. */ - sprintf(str, "%.4X", Address); + int2asciihex(Address, str, 4); + gtk_list_store_set(store, &iter, COL_ADDR, str, -1); OpCode = memory_read8(PGM_MEM_ID, Address); @@ -236,8 +256,8 @@ pgmwin_Disasm(void) /* Display instruction hex bytes. */ for (k = 0, col_id = COL_B0; k < InstSize; k++, col_id++) { - sprintf(str, "%.2X", memory_read8(PGM_MEM_ID, - Address + k)); + int2asciihex(memory_read8(PGM_MEM_ID, Address + k), + str, 2); gtk_list_store_set(store, &iter, col_id, str, -1); }