11 GdkColor *msg_colors[] = { &clrError, &clrError, &clrWarn, &clrNormal,
12 &clrDebug, &clrTrace };
18 struct reg_map_struct {
24 struct reg_map_struct sh4_reg_map[] =
25 { {"R0", REG_INT, &sh4r.r[0]}, {"R1", REG_INT, &sh4r.r[1]},
26 {"R2", REG_INT, &sh4r.r[2]}, {"R3", REG_INT, &sh4r.r[3]},
27 {"R4", REG_INT, &sh4r.r[4]}, {"R5", REG_INT, &sh4r.r[5]},
28 {"R6", REG_INT, &sh4r.r[6]}, {"R7", REG_INT, &sh4r.r[7]},
29 {"R8", REG_INT, &sh4r.r[8]}, {"R9", REG_INT, &sh4r.r[9]},
30 {"R10",REG_INT, &sh4r.r[10]}, {"R11",REG_INT, &sh4r.r[11]},
31 {"R12",REG_INT, &sh4r.r[12]}, {"R13",REG_INT, &sh4r.r[13]},
32 {"R14",REG_INT, &sh4r.r[14]}, {"R15",REG_INT, &sh4r.r[15]},
33 {"SR", REG_INT, &sh4r.sr}, {"GBR", REG_INT, &sh4r.gbr},
34 {"SSR",REG_INT, &sh4r.ssr}, {"SPC", REG_INT, &sh4r.spc},
35 {"SGR",REG_INT, &sh4r.sgr}, {"DBR", REG_INT, &sh4r.dbr},
36 {"VBR",REG_INT, &sh4r.vbr},
37 {"PC", REG_INT, &sh4r.pc}, {"PR", REG_INT, &sh4r.pr},
38 {"MACL",REG_INT, &sh4r.mac},{"MACH",REG_INT, ((uint32_t *)&sh4r.mac)+1},
39 {"FPUL", REG_INT, &sh4r.fpul}, {"FPSCR", REG_INT, &sh4r.fpscr},
42 GtkCList *msgs, *regs, *disasm;
44 GtkProgressBar *icounter;
45 char icounter_text[16];
47 struct sh4_registers sh4r_s;
48 int disasm_from = -1, disasm_to = -1;
52 void init_debug_win(GtkWidget *win)
59 regs = gtk_object_get_data(GTK_OBJECT(win), "reg_list");
61 for( i=0; sh4_reg_map[i].name != NULL; i++ ) {
62 arr[0] = sh4_reg_map[i].name;
63 if( sh4_reg_map[i].type == REG_INT )
64 sprintf( buf, "%08X", *((uint32_t *)sh4_reg_map[i].value) );
66 sprintf( buf, "%f", *((float *)sh4_reg_map[i].value) );
67 gtk_clist_append( regs, arr );
69 gtk_widget_modify_font( GTK_WIDGET(regs), fixed_list_font );
71 msgs = gtk_object_get_data(GTK_OBJECT(win), "output_list");
72 disasm = gtk_object_get_data(GTK_OBJECT(win), "disasm_list");
73 gtk_clist_set_column_width( disasm, 1, 16 );
74 page_field = gtk_object_get_data(GTK_OBJECT(win), "page_field");
76 appbar = gtk_object_get_data(GTK_OBJECT(win), "debug_appbar");
77 icounter = gnome_appbar_get_progress( appbar );
78 gtk_progress_bar_set_text(icounter, "1");
82 * Check for changed registers and update the display
84 void update_registers( void )
87 for( i=0; sh4_reg_map[i].name != NULL; i++ ) {
88 if( sh4_reg_map[i].type == REG_INT ) {
89 /* Yes this _is_ probably fairly evil */
90 if( *((uint32_t *)sh4_reg_map[i].value) !=
91 *((uint32_t *)((char *)&sh4r_s + ((char *)sh4_reg_map[i].value - (char *)&sh4r))) ) {
93 sprintf( buf, "%08X", *((uint32_t *)sh4_reg_map[i].value) );
94 gtk_clist_set_text( regs, i, 1, buf );
95 gtk_clist_set_foreground( regs, i, &clrChanged );
97 gtk_clist_set_foreground( regs, i, &clrNormal );
100 if( *((float *)sh4_reg_map[i].value) !=
101 *((float *)((char *)&sh4r_s + ((char *)sh4_reg_map[i].value - (char *)&sh4r))) ) {
103 sprintf( buf, "%f", *((float *)sh4_reg_map[i].value) );
104 gtk_clist_set_text( regs, i, 1, buf );
105 gtk_clist_set_foreground( regs, i, &clrChanged );
107 gtk_clist_set_foreground( regs, i, &clrNormal );
111 if( sh4r.pc != sh4r_s.pc )
112 set_disassembly_pc( sh4r.pc, FALSE );
113 memcpy( &sh4r_s, &sh4r, sizeof(sh4r) );
116 void update_icount( void )
118 sprintf( icounter_text, "%d", sh4r.icount );
119 gtk_progress_bar_set_text( icounter, icounter_text );
122 void set_disassembly_region( unsigned int page )
129 char *arr[4] = { addr, " ", opcode, buf };
130 unsigned int from = page & 0xFFFFF000;
131 unsigned int to = from + 4096;
133 gtk_clist_clear(disasm);
135 sprintf( addr, "%08X", from );
136 gtk_entry_set_text( page_field, addr );
138 if( !mem_has_page( from ) ) {
139 arr[3] = "This page is currently unmapped";
140 gtk_clist_append( disasm, arr );
141 gtk_clist_set_foreground( disasm, 0, &clrError );
143 for( i=from; i<to; i+=2 ) {
144 sh4_disasm_instruction( i, buf, sizeof(buf) );
145 sprintf( addr, "%08X", i );
146 op = mem_read_phys_word(i);
147 sprintf( opcode, "%02X %02X", op&0xFF, op>>8 );
148 posn = gtk_clist_append( disasm, arr );
150 gtk_clist_set_foreground( disasm, posn, &clrWarn );
152 if( disasm_pc != -1 && disasm_pc >= from && disasm_pc < to )
153 gtk_clist_set_foreground( disasm, (disasm_pc - from)>>1,
157 if( page != from ) { /* not a page boundary */
158 gtk_clist_moveto( disasm, (page-from)>>1, 0, 0.5, 0.0 );
164 void jump_to_disassembly( unsigned int addr, gboolean select )
168 if( addr < disasm_from || addr >= disasm_to )
169 set_disassembly_region(addr);
171 row = (addr-disasm_from)>>1;
173 gtk_clist_select_row( disasm, row, 0 );
175 if( gtk_clist_row_is_visible( disasm, row ) != GTK_VISIBILITY_FULL ){
176 gtk_clist_moveto( disasm, row, 0, 0.5, 0.0 );
180 void set_disassembly_pc( unsigned int pc, gboolean select )
184 jump_to_disassembly( pc, select );
185 if( disasm_pc != -1 && disasm_pc >= disasm_from && disasm_pc < disasm_to )
186 gtk_clist_set_foreground( disasm, (disasm_pc - disasm_from)>>1,
188 row = (pc - disasm_from)>>1;
189 gtk_clist_set_foreground( disasm, row, &clrPC );
194 void emit( int level, int source, char *msg, ... )
196 char buf[20], addr[10] = "", *p;
197 char *arr[3] = {buf, addr};
199 time_t tm = time(NULL);
203 p = g_strdup_vprintf( msg, ap );
204 strftime( buf, sizeof(buf), "%H:%M:%S", localtime(&tm) );
206 sprintf( addr, "%08X", sh4r.pc );
208 posn = gtk_clist_append(msgs, arr);
212 gtk_clist_set_foreground( msgs, posn, msg_colors[level] );
213 gtk_clist_moveto( msgs, posn, 0, 1.0, 0.0 );
215 /* emit _really_ slows down the emu, to the point where the gui can be
216 * completely unresponsive if I don't include this:
218 while( gtk_events_pending() )
219 gtk_main_iteration();
.