From 37bb3b675d3a9bcb492b9a1e1e19860228f8a8ca Mon Sep 17 00:00:00 2001 From: jaortega Date: Tue, 19 Dec 2000 00:12:25 +0000 Subject: added tracing instructions functionality --- mixutils/mixvm_command.c | 75 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 7 deletions(-) (limited to 'mixutils') diff --git a/mixutils/mixvm_command.c b/mixutils/mixvm_command.c index 53d98e0..3d783e1 100644 --- a/mixutils/mixvm_command.c +++ b/mixutils/mixvm_command.c @@ -31,7 +31,7 @@ #include #include -#include "mixlib/mix_eval.h" +#include #include "mixvm_command.h" /* The names of functions that actually do the manipulation. */ @@ -63,6 +63,8 @@ DEC_FUN (compile_); DEC_FUN (edit_); DEC_FUN (weval_); DEC_FUN (w2d_); +DEC_FUN (tron_); +DEC_FUN (troff_); DEC_FUN (quit_); /* A structure which contains information on the commands this program @@ -111,6 +113,8 @@ COMMAND commands[] = { { "weval", cmd_weval_, N_("Evaluate a given W-expres sion"), "weval WEXPR"}, { "w2d", cmd_w2d_, N_("Convert a MIX word to its decimal value"), "w2d WORD" }, + { "tron", cmd_tron_, N_("Turn on instruction tracing."), "tron" }, + { "troff", cmd_troff_, N_("Turn off instruction tracing."), "troff" }, { "quit", cmd_quit_, N_("Quit the program"), "quit" }, { (char *)NULL, (Function *)NULL, (char *)NULL } }; @@ -187,14 +191,15 @@ find_command_ (const char *name) return ((COMMAND *)NULL); } - + /* the virtual machine and dump context */ static mix_vm_t *vm_ = NULL; static mix_dump_context_t *dc_ = NULL; - /* the w-expression evaluator */ static mix_eval_t *eval_ = NULL; - +/* trace status */ +static gboolean is_tracing_ = FALSE; + static int cmd_help_ (char *arg) @@ -258,20 +263,57 @@ cmd_load_ (char *arg) } mix_eval_set_symbols_from_table (eval_, mix_vm_get_symbol_table (vm_)); - + fprintf (stderr, _("Program loaded. Start address: %d\n"), mix_vm_get_prog_count (vm_)); return TRUE; } +/* trace current instruction */ +static void +trace_ () +{ + const mix_src_file_t *file = mix_vm_get_src_file (vm_); + const gchar *line = ""; + gchar *strins; + mix_address_t loc = mix_vm_get_prog_count (vm_); + mix_word_t ins = mix_vm_get_addr_contents (vm_, loc); + mix_ins_t fins; + mix_word_to_ins_uncheck (ins, fins); + strins = mix_ins_to_string (&fins); + + if (file != NULL) + { + gulong b = mix_vm_get_break_lineno (vm_); + if (b > 0) line = mix_src_file_get_line (file, b); + } + + printf ("%d: [%s]\t%s", (gint)loc, strins, line); + if (strins != NULL) g_free (strins); +} + +static int +run_and_trace_ () +{ + int k = MIX_VM_OK; + if (!is_tracing_) + return mix_vm_run (vm_); + else while (k == MIX_VM_OK) + { + trace_ (); + k = mix_vm_exec_next (vm_); + } + return k; +} + static int cmd_run_ (char *arg) { if (arg != NULL && *arg != '\0' && cmd_load_ (arg) != TRUE) return TRUE; puts (_("Running ...")); - switch (mix_vm_run (vm_)) + switch (run_and_trace_ ()) { case MIX_VM_HALT: puts (_("... done")); @@ -301,6 +343,8 @@ static int cmd_next_ (char *arg) { int ins_no = 1; + int k; + if ( strlen (arg) != 0 ) { int k = 0; @@ -316,7 +360,8 @@ cmd_next_ (char *arg) while ( ins_no-- > 0 ) { - int k = mix_vm_exec_next (vm_); + if (is_tracing_) trace_ (); + k = mix_vm_exec_next (vm_); if (k == MIX_VM_HALT) { fprintf (stderr, _("End of program reached at address %d\n"), @@ -928,6 +973,22 @@ cmd_w2d_ (char *arg) return TRUE; } +static int +cmd_tron_ (char *arg) +{ + is_tracing_ = TRUE; + printf (_("Instruction tracing has been turned ON.\n")); + return TRUE; +} + +static int +cmd_troff_ (char *arg) +{ + is_tracing_ = FALSE; + printf (_("Instruction tracing has been turned OFF.\n")); + return TRUE; +} + /* external interface */ void -- cgit v1.2.3