/home/martin/src/mimasim/src/mima_gtk/mimaMem.h

Go to the documentation of this file.
00001 //$Id: mimaMem.h,v 1.11 2006/11/04 17:09:02 der_martin Exp $
00002 /*
00003  * mimasim -- a simulator of a minimal microprocessor system
00004  * Copyright (C) 2006 Martin Grandrath <gr@ndrath.de>
00005  *
00006  * This program is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU General Public License as
00008  * published by the Free Software Foundation; either version 2 of the
00009  * License, or (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful, but
00012  * WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014  * General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software
00018  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
00019  * 02110-1301, USA.
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" // for EntryInt
00048 #include "mimaChildWindow.h"
00049 
00050 //declare classes
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                           * Member widgets
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                 * private typedefs
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                 * private attributes
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                 * private members
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                                     * add columns
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                 * signals
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                 * protected members
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                 * child widgets
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; // columns are manually rendered
00180 
00181           public:
00182                MimaMem();
00183                ~MimaMem();
00184 
00185                /*
00186                 * signal accessors
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                 * public members
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                 * menu handlers
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                 * signal accessors
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                 * signal connections
00286                 * ==================
00287                 */
00288                sigc::connection
00289                     /* MimaMemMenu -> MimaMem */
00290                     m_connection_memory_range,
00291                     /* MimaMemMenu -> MimaMemWnd */
00292                     m_connection_breakpoint_add,
00293                     m_connection_breakpoint_remove,
00294                     m_connection_breakpoint_remove_all,
00295                     /* Mima -> MimaMem */
00296                     m_connection_iar_changed,
00297                     m_connection_memory_value_changed,
00298                     m_connection_memory_breakpoint_changed,
00299                     m_connection_memory_clear,
00300                     /* MimaMem -> Mima */
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                 * child widgets
00316                 * =============
00317                 */
00318                MimaMemMenu m_mimaMemMenu;
00319                MimaMem     m_mimaMemFrame;
00320 
00321                Gtk::VBox   m_vbox;
00322 
00323                /*
00324                 * signal handlers
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

Generated on Sat Nov 4 19:40:57 2006 for mimasim by  doxygen 1.4.7