Change test output expected string layout
[emu8051.git] / src / regwin.c
index 0bd4156..8c4cd4d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * 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
 {
@@ -41,227 +49,94 @@ 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)
 {
@@ -278,6 +153,17 @@ 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);
@@ -291,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),
@@ -326,7 +212,7 @@ regwin_init(void)
 
 /* Show registers. */
 void
-regwin_Show(void)
+regwin_refresh(void)
 {
        int row;
        GtkListStore *store;
@@ -338,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 */
@@ -354,17 +241,15 @@ regwin_Show(void)
                        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);
        }