/*
- * regwin.cpp
+ * regwin.c
*
* Copyright (C) 1999 Jonathan St-André
* Copyright (C) 1999 Hugo Villeneuve <hugo@hugovil.com>
#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
{
N_COLUMNS,
};
-#define HEX_DIGITS_2 2
-#define HEX_DIGITS_4 4
-
-struct regwin_read_t {
- char *name; /* Register name */
- int w; /* Number of hex digits to display */
- unsigned int (*read_func)(int addr); /* Function pointer to read value */
- int param; /* Optional parameter to pass to read function. */
-};
-
-/* Generic read function */
-static unsigned int
-regwin_read_8(int addr)
-{
- return cpu8051_ReadD(addr);
-}
-
-/* Specific read functions for special registers. */
-
-static unsigned int
-regwin_read_pc(int dummy)
-{
- return cpu8051.pc;
-}
-
-static unsigned int
-regwin_read_dptr(int dummy)
-{
- return (cpu8051_ReadD(_DPTRHIGH_) << 8) +
- cpu8051_ReadD(_DPTRLOW_);
-}
-
-static unsigned int
-regwin_read_bank(int dummy)
-{
- return cpu8051_ReadD(_PSW_) & 0x18;
-}
-
-/* Read R0 - R7 in current bank. */
-static unsigned int
-regwin_read_rx(int addr)
-{
- int rbank = regwin_read_bank(0); /* dummy */
-
- return cpu8051_ReadD(addr + rbank);
-}
-
-/* This array defines how to read value for each register. */
-static struct regwin_read_t regwin_read[DATA_ROWS] = {
- {
- "PC",
- HEX_DIGITS_4,
- regwin_read_pc,
- 0, /* Dummy */
- },
- {
- "SP",
- HEX_DIGITS_2,
- regwin_read_8,
- _SP_,
- },
- {
- "A",
- HEX_DIGITS_2,
- regwin_read_8,
- _ACC_,
- },
- {
- "B",
- HEX_DIGITS_2,
- regwin_read_8,
- _B_,
- },
- {
- "DPTR",
- HEX_DIGITS_4,
- regwin_read_dptr,
- 0, /* Dummy */
- },
- {
- "PSW",
- HEX_DIGITS_2,
- regwin_read_8,
- _PSW_,
- },
- {
- "P0",
- HEX_DIGITS_2,
- regwin_read_8,
- _P0_,
- },
- {
- "P1",
- HEX_DIGITS_2,
- regwin_read_8,
- _P1_,
- },
- {
- "P2",
- HEX_DIGITS_2,
- regwin_read_8,
- _P2_,
- },
- {
- "P3",
- HEX_DIGITS_2,
- regwin_read_8,
- _P3_,
- },
- {
- "TCON",
- HEX_DIGITS_2,
- regwin_read_8,
- _TCON_,
- },
- {
- "TMOD",
- HEX_DIGITS_2,
- regwin_read_8,
- _TMOD_,
- },
- {
- "SCON",
- HEX_DIGITS_2,
- regwin_read_8,
- _SCON_,
- },
- {
- "IE",
- HEX_DIGITS_2,
- regwin_read_8,
- _IE_,
- },
- {
- "IP",
- HEX_DIGITS_2,
- regwin_read_8,
- _IP_,
- },
- {
- "BANK",
- HEX_DIGITS_2,
- regwin_read_bank,
- 0, /* Dummy */
- },
- /* R0-R7 Registers in current Bank */
- {
- "R0",
- HEX_DIGITS_2,
- regwin_read_rx,
- _R0_,
- },
- {
- "R1",
- HEX_DIGITS_2,
- regwin_read_rx,
- _R1_,
- },
- {
- "R2",
- HEX_DIGITS_2,
- regwin_read_rx,
- _R2_,
- },
- {
- "R3",
- HEX_DIGITS_2,
- regwin_read_rx,
- _R3_,
- },
- {
- "R4",
- HEX_DIGITS_2,
- regwin_read_rx,
- _R4_,
- },
- {
- "R5",
- HEX_DIGITS_2,
- regwin_read_rx,
- _R5_,
- },
- {
- "R6",
- HEX_DIGITS_2,
- regwin_read_rx,
- _R6_,
- },
- {
- "R7",
- HEX_DIGITS_2,
- regwin_read_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 void
+regwin_cell_edited(GtkCellRendererText *cell, gchar *path_string,
+ gchar *new_str, gpointer model)
+{
+ GtkTreeIter iter;
+ int old;
+ int new;
+ char *str;
+ struct regwin_infos_t *regwin_infos;
+
+ if (!model) {
+ g_error("Unable to get model from cell renderer");
+ }
+
+ /* Get the iterator */
+ gtk_tree_model_get_iter_from_string(model, &iter, path_string);
+
+ /* Get register name. */
+ gtk_tree_model_get(model, &iter, COL_NAME, &str, -1);
+
+ log_info("Register: %s", str);
+ 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->w == 2)
+ log_info(" old value: $%02X", old);
+ else if (regwin_infos->w == 4)
+ log_info(" old value: $%04X", old);
+
+ new = asciihex2int(new_str);
+
+ 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->w == 4) {
+ if ((new < 0) || (new > 0xFFFF)) {
+ log_info(" new value: out of range");
+ new = old; /* Put back old value... */
+ } else {
+ log_info(" new value: $%04X", new);
+ }
+ }
+
+ /* Store new value in emulator register. */
+ 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.
+ */
+ emugtk_UpdateDisplay();
+};
+
static void
regwin_init_columns(void)
{
gtk_tree_view_append_column(GTK_TREE_VIEW(reglist), column);
/* Add Value column */
+
+ /* Create new renderer for value column (editable). */
+ renderer = gtk_cell_renderer_text_new();
+
+ /* Allow edition, align to right side. */
+ g_object_set(renderer, "editable", TRUE, "xalign", 1.0, NULL);
+
+ g_signal_connect(renderer, "edited",
+ G_CALLBACK(regwin_cell_edited),
+ gtk_tree_view_get_model(GTK_TREE_VIEW(reglist)));
+
column = gtk_tree_view_column_new_with_attributes(
"Value", renderer, "text", COL_VAL, NULL);
gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
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),
/* Show registers. */
void
-regwin_Show(void)
+regwin_refresh(void)
{
int row;
GtkListStore *store;
GtkTreeIter iter;
int val;
char str[8];
+ struct regwin_infos_t *regwin_infos;
if (row == 0) {
/* Get first row in list store */
return;
}
- /* Read register value using function pointer. */
- val = regwin_read[row].read_func(regwin_read[row].param);
+ regwin_infos = sfr_get_infos_from_row(row);
+
+ val = regwin_read(row);
/* Convert to specified number of hex digits. */
- if (regwin_read[row].w == 2)
- sprintf(str , "%.2X", (u_int8_t) val);
- else if (regwin_read[row].w == 4)
- sprintf(str , "%.4X", (u_int16_t) val);
+ int2asciihex(val, str, regwin_infos->w);
gtk_list_store_set(store, &iter,
- COL_NAME, regwin_read[row].name,
+ COL_NAME, regwin_infos->name,
COL_VAL, str,
-1);
}