00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef MIMAMEM_H
00023 #define MIMAMEM_H
00024
00025 #ifdef HAVE_CONFIG_H
00026 #include <config.h>
00027 #endif
00028
00029 #include <gtkmm/frame.h>
00030 #include <gtkmm/box.h>
00031 #include <gtkmm/scrolledwindow.h>
00032 #include <gtkmm/treemodel.h>
00033 #include <gtkmm/treeview.h>
00034 #include <gtkmm/liststore.h>
00035 #include <gtkmm/dialog.h>
00036 #include <gtkmm/table.h>
00037 #include <gtkmm/alignment.h>
00038 #include <gtkmm/label.h>
00039
00040 #include <gtkmm/uimanager.h>
00041
00042 #include <sigc++/sigc++.h>
00043 #include <glibmm.h>
00044 #include <map>
00045
00046 #include <mima.h>
00047 #include "mimaWidgets.h"
00048 #include "mimaChildWindow.h"
00049
00050
00051 namespace MimaGtk {
00052 class MimaMem;
00053 class MimaMemMenu;
00054 class MimaMemWnd;
00055 }
00056
00058 namespace MimaGtk {
00059
00061
00064 class MimaMem : public Gtk::Frame
00065 {
00066 private:
00067 enum RESPONSE {
00068 OK,
00069 APPLY,
00070 CLOSE
00071 };
00072
00074 class DialogMemoryRange : public Gtk::Dialog
00075 {
00076 protected:
00077
00078
00079
00080
00081 Gtk::Table m_table;
00082 Gtk::Alignment m_align_start,
00083 m_align_end;
00084 Gtk::Label m_label_start,
00085 m_label_end;
00086 EntryInt m_entry_start,
00087 m_entry_end;
00088 void activate();
00089
00090 public:
00091 DialogMemoryRange();
00092 DialogMemoryRange(Glib::ustring title);
00093 ~DialogMemoryRange();
00094
00095 void init();
00096 int get_start();
00097 int get_end();
00098 void set_start(int start) { m_entry_start.set_value(start); };
00099 void set_end(int end) { m_entry_end.set_value(end); };
00100 };
00101
00102
00103
00104
00105
00106 typedef Gtk::TreeModel::Children type_children;
00107 typedef sigc::signal<int> type_signal_int;
00108 typedef sigc::signal<int, int> type_signal_int_int;
00109 typedef sigc::signal<bool, int> type_signal_bool_int;
00110 typedef sigc::signal<void, int, int> type_signal_void_int_int;
00111 typedef sigc::signal<type_memory_map, int, int> type_signal_memmap_int_int;
00112 typedef sigc::signal<type_breakpoint_list> type_signal_breakpoint_list_void;
00113
00114
00115
00116
00117
00118 int m_addr_start,
00119 m_show_n_words,
00120 m_memsize,
00121 m_iar;
00122 std::map<int, bool> m_breakpoints;
00123 DialogMemoryRange m_dialog;
00124
00125
00126
00127
00128
00129 void on_dialog_response(int response);
00130
00131 protected:
00133 class ModelColumns : public Gtk::TreeModel::ColumnRecord
00134 {
00135 public:
00136 ModelColumns()
00137 {
00138
00139
00140
00141 add(m_col_addr);
00142 add(m_col_value);
00143 }
00144 Gtk::TreeModelColumn<int> m_col_addr;
00145 Gtk::TreeModelColumn<int> m_col_value;
00146 };
00147
00148 ModelColumns m_Columns;
00149
00150
00151
00152
00153
00154 type_signal_int m_signal_get_memsize;
00155 type_signal_int m_signal_get_iar;
00156 type_signal_int_int m_signal_get_memory;
00157 type_signal_bool_int m_signal_get_breakpoint;
00158 type_signal_bool_int m_signal_toggle_breakpoint;
00159 type_signal_void_int_int m_signal_set_memory;
00160 type_signal_memmap_int_int m_signal_get_memmap;
00161 type_signal_breakpoint_list_void m_signal_get_breakpoint_list;
00162
00163
00164
00165
00166
00168 virtual void on_edited(const Glib::ustring& path_string, const Glib::ustring& new_text);
00170 void cell_data(Gtk::CellRenderer *renderer, const Gtk::TreeIter &iter);
00171
00172
00173
00174
00175
00176 Gtk::ScrolledWindow m_scrolledWindow;
00177 Gtk::TreeView m_treeView;
00178 Glib::RefPtr<Gtk::ListStore> m_refTreeModel;
00179 Gtk::CellRendererText *m_cellrenderer_addr, *m_cellrenderer_value;
00180
00181 public:
00182 MimaMem();
00183 ~MimaMem();
00184
00185
00186
00187
00188
00190 type_signal_int signal_get_iar() { return m_signal_get_iar; };
00192 type_signal_int signal_get_memsize() { return m_signal_get_memsize; };
00194 type_signal_int_int signal_get_memory() { return m_signal_get_memory; };
00196 type_signal_memmap_int_int signal_get_memory_map() { return m_signal_get_memmap; };
00198 type_signal_bool_int signal_get_breakpoint() { return m_signal_get_breakpoint; };
00199 type_signal_breakpoint_list_void signal_get_breakpoint_list() { return m_signal_get_breakpoint_list; };
00201 type_signal_bool_int signal_toggle_breakpoint() { return m_signal_toggle_breakpoint;};
00203 type_signal_void_int_int signal_set_memory() { return m_signal_set_memory; };
00204
00205
00206
00207
00208
00210 void show_dialog_memory_range();
00212 void set_memory_range(int start, int n_words = 16);
00214 void on_iar_changed(int iar);
00216 void on_state_changed(MimaSim::State state);
00218 void on_memory_value_changed(int address, int value);
00220 void on_memory_breakpoint_changed(int address, bool breakpoint);
00222 void on_memsize_changed(int size);
00224 void on_memory_clear();
00225
00227 int get_current_address();
00229 int get_current_address_end() const
00230 { return m_addr_start + m_show_n_words - 1; }
00231
00232 void refreshModel();
00233 };
00234
00235
00237 class MimaMemMenu
00238 {
00239 private:
00240 typedef sigc::signal<void> type_signal_void;
00241
00242 protected:
00243 type_signal_void
00244 m_signal_memory_range,
00245 m_signal_breakpoint_add,
00246 m_signal_breakpoint_remove,
00247 m_signal_breakpoint_remove_all;
00248
00249
00250
00251
00252
00253 void on_menu_view_memory_range();
00254 void on_menu_breakpoint_add();
00255 void on_menu_breakpoint_remove();
00256 void on_menu_breakpoint_remove_all();
00257
00258 public:
00259 MimaMemMenu();
00260 ~MimaMemMenu() {};
00261
00262 Glib::RefPtr<Gtk::UIManager> UIManager;
00263 Glib::RefPtr<Gtk::ActionGroup> ActionGroup;
00264
00265
00266
00267
00268
00269 type_signal_void signal_memory_range() { return m_signal_memory_range; };
00270 type_signal_void signal_breakpoint_add() { return m_signal_breakpoint_add; };
00271 type_signal_void signal_breakpoint_remove() { return m_signal_breakpoint_remove; };
00272 type_signal_void signal_breakpoint_remove_all() { return m_signal_breakpoint_remove_all; };
00273
00274 };
00275
00276
00278
00280 class MimaMemWnd : public MimaChildWindow
00281 {
00282 private:
00283
00284
00285
00286
00287
00288 sigc::connection
00289
00290 m_connection_memory_range,
00291
00292 m_connection_breakpoint_add,
00293 m_connection_breakpoint_remove,
00294 m_connection_breakpoint_remove_all,
00295
00296 m_connection_iar_changed,
00297 m_connection_memory_value_changed,
00298 m_connection_memory_breakpoint_changed,
00299 m_connection_memory_clear,
00300
00301 m_connection_get_iar,
00302 m_connection_set_memory,
00303 m_connection_get_memory,
00304 m_connection_get_memory_map,
00305 m_connection_get_breakpoint_list,
00306 m_connection_get_breakpoint;
00307
00308 protected:
00309 virtual bool ask_to_save();
00310
00312 static int m_count;
00313
00314
00315
00316
00317
00318 MimaMemMenu m_mimaMemMenu;
00319 MimaMem m_mimaMemFrame;
00320
00321 Gtk::VBox m_vbox;
00322
00323
00324
00325
00326
00327 void on_breakpoint_add();
00328 void on_breakpoint_remove();
00329 void on_breakpoint_remove_all();
00330
00331 public:
00332 MimaMemWnd(MimaSim::Mima *_mima);
00333 ~MimaMemWnd();
00334
00335 virtual ChildWindowType type()
00336 { return MEM; }
00337
00338 int get_current_address()
00339 { return m_mimaMemFrame.get_current_address(); }
00340 int get_current_address_end()
00341 { return m_mimaMemFrame.get_current_address_end(); }
00342 };
00343
00344 }
00345
00346 #endif // MIMAMEM_H