2 * Implements the memory dump window.
11 #define MAX_DUMP_SIZE 4096
13 #define DUMP_DATA_TAG 0xD4B9DA7A
15 typedef struct dump_data {
22 GtkEntry *fromInput, *toInput;
23 GtkTextView *textArea;
24 GtkTextTag *changedTag;
25 GtkTextBuffer *textBuffer;
26 struct dump_data *next;
29 static dump_data_t dump_list_head = NULL;
31 gboolean on_dump_win_delete_event( GtkWidget *widget, GdkEvent *event,
33 void on_dump_win_button_view_clicked( GtkWidget *widget, gpointer user_data );
34 void dump_win_set_text( dump_data_t data, char *old_data, char *new_data );
37 void dump_window_new( void ) {
38 GtkWidget *win = create_dump_win();
39 GtkWidget *dump_view_button = (GtkWidget *)g_object_get_data(G_OBJECT(win), "dump_view_button");
40 dump_data_t data = malloc( sizeof(struct dump_data) );
41 data->_tag = DUMP_DATA_TAG;
42 data->fromInput = (GtkEntry *)g_object_get_data(G_OBJECT(win), "dump_from");
43 data->toInput = (GtkEntry *)g_object_get_data(G_OBJECT(win), "dump_to");
44 data->textArea = (GtkTextView *)g_object_get_data(G_OBJECT(win), "dump_text");
45 data->next = dump_list_head;
46 dump_list_head = data;
50 gtk_entry_set_text( data->fromInput, "" );
51 gtk_entry_set_text( data->toInput, "" );
52 data->textBuffer = gtk_text_buffer_new(NULL);
53 data->changedTag = gtk_text_buffer_create_tag(data->textBuffer, "changed",
56 gtk_text_view_set_buffer(data->textArea, data->textBuffer);
57 gtk_text_view_set_editable(data->textArea, FALSE);
58 gtk_widget_modify_font(GTK_WIDGET(data->textArea),fixed_list_font);
60 g_signal_connect ((gpointer) win, "delete_event",
61 G_CALLBACK (on_dump_win_delete_event),
63 g_signal_connect ((gpointer) dump_view_button, "clicked",
64 G_CALLBACK (on_dump_win_button_view_clicked),
66 gtk_widget_show( GTK_WIDGET(win) );
71 gboolean on_dump_win_delete_event( GtkWidget *widget, GdkEvent *event,
74 dump_data_t data = (dump_data_t)user_data;
75 if( data->data != NULL )
77 dump_data_t node = dump_list_head;
79 dump_list_head = data->next;
81 while( node->next != data ) {
83 assert( node != NULL );
85 node->next = data->next;
91 void on_dump_win_button_view_clicked( GtkWidget *widget, gpointer user_data )
93 dump_data_t data = (dump_data_t)user_data;
94 uint32_t startVal, endVal;
96 assert( data != NULL );
97 assert( data->_tag == DUMP_DATA_TAG );
99 startVal = gtk_entry_get_hex_value(data->fromInput, data->start);
100 endVal = gtk_entry_get_hex_value(data->toInput, data->end);
101 if( startVal != data->start || endVal != data->end ) {
102 if( startVal > endVal ) {
107 if( endVal > startVal + MAX_DUMP_SIZE )
108 endVal = startVal + MAX_DUMP_SIZE;
110 gtk_entry_set_hex_value(data->fromInput,startVal);
111 gtk_entry_set_hex_value(data->toInput,endVal);
112 data->start = startVal;
115 if( data->data != NULL ) {
119 if( startVal != endVal ) {
120 data->data = malloc( endVal - startVal );
121 mem_copy_from_sh4( data->data, startVal, endVal-startVal );
122 dump_win_set_text( data, data->data, data->data );
127 void dump_win_update( dump_data_t data )
129 if( data->data == NULL )
131 char tmp[data->end-data->start];
132 int length = data->end-data->start;
133 memcpy( tmp, data->data, length );
134 mem_copy_from_sh4( data->data, data->start, length );
135 dump_win_set_text( data, tmp, data->data );
138 void dump_win_update_all( )
140 dump_data_t node = dump_list_head;
141 while( node != NULL ) {
142 dump_win_update(node);
147 void dump_win_set_text( dump_data_t data, char *old_data, char *new_data )
149 GtkTextBuffer *buf = data->textBuffer;
150 GtkTextTag *changedTag = data->changedTag;
151 GtkTextIter iter, endIter;
153 /* Clear out the buffer */
154 gtk_text_buffer_get_start_iter(buf,&iter);
155 gtk_text_buffer_get_end_iter(buf,&endIter);
156 gtk_text_buffer_delete(buf,&iter,&endIter);
157 gtk_text_buffer_get_start_iter(buf,&iter);
159 for( offset = 0, i=data->start; i<data->end; i+=16, offset+=16 ) {
161 sprintf(text, "%08X:", i );
162 gtk_text_buffer_insert( buf, &iter, text, 9 );
163 for( j=0; j<16; j++ ) {
165 gtk_text_buffer_insert( buf, &iter, " ", 1 );
166 if( i+j < data->end ) {
167 int oldVal = ((int)old_data[offset+j])&0xFF;
168 int newVal = ((int)new_data[offset+j])&0xFF;
169 sprintf(text, "%02X ", newVal);
170 if( oldVal == newVal )
171 gtk_text_buffer_insert( buf, &iter, text, 3 );
173 gtk_text_buffer_insert_with_tags( buf, &iter, text, 3,
176 gtk_text_buffer_insert( buf, &iter, " ", 3 );
179 gtk_text_buffer_insert( buf, &iter, " ", 2 );
180 for( j=0; j<16 && i+j < data->end; j++ ) {
181 int oldVal = ((int)old_data[offset+j])&0xFF;
182 int newVal = ((int)new_data[offset+j])&0xFF;
183 if( isprint(newVal) )
184 sprintf( text, "%c", newVal );
185 else strcpy( text, "." );
186 if( oldVal == newVal )
187 gtk_text_buffer_insert( buf, &iter, text, 1 );
189 gtk_text_buffer_insert_with_tags( buf, &iter, text, 1,
192 gtk_text_buffer_insert( buf, &iter, "\n", 1 );
.