Index: src/callbacks.c =================================================================== --- src/callbacks.c (revision 110) +++ src/callbacks.c (working copy) @@ -31,6 +31,7 @@ #include "bridge.h" #include "asm-listing.h" #include "file-op.h" +#include "gui-list-memory.h" gint start_addr = 0x4200; @@ -355,6 +356,8 @@ } base[(gint) gtk_spin_button_get_value (sb)] = val; + if ( !strcmp(entry_name,"main_mem_entry") ) + gui_list_memory_update_single ( (gint) gtk_spin_button_get_value (sb) ); } static void @@ -546,3 +549,44 @@ swd = lookup_widget (GTK_WIDGET (button), "window_start"); gtk_widget_destroy (swd); } + +void +on_mem_list_start_clicked (GtkButton * button, gpointer user_data) +{ + GtkWidget *start_entry; + gint start_addr; + gchar *text; + + start_entry = lookup_widget (app->window_main, "mem_list_start"); + g_assert (start_entry); + + if (!asm_util_parse_number (text = (gchar *)gtk_entry_get_text (GTK_ENTRY (start_entry)),&start_addr)) + { + gui_app_show_msg (GTK_MESSAGE_INFO, + _("Enter a valid number within range")); + return; + } + gui_list_memory_set_start (start_addr); + gui_list_memory_update (); + text[strlen (text) ] = 'h'; + gtk_entry_set_text (GTK_ENTRY (start_entry), text); +} + +void +on_mem_list_start_changed (GtkEntry *entry, gpointer user_data) +{ + gint start_addr; + gchar *text; + g_assert (entry); + + if (!asm_util_parse_number (text = (gchar *)gtk_entry_get_text (GTK_ENTRY (entry)),&start_addr)) + { + gui_app_show_msg (GTK_MESSAGE_INFO, + _("Enter a valid number within range")); + return; + } + gui_list_memory_set_start (start_addr); + gui_list_memory_update (); + text[strlen (text) ] = 'h'; + gtk_entry_set_text (GTK_ENTRY (entry), text); +} Index: src/callbacks.h =================================================================== --- src/callbacks.h (revision 110) +++ src/callbacks.h (working copy) @@ -116,3 +116,7 @@ void on_start_but_close_clicked (GtkButton * button, gpointer user_data); void on_listing_save_clicked (GtkButton * button, gpointer user_data); + +void on_mem_list_start_clicked (GtkButton * button, gpointer user_data); + +void on_mem_list_start_changed (GtkEntry *entry, gpointer user_data); Index: src/gui-list-memory.c =================================================================== --- src/gui-list-memory.c (revision 0) +++ src/gui-list-memory.c (revision 0) @@ -0,0 +1,204 @@ +/* + Copyright (C) 2003 Sridhar Ratnakumar + + This file is part of GNUSim8085. + + GNUSim8085 is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + GNUSim8085 is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNUSim8085; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "gui-list-memory.h" + +static GtkTreeStore *store = NULL; +static GtkTreeView *view = NULL; +static gboolean child_position = FALSE; +static GtkTreeIter last_iter; +static GtkTreeIter mark_iter; +static eef_addr_t start = 0; + +enum + { + C_ADDR_HEX, + C_ADDR, + C_DATA, + N_COLS + }; + +void +on_mem_list_data_edited (GtkCellRendererText *renderer, + gchar *path, + gchar *new_text, + gpointer user_data) +{ + GtkTreeIter iter; + gtk_tree_model_get_iter_from_string ( GTK_TREE_MODEL(store), &iter, path); + + gint val; + gint addr; + if( !asm_util_parse_number(new_text, &val)) + val = 0; + + gtk_tree_store_set (store, &iter, C_DATA, val, -1); + gtk_tree_model_get (GTK_TREE_MODEL(store), &iter, C_ADDR, &addr, -1); + sys.mem[addr] = val; +} + + +static void +_add_column (GtkTreeView * view, gint id, gchar * title) +{ + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + g_assert (view); + + renderer = gtk_cell_renderer_text_new (); + + if ( !strcmp(title, _("Data")) ) + { + g_object_set ((gpointer) renderer, + "editable", TRUE, + NULL); + g_signal_connect ((gpointer) renderer, "edited", + G_CALLBACK (on_mem_list_data_edited), + NULL); + } + + column = gtk_tree_view_column_new_with_attributes (title, + renderer, + "text", id, NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); +} + +static void +create_me (void) +{ + /* create store */ + store = gtk_tree_store_new (N_COLS, + G_TYPE_STRING, + G_TYPE_INT, + G_TYPE_INT); + g_assert (store); + + /* create view */ + view = GTK_TREE_VIEW(gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)) ); + g_assert (view); + + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(view), TRUE); + gtk_widget_show (GTK_WIDGET (view)); + + /* add column */ + _add_column (view, C_ADDR_HEX, _("Address (Hex)")); + _add_column (view, C_ADDR, _("Address")); + _add_column (view, C_DATA, _("Data")); + +} + +void +gui_list_memory_attach_me (void) +{ + GtkWidget *cont; + + cont = lookup_widget (app->window_main, "main_memory_scroll"); + g_assert (cont); + + create_me (); + + gtk_container_add (GTK_CONTAINER (cont), GTK_WIDGET (view)); + +} + +void +gui_list_memory_clear (void) +{ + gtk_tree_store_clear (store); +} + +void +gui_list_memory_child_state (gboolean yes) +{ + child_position = yes; + if ( yes ) + mark_iter = last_iter; +} + +void +gui_list_memory_set_start ( gint st ) +{ + if ( st >= 0 && st < 65536 ) + start = st; +} + +static void +gui_list_memory_add (eef_addr_t addr, eef_data_t val) +{ + GtkTreeIter iter; + gchar addr_str[5] = "XXXX"; + guint8 s1, s2; + g_assert (store); + + gtk_tree_store_append (store, &iter, NULL); + + /* address */ + eef_split16 (addr, &s1, &s2); + gui_util_gen_hex (s1, addr_str, addr_str+1); + gui_util_gen_hex (s2, addr_str+2, addr_str+3); + + gtk_tree_store_set (store, &iter, + C_ADDR_HEX, addr_str, + C_ADDR, addr, + C_DATA, val, + -1); + + last_iter = iter; +} + +void +gui_list_memory_initialize () +{ + eef_addr_t i = 0; + for( i = 0; i < MAX_LIST_LEN && i+start <= EEF_ADDR_T_MAX ; i++) + { + gui_list_memory_add (i+start, sys.mem[i + start]); + } +} + +void +gui_list_memory_update () +{ + gui_list_memory_clear(); + gui_list_memory_initialize(); +} + +void +gui_list_memory_update_single (eef_addr_t addr) +{ + if (addr >= start && addr < MAX(start + MAX_LIST_LEN, EEF_ADDR_T_MAX)) + { + GtkTreeIter iter; + g_assert(gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(store), &iter)); + + gint pos = addr -start; + gint n = 0; + while ( n++ < pos ) + gtk_tree_model_iter_next ( GTK_TREE_MODEL(store), &iter); + + gtk_tree_store_set (store, &iter, + C_DATA, sys.mem[addr], + -1); + } +} Index: src/gui-list-memory.h =================================================================== --- src/gui-list-memory.h (revision 0) +++ src/gui-list-memory.h (revision 0) @@ -0,0 +1,47 @@ +/* + Copyright (C) 2003 Sridhar Ratnakumar + + This file is part of GNUSim8085. + + GNUSim8085 is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + GNUSim8085 is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNUSim8085; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + + +#ifndef __GUI_LIST_MEMORY_H__ +#define __GUI_LIST_MEMORY_H__ + +#include +#include "gui-app.h" +#include "8085.h" + +G_BEGIN_DECLS + +#define MAX_LIST_LEN 1000 + +void gui_list_memory_attach_me (void); + +void gui_list_memory_clear (void); + +void gui_list_memory_set_start (gint); + +void gui_list_memory_initialize (); + +void gui_list_memory_update (); + +void gui_list_memory_update_single (eef_addr_t addr); + +G_END_DECLS + +#endif /* __GUI_LIST_MEMORY_H__*/ Index: src/gui-view.c =================================================================== --- src/gui-view.c (revision 110) +++ src/gui-view.c (working copy) @@ -23,6 +23,7 @@ #include "asm-source.h" #include "gui-list-data.h" #include "gui-list-stack.h" +#include "gui-list-memory.h" #include "asm-ds-symtable.h" typedef struct @@ -259,4 +260,5 @@ /* update data, stack lists */ gui_view_update_data (); gui_view_update_stack (); + gui_list_memory_update (); } Index: src/interface.c =================================================================== --- src/interface.c (revision 110) +++ src/interface.c (working copy) @@ -249,6 +249,16 @@ GtkWidget *main_progressbar; GtkWidget *main_statusbar; GtkWidget *status_box; + GtkWidget *main_memory_frame; + GtkWidget *label177; + GtkWidget *label178; + GtkWidget *alignment12; + GtkWidget *main_memory_scroll; + GtkWidget *vbox19; + GtkWidget *hbox48; + GtkWidget *label179; + GtkWidget *mem_list_start; + GtkWidget *button12; GtkTooltips *tooltips; GtkActionGroup *action_group; GtkUIManager *ui_manager; @@ -915,7 +925,50 @@ gtk_widget_show (label168); gtk_box_pack_start (GTK_BOX (hbox40), label168, FALSE, FALSE, 0); gtk_label_set_justify (GTK_LABEL (label168), GTK_JUSTIFY_LEFT); + + main_memory_frame = gtk_frame_new (NULL); + gtk_widget_show (main_memory_frame); + gtk_container_add (GTK_CONTAINER (notebook5), main_memory_frame); + gtk_container_set_border_width (GTK_CONTAINER (main_memory_frame), 5); + label178 = gtk_label_new (_("Memory")); + gtk_widget_show (label178); + gtk_frame_set_label_widget (GTK_FRAME (main_memory_frame), label178); + gtk_label_set_justify (GTK_LABEL (label178), GTK_JUSTIFY_LEFT); + + label177 = gtk_label_new (_("Memory")); + gtk_widget_show (label177); + gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook5), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook5), 3), label177); + + alignment12 = gtk_alignment_new (0.50, 0.50, 1.00, 1.00); + gtk_widget_show (alignment12); + gtk_container_add (GTK_CONTAINER (main_memory_frame), alignment12); + + vbox19 = gtk_vbox_new (FALSE, 2); + gtk_widget_show (vbox19); + gtk_container_add (GTK_CONTAINER (alignment12), vbox19); + + hbox48 = gtk_hbox_new (FALSE, 3); + gtk_widget_show (hbox48); + gtk_box_pack_start (GTK_BOX (vbox19), hbox48, FALSE, TRUE, 0); + + label179 = gtk_label_new (_("Start")); + gtk_widget_show (label179); + gtk_box_pack_start (GTK_BOX (hbox48), label179, FALSE, FALSE, 3); + + mem_list_start = gtk_entry_new (); + gtk_widget_show (mem_list_start); + gtk_box_pack_start (GTK_BOX (hbox48), mem_list_start, TRUE, TRUE, 5); + + button12 = gtk_button_new_from_stock ("gtk-ok"); + gtk_widget_show (button12); + gtk_box_pack_start (GTK_BOX (hbox48), button12, FALSE, FALSE, 5); + + main_memory_scroll = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_show (main_memory_scroll); + gtk_container_add (GTK_CONTAINER (vbox19), main_memory_scroll); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (main_memory_scroll), GTK_SHADOW_OUT); + main_progressbar = gtk_progress_bar_new(); main_statusbar = gtk_statusbar_new(); gtk_widget_show (main_progressbar); @@ -953,6 +1006,14 @@ g_signal_connect ((gpointer) main_mem_update, "clicked", G_CALLBACK (on_main_mem_update_clicked), NULL); + + g_signal_connect ((gpointer) button12, "clicked", + G_CALLBACK (on_mem_list_start_clicked), + NULL); + + g_signal_connect ((gpointer) mem_list_start, "activate", + G_CALLBACK (on_mem_list_start_changed), + NULL); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (window_main, window_main, "window_main"); @@ -1077,6 +1138,16 @@ GLADE_HOOKUP_OBJECT (window_main, hbox40, "hbox40"); GLADE_HOOKUP_OBJECT (window_main, image371, "image371"); GLADE_HOOKUP_OBJECT (window_main, label168, "label168"); + GLADE_HOOKUP_OBJECT (window_main, main_memory_frame, "main_memory_frame"); + GLADE_HOOKUP_OBJECT (window_main, alignment12, "alignment12"); + GLADE_HOOKUP_OBJECT (window_main, vbox19, "vbox19"); + GLADE_HOOKUP_OBJECT (window_main, hbox48, "hbox48"); + GLADE_HOOKUP_OBJECT (window_main, label179, "label179"); + GLADE_HOOKUP_OBJECT (window_main, mem_list_start, "mem_list_start"); + GLADE_HOOKUP_OBJECT (window_main, button12, "button12"); + GLADE_HOOKUP_OBJECT (window_main, main_memory_scroll, "main_memory_scroll"); + GLADE_HOOKUP_OBJECT (window_main, label178, "label178"); + GLADE_HOOKUP_OBJECT (window_main, label177, "label177"); GLADE_HOOKUP_OBJECT (window_main, main_progressbar, "main_progressbar"); GLADE_HOOKUP_OBJECT (window_main, main_statusbar, "main_statusbar"); GLADE_HOOKUP_OBJECT_NO_REF (window_main, tooltips, "tooltips"); Index: src/main.c =================================================================== --- src/main.c (revision 110) +++ src/main.c (working copy) @@ -30,6 +30,7 @@ #include "gui-list-data.h" #include "gui-list-stack.h" #include "gui-keypad.h" +#include "gui-list-memory.h" #include "bridge.h" #include "callbacks.h" #include "file-op.h" @@ -55,6 +56,8 @@ gui_list_data_attach_me (); gui_list_stack_attach_me (); gui_keypad_attach_me (); + gui_list_memory_attach_me (); + gui_list_memory_initialize (); b_init (); /* Start with NEW file */