#define _GNU_SOURCE /* For getline() */
#include <stdio.h>
+#include <stdbool.h>
#include <string.h>
#include <ctype.h> /* For isblank, toupper() */
#include "config.h"
#include "reg8051.h"
#include "sfr.h"
#include "memory.h"
+#include "timers.h"
#include "options.h"
#include "hexfile.h"
#include "keyboard.h"
printf("| |\n");
printf("---------------------------------------------------------------"
"-------\n");
+
+ printf("| General-purpose Timer: %08d |\n", gp_timer_read());
+ printf("-----------------------------------\n");
}
/* Show CPU registers */
" Dump Internal Data Memory... DI [address] [size]",
" Dump Program Memory......... DP [address] [size]",
" Display Registers content... DR",
- " Execute..................... EM [address"
+ " Execute (Run)............... EM [address"
" [number of instructions]]",
" Help........................ H or ?",
" Modify External Data Memory. ME address value",
" Modify Program Memory....... MP address value",
" Modify Register............. MR register value",
" Quit Emulator............... Q",
- " Trace mode.................. T [address]",
+ " Trace mode (step)........... T [address]",
" Unassemble.................. U [address]"
" [number of instructions]",
- " Reset processor............. Z", 0 };
+ " Reset processor............. Z",
+ " Reset general-purpose timer. ZT", 0 };
console_reset();
if (options.stop_address != 0) {
/* Automatically run program and stop at specified address. */
- console_exec("0x0000", NULL);
+ console_exec("PC", NULL);
console_show_registers();
QuitRequest = 1;
} else {
break;
}
+ if (strlen(line) == 0) {
+ /* Empty line, this is not an error. */
+ continue;
+ }
+
/* Keep only the Command part from the input line */
memcpy(Command, &line[0], Index);
Command[Index] = '\0';
goto syntax_error;
break;
case 'E':
- if (STREQ(Command, "EM"))
+ if (STREQ(Command, "EM") &&
+ (strlen(Parameter1) == 0) &&
+ (strlen(Parameter2) == 0))
+ console_exec("PC", NULL);
+ else if (STREQ(Command, "EM") &&
+ (strlen(Parameter1) != 0) &&
+ (strlen(Parameter2) == 0))
+ console_exec(Parameter1, NULL);
+ else if (STREQ(Command, "EM") &&
+ (strlen(Parameter1) != 0) &&
+ (strlen(Parameter2) != 0))
console_exec(Parameter1, Parameter2);
else
goto syntax_error;
if (STREQ(Command, "Z") && (strlen(Parameter1) == 0) &&
(strlen(Parameter2) == 0))
cpu8051_Reset();
+ else if (STREQ(Command, "ZT") &&
+ (strlen(Parameter1) == 0) &&
+ (strlen(Parameter2) == 0))
+ gp_timer_reset();
else
goto syntax_error;
break;
int
main(int argc, char **argv)
{
+ int rc;
+
parse_command_line_options(argc, argv);
cpu8051_init();
- if (options.filename != NULL)
- LoadHexFile(options.filename);
+ if (options.filename != NULL) {
+ rc = LoadHexFile(options.filename);
+ if (rc == false)
+ exit(1);
+ }
console_main();