Implemented repeat execution for reader.

Repeat execution is supported by the commands "step", "md" and "dis".
This commit is contained in:
Daniel Beer 2010-10-12 12:48:25 +13:00
parent 5e39d82784
commit b2d2da6cb6
4 changed files with 51 additions and 3 deletions

View File

@ -79,6 +79,8 @@ int cmd_md(char **arg)
length = 0x10000 - offset;
}
reader_set_repeat("md 0x%x 0x%x", offset + length, length);
while (length) {
uint8_t buf[128];
int blen = length > sizeof(buf) ? sizeof(buf) : length;
@ -189,6 +191,7 @@ int cmd_step(char **arg)
if (device_default->ctl(device_default, DEVICE_CTL_STEP) < 0)
return -1;
reader_set_repeat("step");
return cmd_regs(NULL);
}
@ -315,6 +318,7 @@ int cmd_dis(char **arg)
return -1;
}
reader_set_repeat("dis 0x%x 0x%x", offset + length, length);
disassemble(offset, buf, length);
free(buf);
return 0;

View File

@ -131,6 +131,11 @@ Commands take arguments separated by spaces. Any text string enclosed
in double-quotation marks is considered to be a single argument, even
if it contains space characters. Within a quoted string, the usual
C-style backslash substitutions can be used.
Commands can be specified by giving the first few characters of the
command name, provided that the prefix is unambiguous. Some commands
support automatic repeat. For these commands, pressing enter at the
reader prompt without typing anything will cause repeat execution.
.IP "\fB=\fR \fIexpression\fR"
Evaluate an address expression and show both its value, and the result
when the value is looked up in reverse in the current symbol
@ -166,6 +171,9 @@ length (64 bytes) is disassembled and shown.
If symbols are available, then all addresses used as operands are
translated into \fIsymbol\fR+\fIoffset\fR form.
This command supports repeat execution. If repeated, it continues to
disassemble another block of memory following that last printed.
.IP "\fBerase\fR [\fBall\fR|\fBsegment\fR] [\fIaddress\fR]"
Erase the device under test. With no arguments, all code memory is erased
(but not information or boot memory). With the argument "all", a mass
@ -293,6 +301,9 @@ The output is split into three columns. The first column shows the
starting address for the line. The second column lists the hexadecimal
values of the bytes. The final column shows the ASCII characters
corresponding to printable bytes, and . for non-printing characters.
This command supports repeat execution. If repeated, it continues to
print another block of memory following that last printed.
.IP "\fBmw\fR \fIaddress\fR \fIbytes\fR ..."
Write a sequence of bytes at the given memory address. The address given
may be an address expression. Bytes values are two-digit hexadecimal
@ -354,7 +365,8 @@ register values are displayed, as well as a disassembly of the
instructions at the address selected by the program counter.
An optional count can be specified to step multiple times. If no
argument is given, the CPU steps once.
argument is given, the CPU steps once. This command supports repeat
execution.
.IP "\fBsym clear\fR"
Clear the symbol table, deleting all symbols.
.IP "\fBsym set\fR \fIname\fR \fIvalue\fR"

View File

@ -36,9 +36,12 @@
#include "reader.h"
#include "opdb.h"
#define MAX_READER_LINE 1024
static int modify_flags;
static int in_reader_loop;
static int want_exit;
static char repeat_buf[MAX_READER_LINE];
void mark_modified(int flags)
{
@ -147,6 +150,15 @@ void reader_exit(void)
want_exit = 1;
}
void reader_set_repeat(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vsnprintf(repeat_buf, sizeof(repeat_buf), fmt, ap);
va_end(ap);
}
void reader_loop(void)
{
int old = in_reader_loop;
@ -164,15 +176,27 @@ void reader_loop(void)
for (;;) {
char *buf = readline("(mspdebug) ");
char tmpbuf[MAX_READER_LINE];
if (!buf) {
printc("\n");
break;
}
add_history(buf);
do_command(buf, 1);
/* Copy into our local buffer and free */
strncpy(tmpbuf, buf, sizeof(tmpbuf));
tmpbuf[sizeof(tmpbuf) - 1] = 0;
free(buf);
buf = tmpbuf;
if (*buf) {
add_history(buf);
repeat_buf[0] = 0;
} else {
memcpy(tmpbuf, repeat_buf, sizeof(tmpbuf));
}
do_command(buf, 1);
if (want_exit)
break;

View File

@ -49,6 +49,14 @@ void reader_loop(void);
/* Cause the reader loop to exit */
void reader_exit(void);
/* Set up the command to be repeated. When the user presses enter without
* typing anything, the last executed command is repeated, by default.
*
* Using this function, a command can specify an alternate command for
* the next execution.
*/
void reader_set_repeat(const char *fmt, ...);
/* Commands can be fed directly to the processor either one at a time,
* or by specifying a file to read from.
*