Fix code indentation
[emu8051.git] / src / regwin.c
index e3b79d7..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
 {
@@ -45,238 +49,6 @@ 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)
@@ -300,19 +72,6 @@ regwin_init_store(void)
        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)
@@ -321,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");
@@ -334,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... */
@@ -365,31 +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();
-       pgmwin_Disasm();
+       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);
        }