1
/* SPIM S20 MIPS simulator.
3
(Derived from an earlier work by Alan Siow.)
5
Copyright (C) 1990-2000 by James Larus (larus@cs.wisc.edu).
8
SPIM is distributed under the following conditions:
10
You may make copies of SPIM for your own use and modify those copies.
12
All copies of SPIM must retain my name and copyright notice.
14
You may not sell SPIM or distributed SPIM in conjunction with a
15
commerical product or service without the expressed written consent of
18
THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
19
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
20
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24
/* $Header: /Software/SPIM/src/buttons.c 5 12/24/00 1:37p Larus $
27
#include <X11/Intrinsic.h>
28
#include <X11/StringDefs.h>
29
#include <X11/Shell.h>
30
#include <X11/Xaw/Form.h>
31
#include <X11/Xaw/AsciiText.h>
32
#include <X11/Xaw/Command.h>
33
#include <X11/Xaw/Dialog.h>
34
#include <X11/Xaw/Label.h>
35
#include <X11/Xaw/MenuButton.h>
36
#include <X11/Xaw/SimpleMenu.h>
37
#include <X11/Xaw/Sme.h>
38
#include <X11/Xaw/SmeBSB.h>
39
#include <X11/Xaw/Cardinals.h>
46
#include "spim-utils.h"
56
/* Local functions: */
59
static void add_breakpoint_action (Widget w, XtPointer client_data,
61
static void add_clear_button (Widget parent);
62
static void add_mode_button (Widget parent);
63
static void add_reload_button (Widget parent);
64
static void add_print_button (Widget parent);
65
static void add_terminal_button (Widget parent);
66
static void breakpoint_prompt (Widget button, XtPointer client_data,
68
static void breakpoint_prompt_destroyed (Widget w, XtPointer client_data,
70
static void clear_program_state_action (Widget w, XtPointer client_data,
72
static void continue_action (Widget w, XtPointer client_data,
74
static void continue_prompt_destroyed (Widget w, XtPointer client_data,
76
static void delete_breakpoint_action (Widget w, XtPointer client_data,
78
static void destroy_popup_prompt (Widget w, XtPointer client_data,
80
static void help_action (Widget w, XtPointer ignore, XtPointer ignored);
81
static void init_stack (char *args);
82
static void load_prompt (Widget button, XtPointer client_data,
84
static void load_prompt_destroyed (Widget w, XtPointer client_data,
86
static void list_breakpoint_action (Widget w, XtPointer client_data,
88
static void noop (void);
89
static void parse_print_value (Widget w, XtPointer client_data,
91
static void parse_set_value (Widget w, XtPointer client_data,
93
static Widget popup_two_field_dialog (Widget button, String name,
94
String field1_label, String field1_value,
95
String field2_label, String field2_value,
97
void (*action) (/* ??? */),
99
void (*action2) (/* ??? */),
101
Widget *field2_text);
102
static void print_mem_prompt (Widget button, XtPointer client_data,
103
XtPointer call_data);
104
static void print_prompt_destroyed (Widget w, XtPointer client_data,
105
XtPointer call_data);
106
static void print_symbol_action (Widget w, XtPointer client_data,
107
XtPointer call_data);
108
static void quit_action (Widget w, XtPointer client_data,XtPointer call_data);
109
static void quit_prompt (Widget button, XtPointer client_data,
110
XtPointer call_data);
111
static void quit_prompt_destroyed (Widget w, XtPointer client_data,
112
XtPointer call_data);
113
static void read_assm_file_action (Widget w, XtPointer client_data,
114
XtPointer call_data);
115
static void reload_action (Widget w, XtPointer client_data,
116
XtPointer call_data);
117
static void run_program_action (Widget w, XtPointer client_data,
118
XtPointer call_data);
119
static void run_prompt (Widget button, XtPointer client_data,
120
XtPointer call_data);
121
static void run_prompt_destroyed (Widget w, XtPointer client_data,
122
XtPointer call_data);
123
static void select_mode_action (Widget w, XtPointer client_data,
124
XtPointer call_data);
125
static void set_value_action (char *location_str,char *value_str);
126
static void set_value_prompt (Widget button, XtPointer client_data,
127
XtPointer call_data);
128
static void set_value_destroyed (Widget w, XtPointer client_data,
129
XtPointer call_data);
130
static void step_continue_action (Widget w, XtPointer client_data,
131
XtPointer call_data);
132
static void step_program_action (Widget w, XtPointer client_data,
133
XtPointer call_data);
134
static void step_prompt (Widget button, XtPointer client_data,
135
XtPointer call_data);
136
static void step_prompt_destroyed (Widget w, XtPointer client_data,
137
XtPointer call_data);
138
static void warp_to_second_dialog (Widget widget, XEvent *event,
139
String *params, Cardinal *num_params);
143
static void add_breakpoint_action ();
144
static void add_clear_button ();
145
static void add_mode_button ();
146
static void add_print_button ();
147
static void add_reload_button ();
148
static void add_terminal_button ();
149
static void breakpoint_prompt ();
150
static void breakpoint_prompt_destroyed ();
151
static void clear_program_state_action ();
152
static void continue_action ();
153
static void continue_prompt_destroyed ();
154
static void delete_breakpoint_action ();
155
static void destroy_popup_prompt ();
156
static void help_action ();
157
static void init_stack ();
158
static void load_prompt ();
159
static void load_prompt_destroyed ();
160
static void list_breakpoint_action ();
162
static void parse_print_value ();
163
static void parse_set_value ();
164
static Widget popup_two_field_dialog ();
165
static void print_mem_prompt ();
166
static void print_prompt_destroyed ();
167
static void print_symbol_action ();
168
static void quit_action ();
169
static void quit_prompt ();
170
static void quit_prompt_destroyed ();
171
static void read_assm_file_action ();
172
static void reload_action ();
173
static void run_program_action ();
174
static void run_prompt ();
175
static void run_prompt_destroyed ();
176
static void select_mode_action ();
177
static void set_value_action ();
178
static void set_value_prompt ();
179
static void set_value_destroyed ();
180
static void step_continue_action ();
181
static void step_program_action ();
182
static void step_prompt ();
183
static void step_prompt_destroyed ();
184
static void warp_to_second_dialog ();
188
/* Local variables: */
190
static Widget breakpointButton;
191
static void (*confirmAction) () = noop;
192
static int stack_initialized = 0;
193
char *xspim_file_name = NULL; /* Retain last file's name. */
199
record_file_name_for_prompt (char *name)
202
record_file_name_for_prompt (name)
206
xspim_file_name = str_copy (name);
212
create_buttons (Widget parent)
215
create_buttons (parent)
224
XtSetArg (args[0], XtNlabel, "quit");
225
XtSetArg (args[1], XtNwidth, button_width);
226
button = XtCreateManagedWidget ("quitbutton", commandWidgetClass, parent,
228
XtAddCallback (button, XtNcallback, quit_prompt, NULL);
231
XtSetArg (args[0], XtNlabel, "load");
232
XtSetArg (args[1], XtNwidth, button_width);
233
command = XtCreateManagedWidget ("loadbutton", commandWidgetClass, parent,
235
XtAddCallback (command, XtNcallback, load_prompt, NULL);
238
add_reload_button (parent);
241
XtSetArg (args[0], XtNlabel, "run");
242
XtSetArg (args[1], XtNwidth, button_width);
243
button = XtCreateManagedWidget ("runbutton", commandWidgetClass, parent,
245
XtAddCallback (button, XtNcallback, run_prompt, NULL);
248
XtSetArg (args[0], XtNlabel, "step");
249
XtSetArg (args[1], XtNwidth, button_width);
250
button = XtCreateManagedWidget ("stepbutton", commandWidgetClass, parent,
252
XtAddCallback (button, XtNcallback, step_prompt, NULL);
255
add_clear_button (parent);
258
XtSetArg (args[0], XtNlabel, "set value");
259
XtSetArg (args[1], XtNwidth, button_width);
260
button = XtCreateManagedWidget ("setvaluebutton", commandWidgetClass, parent,
262
XtAddCallback (button, XtNcallback, set_value_prompt, NULL);
265
add_print_button (parent);
268
XtSetArg (args[0], XtNlabel, "breakpoints");
269
XtSetArg (args[1], XtNwidth, button_width);
270
button = XtCreateManagedWidget ("bkptbutton", commandWidgetClass, parent,
272
breakpointButton = button;
273
XtAddCallback (button, XtNcallback, breakpoint_prompt, NULL);
276
XtSetArg (args[0], XtNlabel, "help");
277
XtSetArg (args[1], XtNwidth, button_width);
278
button = XtCreateManagedWidget ("helpbutton", commandWidgetClass, parent,
280
XtAddCallback (button, XtNcallback, help_action, NULL);
283
add_terminal_button (parent);
286
add_mode_button (parent);
293
static Widget quit_popup = NULL;
297
quit_prompt (Widget button, XtPointer client_data, XtPointer call_data)
300
quit_prompt (button, client_data, call_data)
302
XtPointer client_data, call_data;
305
Widget parent, dialog;
309
if (quit_popup == NULL)
311
parent = XtParent (button);
313
XtTranslateCoords (button, (Position) 0, (Position) 0, &x, &y);
314
XtSetArg (args[0], XtNx, x);
315
XtSetArg (args[1], XtNy, y);
316
quit_popup = XtCreatePopupShell ("prompt", transientShellWidgetClass,
318
XtAddCallback (quit_popup, XtNdestroyCallback, quit_prompt_destroyed,
321
XtSetArg (args[0], XtNlabel, "quit?");
322
dialog = XtCreateManagedWidget ("quit", dialogWidgetClass, quit_popup,
325
XawDialogAddButton (dialog, "quit", quit_action, (XtPointer) dialog);
326
XawDialogAddButton (dialog, "abort command", destroy_popup_prompt,
330
confirmAction = quit_action;
331
XtPopup (quit_popup, XtGrabNone);
337
quit_action (Widget w, XtPointer client_data, XtPointer call_data)
340
quit_action (w, client_data, call_data)
342
XtPointer client_data, call_data;
345
Widget dialog = (Widget) client_data;
347
destroy_popup_prompt (NULL, (XtPointer) dialog, (XtPointer) NULL);
348
XtDestroyApplicationContext (XtWidgetToApplicationContext (w));
355
quit_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data)
358
quit_prompt_destroyed (w, client_data, call_data)
360
XtPointer client_data, call_data;
369
static Widget load_popup = NULL;
373
load_prompt (Widget button, XtPointer client_data, XtPointer call_data)
376
load_prompt (button, client_data, call_data)
378
XtPointer client_data, call_data;
381
Widget parent, dialog;
385
if (load_popup == NULL)
387
parent = XtParent (button);
389
XtTranslateCoords (button, (Position) 0, (Position) 0, &x, &y);
390
XtSetArg (args[0], XtNx, x);
391
XtSetArg (args[1], XtNy, y);
392
load_popup = XtCreatePopupShell ("popup", transientShellWidgetClass,
394
XtAddCallback (load_popup, XtNdestroyCallback, load_prompt_destroyed,
397
if (xspim_file_name == NULL)
398
xspim_file_name = str_copy ("");
399
XtSetArg (args[0], XtNlabel, "input filename:");
400
XtSetArg (args[1], XtNvalue, xspim_file_name);
401
dialog = XtCreateManagedWidget ("dialog", dialogWidgetClass, load_popup,
404
XawDialogAddButton (dialog, "assembly file", read_assm_file_action,
406
XawDialogAddButton (dialog, "abort command", destroy_popup_prompt,
410
confirmAction = read_assm_file_action;
411
XtPopup (load_popup, XtGrabNone);
417
read_assm_file_action (Widget w, XtPointer client_data, XtPointer call_data)
420
read_assm_file_action (w, client_data, call_data)
422
XtPointer client_data, call_data;
425
Widget dialog = (Widget) client_data;
426
String value = XawDialogGetValueString (dialog);
428
free (xspim_file_name);
429
xspim_file_name = str_copy (value);
430
read_file (value, 1);
432
destroy_popup_prompt (NULL, (XtPointer) dialog, (XtPointer) NULL);
438
load_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data)
441
load_prompt_destroyed (w, client_data, call_data)
443
XtPointer client_data, call_data;
452
static Widget run_popup = NULL;
453
static Widget run_field1_text, run_field2_text;
457
run_prompt (Widget button, XtPointer client_data, XtPointer call_data)
460
run_prompt (button, client_data, call_data)
462
XtPointer client_data, call_data;
467
if (run_popup == NULL)
469
sprintf (sa, "0x%08x", starting_address ());
470
run_popup = popup_two_field_dialog (button, "run program",
471
"starting address:", sa,
472
"args:", xspim_file_name,
473
"ok", run_program_action,
475
&run_field1_text, &run_field2_text);
476
XtAddCallback (run_popup, XtNdestroyCallback, run_prompt_destroyed,
479
confirmAction = run_program_action;
480
XtPopup (run_popup, XtGrabNone);
486
run_program_action (Widget w, XtPointer client_data, XtPointer call_data)
489
run_program_action (w, client_data, call_data)
491
XtPointer client_data, call_data;
495
String value1, value2;
496
Widget form = XtParent (w);
499
XtSetArg (args[0], XtNstring, &value1);
500
XtGetValues (run_field1_text, args, ONE);
502
XtSetArg (args[0], XtNstring, &value2);
503
XtGetValues (run_field2_text, args, ONE);
505
destroy_popup_prompt (NULL, (XtPointer) form, NULL);
508
addr = strtoul (value1, NULL, 0);
510
start_program (addr);
516
init_stack (char *args)
527
if (stack_initialized)
529
while (*args != '\0')
531
/* Skip leading blanks */
532
while (*args == ' ' || *args == '\t') args++;
533
/* First non-blank char */
535
/* Last non-blank, non-null char */
536
while (*args != ' ' && *args != '\t' && *args != '\0') args++;
541
*args++ = '\0'; /* Null terminate */
545
initialize_run_stack (argc, argv);
546
stack_initialized = 1;
552
run_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data)
555
run_prompt_destroyed (w, client_data, call_data)
557
XtPointer client_data, call_data;
566
static char *step_size = NULL; /* Retain step size */
568
static Widget step_popup = NULL;
569
static Widget step_field1_text, step_field2_text;
573
step_prompt (Widget button, XtPointer client_data, XtPointer call_data)
576
step_prompt (button, client_data, call_data)
578
XtPointer client_data, call_data;
581
if (step_popup == NULL)
583
if (step_size == NULL)
584
step_size = str_copy ("1");
585
step_popup = popup_two_field_dialog (button, "step program",
586
"number of steps:", step_size,
587
"args:", xspim_file_name,
588
"step", step_program_action,
589
"continue", step_continue_action,
592
XtAddCallback (step_popup, XtNdestroyCallback, step_prompt_destroyed,
595
confirmAction = step_program_action;
596
XtPopup (step_popup, XtGrabNone);
602
step_program_action (Widget w, XtPointer client_data, XtPointer call_data)
605
step_program_action (w, client_data, call_data)
607
XtPointer client_data, call_data;
611
String value1, value2;
615
XtSetArg (args[0], XtNstring, &value1);
616
XtGetValues (step_field1_text, args, ONE);
618
XtSetArg (args[0], XtNstring, &value2);
619
XtGetValues (step_field2_text, args, ONE);
621
steps = atoi (value1);
623
step_size = str_copy (value1);
624
addr = starting_address ();
626
if (steps > 0 && addr > 0)
627
execute_program (addr, steps, 1, 1);
629
error ("Cannot step %d steps from 0x%x\n", steps, addr);
635
step_continue_action (Widget w, XtPointer client_data, XtPointer call_data)
638
step_continue_action (w, client_data, call_data)
640
XtPointer client_data, call_data;
643
Widget dialog = (Widget) client_data;
645
XtPopdown (XtParent (dialog));
646
destroy_popup_prompt (NULL, (XtPointer) dialog, (XtPointer) NULL);
648
execute_program (PC, DEFAULT_RUN_STEPS, 0, 0);
654
step_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data)
657
step_prompt_destroyed (w, client_data, call_data)
659
XtPointer client_data, call_data;
670
add_reload_button (Widget parent)
673
add_reload_button (parent)
677
Widget command, menu, entry;
680
XtSetArg (args[0], XtNwidth, button_width);
681
command = XtCreateManagedWidget ("reload", menuButtonWidgetClass,
683
menu = XtCreatePopupShell ("menu", simpleMenuWidgetClass, command,
686
entry = XtCreateManagedWidget ("assembly file", smeBSBObjectClass, menu,
688
XtAddCallback (entry, XtNcallback, reload_action,
695
reload_action (Widget w, XtPointer client_data, XtPointer call_data)
698
reload_action (w, client_data, call_data)
700
XtPointer client_data, call_data;
703
int assem_or_exec = (int) client_data;
705
if (xspim_file_name == NULL)
708
write_output (message_out, "Memory and registers cleared\n\n");
709
initialize_world (load_trap_handler ? trap_file : NULL);
710
write_startup_message ();
711
stack_initialized = 0;
712
read_file (xspim_file_name, assem_or_exec);
720
#define CLEAR_MEM_REGS 2
724
add_clear_button (Widget parent)
727
add_clear_button (parent)
731
Widget command, menu, entry;
734
XtSetArg (args[0], XtNwidth, button_width);
735
command = XtCreateManagedWidget ("clear", menuButtonWidgetClass,
737
menu = XtCreatePopupShell ("menu", simpleMenuWidgetClass, command,
740
entry = XtCreateManagedWidget ("registers", smeBSBObjectClass, menu,
742
XtAddCallback (entry, XtNcallback, clear_program_state_action,
743
(XtPointer) CLEAR_REGS);
745
entry = XtCreateManagedWidget ("memory & registers", smeBSBObjectClass, menu,
747
XtAddCallback (entry, XtNcallback, clear_program_state_action,
748
(XtPointer) CLEAR_MEM_REGS);
754
clear_program_state_action (Widget w, XtPointer client_data,
758
clear_program_state_action (w, client_data, call_data)
760
XtPointer client_data, call_data;
763
int clear_op = (int) client_data;
768
write_output (message_out, "Registers cleared\n\n");
769
initialize_registers ();
773
write_output (message_out, "Memory and registers cleared\n\n");
774
initialize_world (load_trap_handler ? trap_file : NULL);
775
write_startup_message ();
776
stack_initialized = 0;
780
fatal_error("Unknown action: %d\n", clear_op);
788
/* *** Set Value *** */
790
static Widget set_value_popup = NULL;
791
static Widget set_field1_text, set_field2_text;
795
set_value_prompt (Widget button, XtPointer client_data, XtPointer call_data)
798
set_value_prompt (button, client_data, call_data)
800
XtPointer client_data, call_data;
803
if (set_value_popup == NULL)
805
set_value_popup = popup_two_field_dialog (button, "set value",
806
"register/location:", "",
808
"set", parse_set_value,
810
&set_field1_text, &set_field2_text);
811
XtAddCallback (set_value_popup, XtNdestroyCallback,
812
set_value_destroyed, (XtPointer) 0);
814
confirmAction = parse_set_value;
815
XtPopup (set_value_popup, XtGrabNone);
821
parse_set_value (Widget w, XtPointer client_data, XtPointer call_data)
824
parse_set_value (w, client_data, call_data)
826
XtPointer client_data, call_data;
830
String value1, value2;
831
Widget form = XtParent (w);
833
XtSetArg (args[0], XtNstring, &value1);
834
XtGetValues (set_field1_text, args, ONE);
836
XtSetArg (args[0], XtNstring, &value2);
837
XtGetValues (set_field2_text, args, ONE);
839
destroy_popup_prompt (NULL, (XtPointer) form, NULL);
841
set_value_action (value1, value2);
847
set_value_action (char *location_str, char *value_str)
850
set_value_action (location_str, value_str)
851
char *location_str, *value_str;
857
value = strtol (value_str, NULL, 0);
858
reg_no = register_name_to_number (location_str);
861
if (*location_str == '$' || *location_str == 'r' || *location_str == 'R')
862
reg_no = register_name_to_number (location_str + 1);
865
error ("Cannot modify register 0\n");
867
R[reg_no] = (reg_word)value;
868
else if (streq (location_str, "Status") || streq (location_str, "status"))
869
Status_Reg = (reg_word)value;
870
else if (streq (location_str, "PC") || streq (location_str, "pc"))
871
PC = (reg_word)value;
872
else if (streq (location_str, "EPC") | streq (location_str, "epc"))
873
EPC = (reg_word)value;
879
/* Try to parse string as a number */
880
addr = strtol (location_str, &eptr, 0);
881
if (eptr == location_str)
882
error ("Unknown register selected: %s\n", location_str);
884
SET_MEM_WORD (addr, value);
892
set_value_destroyed (Widget w, XtPointer client_data, XtPointer call_data)
895
set_value_destroyed (w, client_data, call_data)
897
XtPointer client_data, call_data;
900
set_value_popup = NULL;
908
add_print_button (Widget parent)
911
add_print_button (parent)
915
Widget command, menu, entry;
918
XtSetArg (args[0], XtNwidth, button_width);
919
command = XtCreateManagedWidget ("print", menuButtonWidgetClass,
921
menu = XtCreatePopupShell ("menu", simpleMenuWidgetClass, command,
924
entry = XtCreateManagedWidget ("memory location(s)", smeBSBObjectClass, menu,
926
XtAddCallback (entry, XtNcallback, print_mem_prompt, NULL);
928
entry = XtCreateManagedWidget ("global symbols", smeBSBObjectClass, menu,
930
XtAddCallback (entry, XtNcallback, print_symbol_action, NULL);
934
static Widget print_popup = NULL;
935
static Widget print_field1_text, print_field2_text;
939
print_mem_prompt (Widget button, XtPointer client_data, XtPointer call_data)
942
print_mem_prompt (button, client_data, call_data)
944
XtPointer client_data, call_data;
947
if (print_popup == NULL)
949
print_popup = popup_two_field_dialog (XtParent (button), "print memory",
952
"print", parse_print_value,
956
XtAddCallback (print_popup, XtNdestroyCallback, print_prompt_destroyed,
959
confirmAction = parse_print_value;
960
XtPopup (print_popup, XtGrabNone);
966
parse_print_value (Widget w, XtPointer client_data, XtPointer call_data)
969
parse_print_value (w, client_data, call_data)
971
XtPointer client_data, call_data;
975
String value1, value2;
976
Widget form = XtParent (w);
978
XtSetArg (args[0], XtNstring, &value1);
979
XtGetValues (print_field1_text, args, ONE);
981
XtSetArg (args[0], XtNstring, &value2);
982
XtGetValues (print_field2_text, args, ONE);
984
XtPopdown (XtParent (form));
985
destroy_popup_prompt (NULL, (XtPointer) form, NULL);
987
if (!streq (value1, ""))
991
from = strtoul (value1, NULL, 0);
992
to = strtoul (value2, NULL, 0);
993
if (streq (value2, ""))
996
for ( ; from <= to; from+= BYTES_PER_WORD)
1004
print_symbol_action (Widget w, XtPointer client_data, XtPointer call_data)
1007
print_symbol_action (w, client_data, call_data)
1009
XtPointer client_data, call_data;
1018
print_prompt_destroyed (Widget w, XtPointer client_data, XtPointer call_data)
1021
print_prompt_destroyed (w, client_data, call_data)
1023
XtPointer client_data, call_data;
1030
/* *** Breakpoints **** */
1032
static char *breakpoint_addr = NULL; /* Retain last breakpoint address */
1034
static Widget bkpt_popup = NULL;
1038
breakpoint_prompt (Widget button, XtPointer client_data, XtPointer call_data)
1041
breakpoint_prompt (button, client_data, call_data)
1043
XtPointer client_data, call_data;
1046
Widget parent, dialog;
1050
if (bkpt_popup == NULL)
1052
parent = XtParent (button);
1054
XtTranslateCoords (button, (Position) 0, (Position) 0, &x, &y);
1055
XtSetArg (args[0], XtNx, x);
1056
XtSetArg (args[1], XtNy, y);
1057
bkpt_popup = XtCreatePopupShell ("popup", transientShellWidgetClass,
1060
if (breakpoint_addr == NULL)
1061
breakpoint_addr = str_copy ("");
1062
XtSetArg (args[0], XtNlabel, "address:");
1063
XtSetArg (args[1], XtNvalue, breakpoint_addr);
1064
dialog = XtCreateManagedWidget ("dialog", dialogWidgetClass,
1067
XtAddCallback (bkpt_popup, XtNdestroyCallback,
1068
breakpoint_prompt_destroyed, (XtPointer) 0);
1070
XawDialogAddButton (dialog, "add",
1071
add_breakpoint_action, (XtPointer) dialog);
1072
XawDialogAddButton (dialog, "delete",
1073
delete_breakpoint_action, (XtPointer) dialog);
1074
XawDialogAddButton (dialog, "list",
1075
list_breakpoint_action, (XtPointer) dialog);
1076
XawDialogAddButton (dialog, "abort command", destroy_popup_prompt,
1077
(XtPointer) dialog);
1080
confirmAction = add_breakpoint_action;
1081
XtPopup (bkpt_popup, XtGrabNone);
1087
add_breakpoint_action (Widget w, XtPointer client_data, XtPointer call_data)
1090
add_breakpoint_action (w, client_data, call_data)
1092
XtPointer client_data, call_data;
1095
Widget dialog = (Widget) client_data;
1096
String value = XawDialogGetValueString (dialog);
1099
free (breakpoint_addr);
1100
breakpoint_addr = str_copy (value);
1102
while (*breakpoint_addr == ' ') breakpoint_addr++;
1103
if (isdigit (*breakpoint_addr))
1104
addr = strtoul (value, NULL, 0);
1106
addr = find_symbol_address (breakpoint_addr);
1108
add_breakpoint (addr);
1110
destroy_popup_prompt (NULL, (XtPointer) dialog, (XtPointer) NULL);
1116
delete_breakpoint_action (Widget w, XtPointer client_data, XtPointer call_data)
1119
delete_breakpoint_action (w, client_data, call_data)
1121
XtPointer client_data, call_data;
1124
Widget dialog = (Widget) client_data;
1125
String value = XawDialogGetValueString (dialog);
1128
free (breakpoint_addr);
1129
breakpoint_addr = str_copy (value);
1130
addr = strtoul (value, NULL, 0);
1132
delete_breakpoint (addr);
1134
destroy_popup_prompt (NULL, (XtPointer) dialog, (XtPointer) NULL);
1140
list_breakpoint_action (Widget w, XtPointer client_data, XtPointer call_data)
1143
list_breakpoint_action (w, client_data, call_data)
1145
XtPointer client_data, call_data;
1148
list_breakpoints ();
1154
breakpoint_prompt_destroyed (Widget w, XtPointer client_data,
1155
XtPointer call_data)
1158
breakpoint_prompt_destroyed (w, client_data, call_data)
1160
XtPointer client_data, call_data;
1171
help_action (Widget w, XtPointer ignore, XtPointer ignored)
1174
help_action (w, ignore, ignored)
1180
static char * msg = "\nSPIM is a MIPS R2000 simulator.\n\
1181
Copyright (C) 1990-2000 by James R. Larus, larus@cs.wisc.edu\n\n\
1182
quit -- Exit from the simulator\n\
1183
load -- Read a file into memory\n\
1184
run -- Execute a program\n\
1185
step -- Single-step through a program\n\
1186
clear -- Reinitialize registers or memory\n\
1187
set value -- Set the value in register or memory\n\
1188
print -- Print the value in register or memory\n\
1189
breakpoint -- Set or delete a breakpoint\n\
1190
help -- This message\n\
1191
terminal -- Raise or hide console window\n\
1192
mode -- Set SPIM operating modes\n";
1194
write_output (message_out, msg);
1198
/* *** Terminal *** */
1202
add_terminal_button (Widget parent)
1205
add_terminal_button (parent)
1209
Widget command, menu, entry;
1212
XtSetArg (args[0], XtNwidth, button_width);
1213
command = XtCreateManagedWidget ("terminal", menuButtonWidgetClass,
1215
menu = XtCreatePopupShell ("menu", simpleMenuWidgetClass, command,
1218
entry = XtCreateManagedWidget ("popup console", smeBSBObjectClass, menu,
1220
XtAddCallback (entry, XtNcallback, popup_console, NULL);
1226
static Widget modeCommand;
1230
add_mode_button (Widget parent)
1233
add_mode_button (parent)
1240
XtSetArg (args[0], XtNwidth, button_width);
1241
modeCommand = XtCreateManagedWidget ("mode", menuButtonWidgetClass,
1243
menu = XtCreatePopupShell ("menu", simpleMenuWidgetClass, modeCommand,
1246
XtSetArg (args[0], XtNleftMargin, 20);
1247
entry = XtCreateManagedWidget ("bare", smeBSBObjectClass, menu, args, ONE);
1248
XtAddCallback (entry, XtNcallback, select_mode_action, NULL);
1251
XtSetArg (args[0], XtNleftBitmap, mark);
1252
XtSetValues (entry, args, ONE);
1255
XtSetArg (args[0], XtNleftMargin, 20);
1256
entry = XtCreateManagedWidget ("quiet", smeBSBObjectClass, menu, args, ONE);
1257
XtAddCallback (entry, XtNcallback, select_mode_action, NULL);
1260
XtSetArg (args[0], XtNleftBitmap, mark);
1261
XtSetValues (entry, args, ONE);
1268
select_mode_action (Widget w, XtPointer client_data, XtPointer call_data)
1271
select_mode_action (w, client_data, call_data)
1273
XtPointer client_data, call_data;
1277
String name = XtName (w);
1279
if (streq (name, "bare"))
1281
bare_machine = !bare_machine;
1283
XtSetArg (args[0], XtNleftBitmap, mark);
1285
XtSetArg (args[0], XtNleftBitmap, None);
1286
XtSetValues (w, args, ONE);
1288
else if (streq (name, "quiet"))
1292
XtSetArg (args[0], XtNleftBitmap, mark);
1294
XtSetArg (args[0], XtNleftBitmap, None);
1295
XtSetValues (w, args, ONE);
1300
/* *** Continue *** */
1302
static Widget continue_popup = NULL;
1306
continue_prompt (int interrupt_seen)
1309
continue_prompt (interrupt_seen)
1318
if (continue_popup != NULL)
1319
XtDestroyWidget (continue_popup);
1320
XtTranslateCoords (breakpointButton, (Position) 0, (Position) 0, &x, &y);
1321
XtSetArg (args[0], XtNx, x);
1322
XtSetArg (args[1], XtNy, y);
1323
continue_popup = XtCreatePopupShell ("prompt", transientShellWidgetClass,
1324
breakpointButton, args, TWO);
1325
XtAddCallback (continue_popup, XtNdestroyCallback,
1326
continue_prompt_destroyed, (XtPointer) 0);
1329
sprintf (msg, "execution interrupt at 0x%08x", PC);
1331
sprintf (msg, "breakpoint encountered at 0x%08x", PC);
1332
XtSetArg (args[0], XtNlabel, msg);
1333
dialog = XtCreateManagedWidget ("continue", dialogWidgetClass,
1334
continue_popup, args, ONE);
1336
XawDialogAddButton (dialog, "continue", continue_action,
1337
(XtPointer) dialog);
1338
XawDialogAddButton (dialog, "abort command", destroy_popup_prompt,
1339
(XtPointer) dialog);
1341
confirmAction = continue_action;
1342
XtPopup (continue_popup, XtGrabNone);
1348
continue_action (Widget w, XtPointer client_data, XtPointer call_data)
1351
continue_action (w, client_data, call_data)
1353
XtPointer client_data, call_data;
1356
Widget dialog = (Widget) client_data;
1358
XtPopdown (XtParent (dialog));
1359
destroy_popup_prompt (NULL, (XtPointer) dialog, (XtPointer) NULL);
1360
continue_popup = NULL;
1361
execute_program (PC, 1, 0, 1); /* Step over breakpoint */
1362
execute_program (PC, DEFAULT_RUN_STEPS - 1, 0, 0);
1368
continue_prompt_destroyed (Widget w, XtPointer client_data,
1369
XtPointer call_data)
1372
continue_prompt_destroyed (w, client_data, call_data)
1374
XtPointer client_data, call_data;
1377
continue_popup = NULL;
1385
confirm (Widget widget, XEvent *event, String *params, Cardinal *num_params)
1388
confirm (widget, event, params, num_params)
1392
Cardinal *num_params;
1395
Widget dialog = XtParent (widget);
1396
(*confirmAction) (widget, (XtPointer) dialog, (XtPointer) NULL);
1402
destroy_popup_prompt (Widget w, XtPointer client_data, XtPointer call_data)
1405
destroy_popup_prompt (w, client_data, call_data)
1407
XtPointer client_data, call_data;
1410
Widget popup = XtParent ((Widget) client_data);
1412
confirmAction = noop;
1413
XtDestroyWidget (popup);
1430
popup_two_field_dialog (Widget button, String name, String field1_label,
1431
String field1_value, String field2_label,
1432
String field2_value, String action_name,
1433
void (*action) (/* ??? */), String action2_name,
1434
void (*action2) (/* ??? */), Widget *field1_text,
1435
Widget *field2_text)
1438
popup_two_field_dialog (button, name, field1_label, field1_value,
1439
field2_label, field2_value, action_name, action,
1440
action2_name, action2, field1_text, field2_text)
1442
String name, field1_label, field1_value, field2_label, field2_value,
1443
action_name, action2_name;
1444
void (*action) (), (*action2) ();
1445
Widget *field1_text, *field2_text;
1449
Widget labelx, field1, field2;
1450
Widget button1, button2, cancelbutton;
1451
Widget parent = XtParent (button);
1454
static XtActionsRec action_table []
1455
= {{"warp_to_second_dialog", warp_to_second_dialog},};
1457
XtTranslateCoords (button, (Position) 0, (Position) 0, &x, &y);
1459
XtSetArg (args[0], XtNx, x);
1460
XtSetArg (args[1], XtNy, y);
1461
popup = XtCreatePopupShell ("prompt", transientShellWidgetClass, parent,
1464
form = XtCreateManagedWidget ("form", formWidgetClass, popup, NULL, ZERO);
1466
XtSetArg (args[0], XtNlabel, name);
1467
XtSetArg (args[1], XtNborderWidth, 0);
1468
labelx = XtCreateManagedWidget ("label", labelWidgetClass, form, args, TWO);
1470
XtSetArg (args[0], XtNfromVert, labelx);
1471
XtSetArg (args[1], XtNborderWidth, 0);
1472
XtSetArg (args[2], XtNlabel, field1_label);
1473
field1 = XtCreateManagedWidget ("field1", labelWidgetClass, form, args,
1476
XtSetArg (args[0], XtNfromHoriz, field1);
1477
XtSetArg (args[1], XtNfromVert, labelx);
1478
XtSetArg (args[2], XtNeditType, "edit");
1479
XtSetArg (args[3], XtNstring, field1_value);
1480
XtSetArg (args[4], XtNtype, XawAsciiString);
1481
*field1_text = XtCreateManagedWidget ("field1_text", asciiTextWidgetClass,
1483
XtOverrideTranslations (*field1_text,
1484
XtParseTranslationTable
1485
("#override \n <Key>Return:warp_to_second_dialog()"));
1486
XtAppAddActions (app_context, action_table, XtNumber (action_table));
1488
XtSetArg (args[0], XtNfromVert, *field1_text);
1489
XtSetArg (args[1], XtNborderWidth, 0);
1490
XtSetArg (args[2], XtNlabel, field2_label);
1491
field2 = XtCreateManagedWidget ("field2", labelWidgetClass, form, args,
1494
XtSetArg (args[0], XtNfromHoriz, field1);
1495
XtSetArg (args[1], XtNfromVert, *field1_text);
1496
XtSetArg (args[2], XtNeditType, "edit");
1497
XtSetArg (args[3], XtNstring, field2_value);
1498
XtSetArg (args[4], XtNtype, XawAsciiString);
1499
*field2_text = XtCreateManagedWidget ("field2_text", asciiTextWidgetClass,
1501
XtOverrideTranslations (*field2_text,
1502
XtParseTranslationTable
1503
("#override \n <Key>Return: confirm()"));
1505
XtSetArg (args[0], XtNfromVert, *field2_text);
1506
button1 = XtCreateManagedWidget (action_name, commandWidgetClass, form,
1508
XtAddCallback (button1, XtNcallback, action, (XtPointer) form);
1510
if (action2 != NULL)
1512
XtSetArg (args[0], XtNfromHoriz, button1);
1513
XtSetArg (args[1], XtNfromVert, *field2_text);
1514
button2 = XtCreateManagedWidget (action2_name, commandWidgetClass, form,
1516
XtAddCallback (button2, XtNcallback, action2, (XtPointer) form);
1519
XtSetArg (args[0], XtNfromHoriz, action2 == NULL ? button1 : button2);
1520
XtSetArg (args[1], XtNfromVert, *field2_text);
1521
cancelbutton = XtCreateManagedWidget ("abort command", commandWidgetClass,
1523
XtAddCallback (cancelbutton, XtNcallback, destroy_popup_prompt,
1532
warp_to_second_dialog (Widget widget, XEvent *event, String *params,
1533
Cardinal *num_params)
1536
warp_to_second_dialog (widget, event, params, num_params)
1540
Cardinal *num_params;
1543
Widget form = XtParent (widget);
1544
Widget second_dialog;
1546
second_dialog = XtNameToWidget (form, "field2_text");
1548
XWarpPointer (XtDisplay (second_dialog), None, XtWindow (second_dialog),