projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
s51: add breakpoints and the ability to block awaiting a breakpoint.
[fw/altos]
/
s51
/
s51-parse.c
diff --git
a/s51/s51-parse.c
b/s51/s51-parse.c
index 56a63e243712205a6f350e1a6346e59a6ee589fd..d0bfb45b943b4a8b4f6908701d92de09a3a053e4 100644
(file)
--- a/
s51/s51-parse.c
+++ b/
s51/s51-parse.c
@@
-21,7
+21,7
@@
struct command_function {
char *name;
char *alias;
struct command_function {
char *name;
char *alias;
- enum command_result (*func)(
FILE *output,
int argc, char **argv);
+ enum command_result (*func)(int argc, char **argv);
char *usage;
char *help;
};
char *usage;
char *help;
};
@@
-40,6
+40,8
@@
static struct command_function functions[] = {
"set bit <addr>\n" },
{ "dump", "d", command_dump, "[d]ump <prefix> <start> <end>",
"Dump {xram|rom|iram|sfr} <start> <end>\n" },
"set bit <addr>\n" },
{ "dump", "d", command_dump, "[d]ump <prefix> <start> <end>",
"Dump {xram|rom|iram|sfr} <start> <end>\n" },
+ { "file", "file", command_file, "file <filename>",
+ "Pretend to load executable from <filename>\n" },
{ "pc", "p", command_pc, "[p]c [addr]",
"Get or set pc value\n" },
{ "break", "b", command_break,"[b]reak <addr>",
{ "pc", "p", command_pc, "[p]c [addr]",
"Get or set pc value\n" },
{ "break", "b", command_break,"[b]reak <addr>",
@@
-149,23
+151,23
@@
command_split_into_words(char *line, char **argv)
}
enum command_result
}
enum command_result
-command_help(
FILE *output,
int argc, char **argv)
+command_help(int argc, char **argv)
{
int i;
struct command_function *func;
if (argc == 1) {
for (i = 0; i < NUM_FUNCTIONS; i++)
{
int i;
struct command_function *func;
if (argc == 1) {
for (i = 0; i < NUM_FUNCTIONS; i++)
-
fprintf(output,
"%-10s%s\n", functions[i].name,
+
s51_printf(
"%-10s%s\n", functions[i].name,
functions[i].usage);
} else {
for (i = 1; i < argc; i++) {
func = command_string_to_function(argv[i]);
if (!func) {
functions[i].usage);
} else {
for (i = 1; i < argc; i++) {
func = command_string_to_function(argv[i]);
if (!func) {
-
fprintf(output,
"%-10s unknown command\n", argv[i]);
+
s51_printf(
"%-10s unknown command\n", argv[i]);
return command_syntax;
}
return command_syntax;
}
-
fprintf(output,
"%-10s %s\n%s", func->name,
+
s51_printf(
"%-10s %s\n%s", func->name,
func->usage, func->help);
}
}
func->usage, func->help);
}
}
@@
-173,16
+175,16
@@
command_help(FILE *output, int argc, char **argv)
}
static void
}
static void
-command_syntax_error(
FILE *output,
int argc, char **argv)
+command_syntax_error(int argc, char **argv)
{
{
-
fprintf(output,
"Syntax error in:");
+
s51_printf(
"Syntax error in:");
while (*argv)
while (*argv)
-
fprintf(output,
" %s", *argv++);
-
fprintf(output,
"\n");
+
s51_printf(
" %s", *argv++);
+
s51_printf(
"\n");
}
void
}
void
-command_read (
FILE *input, FILE *output
)
+command_read (
void
)
{
int argc;
char line[1024];
{
int argc;
char line[1024];
@@
-196,31
+198,34
@@
command_read (FILE *input, FILE *output)
exit(1);
}
ccdbg_debug_mode(s51_dbg);
exit(1);
}
ccdbg_debug_mode(s51_dbg);
- fprintf(output, "Welcome to the non-simulated processor\n");
+ ccdbg_halt(s51_dbg);
+ s51_printf("Welcome to the non-simulated processor\n");
for (;;) {
for (;;) {
- if (s51_prompt)
- fprintf(output, "%s", s51_prompt);
- else
- putc('\0', output);
- fflush(output);
- if (!fgets (line, sizeof line, input))
+ if (s51_read_line (line, sizeof line) == 0)
break;
break;
+ s51_interrupted = 0;
argc = command_split_into_words(line, argv);
if (argc > 0) {
func = command_string_to_function(argv[0]);
if (!func)
argc = command_split_into_words(line, argv);
if (argc > 0) {
func = command_string_to_function(argv[0]);
if (!func)
- command_syntax_error(
output,
argc, argv);
+ command_syntax_error(argc, argv);
else
{
else
{
- result = (*func->func)(output, argc, argv);
+ result = (*func->func)(argc, argv);
+ if (s51_interrupted)
+ result = command_interrupt;
switch (result) {
case command_syntax:
switch (result) {
case command_syntax:
- command_syntax_error(
output,
argc, argv);
+ command_syntax_error(argc, argv);
break;
case command_error:
break;
case command_error:
-
fprintf(output,
"Error\n");
+
s51_printf(
"Error\n");
break;
break;
- case command_proceed:
+ case command_success:
+ break;
+ case command_interrupt:
+ ccdbg_halt(s51_dbg);
+ s51_printf("Interrupted\n");
break;
default:
break;
break;
default:
break;
@@
-229,6
+234,6
@@
command_read (FILE *input, FILE *output)
}
}
ccdbg_close(s51_dbg);
}
}
ccdbg_close(s51_dbg);
-
fprintf(output,
"...\n");
+
s51_printf(
"...\n");
}
}