📄 xspim.c
字号:
#ifdef __STDC__voidpopup_console (Widget w, XtPointer client_data, XtPointer call_data)#elsevoidpopup_console (w, client_data, call_data) Widget w; XtPointer client_data, call_data;#endif{ if (console_is_visible) { console_is_visible = 0; XtPopdown (shell1); } else { console_is_visible = 1; XtPopup (shell1, XtGrabNone); }}#ifdef __STDC__voidread_file (char *name, int assembly_file)#elsevoidread_file (name, assembly_file) char *name; int assembly_file;#endif{ int error_flag; if (*name == '\0') error_flag = 1; else if (assembly_file) error_flag = read_assembly_file (name); if (!error_flag) { PC = find_symbol_address (DEFAULT_RUN_LOCATION); redisplay_text (); center_text_at_PC (); redisplay_data (); }}#ifdef __STDC__voidstart_program (mem_addr addr)#elsevoidstart_program (addr) mem_addr addr;#endif{ if (addr == 0) addr = starting_address (); if (addr != 0) execute_program (addr, DEFAULT_RUN_STEPS, 0, 0);}#ifdef __STDC__voidexecute_program (mem_addr pc, int steps, int display, int cont_bkpt)#elsevoidexecute_program (pc, steps, display, cont_bkpt) mem_addr pc; int steps, display, cont_bkpt;#endif{ if (!setjmp (spim_top_level_env)) { char *undefs = undefined_symbol_string (); if (undefs != NULL) { write_output (message_out, "The following symbols are undefined:\n"); write_output (message_out, undefs); write_output (message_out, "\n"); free (undefs); } spim_is_running = 1; show_running (); if (run_program (pc, steps, display, cont_bkpt)) continue_prompt (0); } redisplay_text (); spim_is_running = 0; center_text_at_PC (); redisplay_data ();}#ifdef __STDC__static voidshow_running (void)#elsestatic voidshow_running ()#endif{ Arg args[1]; XtSetArg (args[0], XtNstring, "Running....."); XtSetValues (register_window, args, ONE);}/* Redisplay the contents of the registers and, if modified, the data and stack segments. */#ifdef __STDC__voidredisplay_data (void)#elsevoidredisplay_data ()#endif{ display_registers (); display_data_seg ();}/* Redisplay the contents of the registers in a wide variety of formats. */#ifdef __STDC__static voiddisplay_registers (void)#elsestatic voiddisplay_registers ()#endif{ static char buf[8 * K]; int max_buf_len = 8 * K; int string_len = 0; Arg args [2]; registers_as_string (buf, &max_buf_len, &string_len, print_gpr_hex, print_fpr_hex); XtSetArg (args[0], XtNstring, (String)buf); XtSetArg (args[1], XtNlength, string_len); XtSetValues (register_window, args, TWO);}/* Redisplay the text segment and ktext segments if they have changed. */#ifdef __STDC__voidredisplay_text (void)#elsevoidredisplay_text ()#endif{ static String buf = NULL; static int max_buf_len = 16 * K; int string_len = 0; Arg args [2]; if (!text_modified) return; if (buf == NULL) buf = (String) malloc (max_buf_len); *buf = '\0'; buf = insts_as_string (TEXT_BOT, text_top, buf, &max_buf_len, &string_len); sprintf (&buf[string_len], "\n\tKERNEL\n"); string_len += strlen (&buf[string_len]); buf = insts_as_string (K_TEXT_BOT, k_text_top, buf, &max_buf_len, &string_len); XtSetArg (args[0], XtNstring, buf); XtSetArg (args[1], XtNlength, string_len); XtSetValues (text_window, args, TWO); text_modified = 0;}/* Center the text window at the instruction at the current PC and highlight the instruction. */#ifdef __STDC__static voidcenter_text_at_PC (void)#elsestatic voidcenter_text_at_PC ()#endif{ char buf[100]; XawTextBlock text; XawTextPosition start, finish; static mem_addr prev_PC = 0; XawTextUnsetSelection(text_window); if (PC < TEXT_BOT || (PC > text_top && (PC < K_TEXT_BOT || PC > k_text_top))) return; sprintf (buf, "\n[0x%08x]", PC); text.firstPos = 0; text.length = strlen (buf); text.ptr = buf; text.format = FMT8BIT; /* Find start of line at PC: */ start = XawTextSearch (text_window, prev_PC <= PC ? XawsdRight : XawsdLeft, &text); if (start == XawTextSearchError) { start = XawTextSearch (text_window, prev_PC > PC ? XawsdRight : XawsdLeft, &text); } if (start == XawTextSearchError) { if (PC != 0x00400000) return; XawTextSetInsertionPoint (text_window, 0); } else XawTextSetInsertionPoint (text_window, start + 1); /* Find end of the line: */ text.length = 1; finish = XawTextSearch (text_window, XawsdRight, &text); if (finish == XawTextSearchError) return; /* Highlight the line: */ XawTextSetSelection(text_window, start + 1, finish); prev_PC = PC;}/* Display the contents of the data and stack segments, if they have been modified. */#ifdef __STDC__static voiddisplay_data_seg (void)#elsestatic voiddisplay_data_seg ()#endif{ static String buf = NULL; static int max_buf_len = 16 * K; int string_len = 0; Arg args [2]; if (!data_modified) return; if (buf == NULL) buf = (char *) malloc (max_buf_len); buf = data_seg_as_string(buf, &max_buf_len, &string_len); XtSetArg (args[0], XtNstring, buf); XtSetArg (args[1], XtNlength, string_len); XtSetValues (data_window, args, TWO); data_modified = 0;}/* IO facilities: */#ifdef __STDC__voidwrite_output (port fp, char *fmt, ...)#else/*VARARGS0*/voidwrite_output (va_alist)va_dcl#endif{ va_list args; Widget w;#ifndef __STDC__ char *fmt; port fp;#endif char io_buffer [IO_BUFFSIZE];#ifdef __STDC__ va_start (args, fmt);#else va_start (args); fp = va_arg (args, port); fmt = va_arg (args, char *);#endif w = (Widget) fp.f; if (w == console && !console_is_visible) { XtPopup (shell1, XtGrabNone); console_is_visible = 1; } vsprintf (io_buffer, fmt, args); va_end (args); write_text_to_window (w, io_buffer); /* Look for keyboard input (such as ^C) */ while (XtAppPending (app_context)) { XEvent event; XtAppNextEvent (app_context, &event); XtDispatchEvent (&event); }}/* Simulate the semantics of fgets, not gets, on an x-window. */#ifdef __STDC__voidread_input (char *str, int str_size)#elsevoidread_input (str, str_size) char *str; int str_size;#endif{ char buffer[11]; KeySym key; XComposeStatus compose; XEvent event; char *ptr; if (!console_is_visible) { XtPopup (shell1, XtGrabNone); console_is_visible = 1; } ptr = str; while (1 < str_size) /* Reserve space for null */ { XtAppNextEvent (app_context, &event); if (event.type == KeyPress) { int chars = XLookupString (&event.xkey, buffer, 10, &key, &compose); if ((key == XK_Return) || (key == XK_KP_Enter)) { *ptr++ = '\n'; write_text_to_window (console, "\n"); break; } else if (*buffer == 3) /* ^C */ XtDispatchEvent (&event); else { int n = (chars < str_size - 1 ? chars : str_size - 1); strncpy (ptr, buffer, n); ptr += n; str_size -= n; buffer[chars] = '\0'; write_text_to_window (console, buffer); } } else XtDispatchEvent (&event); } if (0 < str_size) *ptr = '\0';}#ifdef __STDC__intconsole_input_available (void)#elseintconsole_input_available ()#endif{ if (mapped_io) return (XtAppPending (app_context)); else return (0);}#ifdef __STDC__charget_console_char (void)#elsecharget_console_char ()#endif{ XEvent event; if (!console_is_visible) { XtPopup (shell1, XtGrabNone); console_is_visible = 1; } while (1) { XtAppNextEvent (app_context, &event); if (event.type == KeyPress) { char buffer[11]; KeySym key; XComposeStatus compose; XLookupString (&event.xkey, buffer, 10, &key, &compose); if (*buffer == 3) /* ^C */ XtDispatchEvent (&event); else if (*buffer != 0) return (buffer[0]); } else XtDispatchEvent (&event); }}#ifdef __STDC__voidput_console_char (char c)#elsevoidput_console_char (c) char c;#endif{ char buf[4]; buf[0] = c; buf[1] = '\0'; if (!console_is_visible) { XtPopup (shell1, XtGrabNone); console_is_visible = 1; } write_text_to_window (console, buf);}/* Print an error message. */#ifdef __STDC__voiderror (char *fmt, ...)#else/*VARARGS0*/voiderror (va_alist)va_dcl#endif{ va_list args;#ifndef __STDC__ char *fmt;#endif char io_buffer [IO_BUFFSIZE];#ifdef __STDC__ va_start (args, fmt);#else va_start (args); fmt = va_arg (args, char *);#endif vsprintf (io_buffer, fmt, args); va_end (args); if (message != 0) write_text_to_window (message, io_buffer); else fprintf (stderr, "%s", io_buffer);}#ifdef __STDC__int*run_error (char *fmt, ...)#else/*VARARGS0*/int*run_error (va_alist)va_dcl#endif{ va_list args;#ifndef __STDC__ char *fmt;#endif char io_buffer [IO_BUFFSIZE];#ifdef __STDC__ va_start (args, fmt);#else va_start (args); fmt = va_arg (args, char *);#endif vsprintf (io_buffer, fmt, args); va_end (args); if (message != 0) write_text_to_window (message, io_buffer); else fprintf (stderr, "%s", io_buffer); if (spim_is_running) longjmp (spim_top_level_env, 1); return (0); /* So it can be used in expressions */}#ifdef __STDC__static voidwrite_text_to_window (Widget w, char *s)#elsestatic voidwrite_text_to_window (w, s) Widget w; char *s;#endif{ XawTextBlock textblock; XawTextPosition ip = XawTextGetInsertionPoint (w); if (!s || strlen (s) == 0) return; textblock.firstPos = 0; textblock.length = strlen (s); textblock.ptr = s; textblock.format = FMT8BIT; XawTextReplace (w, ip, ip, &textblock); XawTextSetInsertionPoint (w, XawTextGetInsertionPoint (w) + textblock.length);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -