X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;f=src%2Fregwin.c;h=8c4cd4d8a96b17d4aee4b0fe933b34277db75999;hb=e75510dd872ed3e50e6ddfcab328dab69f949177;hp=05787819d479ae038c118eb32dd486b0c04db9cd;hpb=3e67c30ca5f1f959c06d1061556fa46c11163473;p=emu8051.git diff --git a/src/regwin.c b/src/regwin.c index 0578781..8c4cd4d 100644 --- a/src/regwin.c +++ b/src/regwin.c @@ -1,5 +1,5 @@ /* - * regwin.cpp + * regwin.c * * Copyright (C) 1999 Jonathan St-André * Copyright (C) 1999 Hugo Villeneuve @@ -28,14 +28,19 @@ #include "common.h" #include "reg8051.h" #include "cpu8051.h" +#include "sfr.h" +#include "memory.h" #include "regwin.h" #include "memwin.h" +#include "pgmwin.h" #include "instructions_8051.h" #include "hexfile.h" +#include "emugtk.h" static GtkWidget *reglist; -#define DATA_ROWS 24 +#define LIST_VIEW_NAME "Registers" +#define DATA_ROWS SFR_REGS enum { @@ -44,276 +49,29 @@ enum N_COLUMNS, }; -#define HEX_DIGITS_2 2 -#define HEX_DIGITS_4 4 - -struct regwin_infos_t { - char *name; /* Register name */ - int w; /* Number of hex digits to display */ - unsigned int (*read_func)(int addr); /* Function to read value */ - void (*write_func)(int param, int val); /* Function to write value */ - int param; /* Optional parameter to pass to read function. */ -}; - -/* Generic read/write functions */ -static unsigned int -regwin_read(int addr, int width) -{ - if (width == 2) - return cpu8051_ReadD(addr); - else if (width == 4) { - /* Address is low address. */ - return (cpu8051_ReadD(addr + 1) << 8) + - cpu8051_ReadD(addr); - } else - return 0xFFFFFFFF; -} - -static void -regwin_write(int addr, int val, int width) -{ - if (width == 2) - cpu8051_WriteD(addr, (u_int8_t) val); - else if (width == 4) { - /* Address is low address. */ - cpu8051_WriteD(addr + 1, (u_int8_t) ((val & 0x0000FFFF) >> 8)); - cpu8051_WriteD(addr, (u_int8_t) val); - } -}; - -/* Specific read/write functions for special registers. */ - -static unsigned int -regwin_read_pc(int dummy) -{ - return cpu8051.pc; -} - -static void -regwin_write_pc(int param, int val) -{ - cpu8051.pc = (u_int16_t) val; -} - -static unsigned int -regwin_read_bank(int dummy) -{ - return BANKPSW >> 3; -} - -static void -regwin_write_bank(int param, int bank_number) -{ - u_int8_t psw = cpu8051_ReadD(_PSW_); - - if ((bank_number < 0) || (bank_number > 3)) { - log_info("Error: invalid bank number: %d", bank_number); - bank_number = 0; - } - - cpu8051_WriteD(_PSW_, (psw & ~0x18) | (bank_number << 3)); -} - -/* Read R0 - R7 in current bank. */ -static unsigned int -regwin_read_rx(int offset) -{ - return cpu8051_ReadD(BANKPSW + offset); -} - -static void -regwin_write_rx(int offset, int val) -{ - cpu8051_WriteD(BANKPSW + offset, (u_int8_t) val); -} - -/* This array defines how to read value for each register. */ -static struct regwin_infos_t regwin_infos[DATA_ROWS] = { - { - "PC", - HEX_DIGITS_4, - regwin_read_pc, regwin_write_pc, - 0, /* Dummy */ - }, - { - "SP", - HEX_DIGITS_2, - NULL, NULL, - _SP_, - }, - { - "A", - HEX_DIGITS_2, - NULL, NULL, - _ACC_, - }, - { - "B", - HEX_DIGITS_2, - NULL, NULL, - _B_, - }, - { - "DPTR", - HEX_DIGITS_4, - NULL, NULL, - _DPL_, - }, - { - "PSW", - HEX_DIGITS_2, - NULL, NULL, - _PSW_, - }, - { - "P0", - HEX_DIGITS_2, - NULL, NULL, - _P0_, - }, - { - "P1", - HEX_DIGITS_2, - NULL, NULL, - _P1_, - }, - { - "P2", - HEX_DIGITS_2, - NULL, NULL, - _P2_, - }, - { - "P3", - HEX_DIGITS_2, - NULL, NULL, - _P3_, - }, - { - "TCON", - HEX_DIGITS_2, - NULL, NULL, - _TCON_, - }, - { - "TMOD", - HEX_DIGITS_2, - NULL, NULL, - _TMOD_, - }, - { - "SCON", - HEX_DIGITS_2, - NULL, NULL, - _SCON_, - }, - { - "IE", - HEX_DIGITS_2, - NULL, NULL, - _IE_, - }, - { - "IP", - HEX_DIGITS_2, - NULL, NULL, - _IP_, - }, - { - "BANK", - HEX_DIGITS_2, - regwin_read_bank, regwin_write_bank, - 0, /* Dummy */ - }, - /* R0-R7 Registers in current Bank */ - { - "R0", - HEX_DIGITS_2, - regwin_read_rx, regwin_write_rx, - _R0_, - }, - { - "R1", - HEX_DIGITS_2, - regwin_read_rx, regwin_write_rx, - _R1_, - }, - { - "R2", - HEX_DIGITS_2, - regwin_read_rx, regwin_write_rx, - _R2_, - }, - { - "R3", - HEX_DIGITS_2, - regwin_read_rx, regwin_write_rx, - _R3_, - }, - { - "R4", - HEX_DIGITS_2, - regwin_read_rx, regwin_write_rx, - _R4_, - }, - { - "R5", - HEX_DIGITS_2, - regwin_read_rx, regwin_write_rx, - _R5_, - }, - { - "R6", - HEX_DIGITS_2, - regwin_read_rx, regwin_write_rx, - _R6_, - }, - { - "R7", - HEX_DIGITS_2, - regwin_read_rx, regwin_write_rx, - _R7_, - }, -}; - /* Creating a model */ static GtkListStore * regwin_init_store(void) { GtkTreeIter iter; - int rows; + int row; int col; GtkListStore *store; GType col_types[N_COLUMNS]; - for (col = 0; col < N_COLUMNS; col++) { + /* 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 new row. */ + /* Add rows. */ + for (row = 0; row < DATA_ROWS; row++) gtk_list_store_append(store, &iter); - } return store; } -static int -regwin_find_row(const char *regname) -{ - int row; - - for (row = 0; row < DATA_ROWS; row++) { - if (strcmp(regwin_infos[row].name, regname) == 0) - return row; - } - - return -1; /* Programming error. */ -} - static void regwin_cell_edited(GtkCellRendererText *cell, gchar *path_string, gchar *new_str, gpointer model) @@ -322,7 +80,7 @@ regwin_cell_edited(GtkCellRendererText *cell, gchar *path_string, int old; int new; char *str; - int row; + struct regwin_infos_t *regwin_infos; if (!model) { g_error("Unable to get model from cell renderer"); @@ -335,29 +93,28 @@ regwin_cell_edited(GtkCellRendererText *cell, gchar *path_string, gtk_tree_model_get(model, &iter, COL_NAME, &str, -1); log_info("Register: %s", str); - row = regwin_find_row(str); - log_info(" row = %d", row); + regwin_infos = sfr_get_infos(str); /* Read current (old) value. */ gtk_tree_model_get(model, &iter, COL_VAL, &str, -1); old = asciihex2int(str); - if (regwin_infos[row].w == 2) + if (regwin_infos->w == 2) log_info(" old value: $%02X", old); - else if (regwin_infos[row].w == 4) + else if (regwin_infos->w == 4) log_info(" old value: $%04X", old); new = asciihex2int(new_str); - if (regwin_infos[row].w == 2) { + if (regwin_infos->w == 2) { if ((new < 0) || (new > 0xFF)) { log_info(" new value: out of range"); new = old; /* Put back old value... */ } else { log_info(" new value: $%02X", new); } - } else if (regwin_infos[row].w == 4) { + } else if (regwin_infos->w == 4) { if ((new < 0) || (new > 0xFFFF)) { log_info(" new value: out of range"); new = old; /* Put back old value... */ @@ -366,30 +123,18 @@ regwin_cell_edited(GtkCellRendererText *cell, gchar *path_string, } } - /* Convert new value to text. */ - int2asciihex(new, str, regwin_infos[row].w); - /* Store new value in emulator register. */ - if (regwin_infos[row].write_func == NULL) { - /* - * Write register value using generic 8 or 16 bits write - * function, depending on width. - */ - regwin_write(regwin_infos[row].param, new, regwin_infos[row].w); - } else { - /* Write register value using custom function pointer. */ - regwin_infos[row].write_func(regwin_infos[row].param, new); - } + regwin_write(regwin_infos, new); /* Store new value in gtk model. */ + int2asciihex(new, str, regwin_infos->w); gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_VAL, str, -1); /* * Make sure to update all windows. * For example, R0-R7 values depends on internal memory values. */ - regwin_Show(); - memwin_DumpD("0"); + emugtk_UpdateDisplay(); }; static void @@ -432,7 +177,7 @@ regwin_init(void) GtkWidget *scrollwin; GtkListStore *store; - frame = gtk_frame_new("Registers"); + frame = gtk_frame_new(LIST_VIEW_NAME); scrollwin = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwin), @@ -467,7 +212,7 @@ regwin_init(void) /* Show registers. */ void -regwin_Show(void) +regwin_refresh(void) { int row; GtkListStore *store; @@ -479,6 +224,7 @@ regwin_Show(void) GtkTreeIter iter; int val; char str[8]; + struct regwin_infos_t *regwin_infos; if (row == 0) { /* Get first row in list store */ @@ -495,24 +241,15 @@ regwin_Show(void) return; } - if (regwin_infos[row].read_func == NULL) { - /* - * Read register value using generic 8 or 16 bits read - * function, depending on width. - */ - val = regwin_read(regwin_infos[row].param, - regwin_infos[row].w); - } else { - /* Read register value using custom function pointer. */ - val = regwin_infos[row].read_func( - regwin_infos[row].param); - } + regwin_infos = sfr_get_infos_from_row(row); + + val = regwin_read(row); /* Convert to specified number of hex digits. */ - int2asciihex(val, str, regwin_infos[row].w); + int2asciihex(val, str, regwin_infos->w); gtk_list_store_set(store, &iter, - COL_NAME, regwin_infos[row].name, + COL_NAME, regwin_infos->name, COL_VAL, str, -1); }