/* -*-c-*- -------------- mixgtk_mixvm.c : * Implementation of the functions declared in mixgtk_mixvm.h * ------------------------------------------------------------------ * Last change: Time-stamp: "01/03/08 23:22:49 jose" * ------------------------------------------------------------------ * Copyright (C) 2001 Free Software Foundation, Inc. * * This program 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. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include #include "mixgtk_widgets.h" #include "mixgtk_mixvm.h" /* register widgets */ #define REGISTER_NO_ (MIXGTK_WIDGET_rI6 - MIXGTK_WIDGET_rA + 1) static GtkEntry *reg_entries_[REGISTER_NO_]; static GtkToggleButton *over_button_; static GtkToggleButton *cmp_buttons_[3]; static GtkCList *memory_; static mix_vm_t *vm_; static void update_register_ (mixgtk_widget_id_t reg) { static gchar BUFFER[20]; switch (reg) { case MIXGTK_WIDGET_rA: mix_word_print_to_buffer (mix_vm_get_rA (vm_), BUFFER); break; case MIXGTK_WIDGET_rX: mix_word_print_to_buffer (mix_vm_get_rX (vm_), BUFFER); break; case MIXGTK_WIDGET_rJ: mix_short_print_to_buffer (mix_vm_get_rJ (vm_), BUFFER); break; case MIXGTK_WIDGET_rI1: case MIXGTK_WIDGET_rI2: case MIXGTK_WIDGET_rI3: case MIXGTK_WIDGET_rI4: case MIXGTK_WIDGET_rI5: case MIXGTK_WIDGET_rI6: mix_short_print_to_buffer (mix_vm_get_rI (vm_, reg - MIXGTK_WIDGET_rI1 + 1), BUFFER); break; default: g_assert_not_reached (); } gtk_entry_set_text (reg_entries_[reg - MIXGTK_WIDGET_rA], BUFFER); } static void on_mem_adj_change_ (GtkAdjustment *adj) { mixgtk_mixvm_update_cells (); } /* initialise the mixvm widgets */ gboolean mixgtk_mixvm_init (mix_vm_t *vm) { int k; gchar *text[] = {"", ""}; GtkWidget *scrol; GtkAdjustment *adj; g_return_val_if_fail (vm != NULL, FALSE); vm_ = vm; for (k = 0; k < REGISTER_NO_; ++k) { reg_entries_[k] = GTK_ENTRY (mixgtk_widget_factory_get (MIXGTK_WIDGET_rA + k)); g_return_val_if_fail (reg_entries_[k] != NULL, FALSE); } over_button_ = GTK_TOGGLE_BUTTON (mixgtk_widget_factory_get (MIXGTK_WIDGET_OVER)); g_return_val_if_fail (over_button_ != NULL, FALSE); for (k = 0; k < 3; ++k) { cmp_buttons_[k] = GTK_TOGGLE_BUTTON (mixgtk_widget_factory_get (MIXGTK_WIDGET_CMP_L +k)); g_return_val_if_fail (cmp_buttons_[k] != NULL, FALSE); } memory_ = GTK_CLIST (mixgtk_widget_factory_get (MIXGTK_WIDGET_CELLS)); g_return_val_if_fail (memory_ != NULL, FALSE); gtk_clist_set_column_justification (memory_, 0, GTK_JUSTIFY_CENTER); gtk_clist_set_column_justification (memory_, 1, GTK_JUSTIFY_CENTER); gtk_clist_freeze (memory_); for (k = 0; k< MIX_VM_CELL_NO; ++k) { gchar buffer[20]; sprintf (buffer, "%04d", k); text[0] = buffer; gtk_clist_append (memory_, text); } gtk_clist_thaw (memory_); scrol = mixgtk_widget_factory_get_by_name ("memory_scroll"); adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrol)); gtk_signal_connect (GTK_OBJECT (adj), "value_changed", GTK_SIGNAL_FUNC (on_mem_adj_change_), NULL); mixgtk_mixvm_update_vm_widgets (); return TRUE; } /* update register widgets */ void mixgtk_mixvm_update_registers (void) { gint k; for (k = MIXGTK_WIDGET_rA; k <= MIXGTK_WIDGET_rI6; ++k) update_register_ (k); } /* update the overflow toggle */ void mixgtk_mixvm_update_over_toggle (void) { g_assert (over_button_ != NULL); gtk_toggle_button_set_active (over_button_, mix_vm_get_overflow (vm_)); } /* update the comparison flag */ void mixgtk_mixvm_update_cmp (void) { gint toggle; toggle = mix_vm_get_cmpflag (vm_); gtk_toggle_button_set_active (cmp_buttons_[toggle], TRUE); } /* update the memory cells */ void mixgtk_mixvm_update_cells (void) { static gchar BUFFER[20]; gint k = 0; gtk_clist_freeze (memory_); while (gtk_clist_row_is_visible (memory_, k) == GTK_VISIBILITY_NONE) ++k; while (gtk_clist_row_is_visible (memory_, k) != GTK_VISIBILITY_NONE) { mix_word_print_to_buffer (mix_vm_get_addr_contents (vm_, k), BUFFER); gtk_clist_set_text (memory_, k, 1, BUFFER); ++k; } gtk_clist_thaw (memory_); } /* update all mixvm widgets */ void mixgtk_mixvm_update_vm_widgets (void) { mixgtk_mixvm_update_registers (); mixgtk_mixvm_update_over_toggle (); mixgtk_mixvm_update_cmp (); mixgtk_mixvm_update_cells (); } /* update cmp flag */ void on_cmp_e_toggled (GtkWidget *widget, gpointer data) { if (GTK_TOGGLE_BUTTON (widget)->active) mix_vm_set_cmpflag (vm_, mix_EQ); } void on_cmp_l_toggled (GtkWidget *widget, gpointer data) { if (GTK_TOGGLE_BUTTON (widget)->active) mix_vm_set_cmpflag (vm_, mix_LESS); } void on_cmp_g_toggled (GtkWidget *widget, gpointer data) { if (GTK_TOGGLE_BUTTON (widget)->active) mix_vm_set_cmpflag (vm_, mix_GREAT); } void on_overflow_toggled (GtkWidget *widget, gpointer data) { mix_vm_set_overflow (vm_, GTK_TOGGLE_BUTTON (widget)->active); }