Add general-purpose timer to CLI
[emu8051.git] / src / cli / emuconsole.c
index 5dd93df..e4b010d 100644 (file)
@@ -21,6 +21,7 @@
 
 #define _GNU_SOURCE /* For getline() */
 #include <stdio.h>
+#include <stdbool.h>
 #include <string.h>
 #include <ctype.h> /* For isblank, toupper() */
 #include "config.h"
@@ -30,6 +31,7 @@
 #include "reg8051.h"
 #include "sfr.h"
 #include "memory.h"
+#include "timers.h"
 #include "options.h"
 #include "hexfile.h"
 #include "keyboard.h"
@@ -204,6 +206,9 @@ console_dump_sfr_registers_compact(void)
        printf("|    |\n");
        printf("---------------------------------------------------------------"
               "-------\n");
+
+       printf("| General-purpose Timer: %08d |\n", gp_timer_read());
+       printf("-----------------------------------\n");
 }
 
 /* Show CPU registers */
@@ -260,7 +265,7 @@ console_main(void)
                "  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",
@@ -268,16 +273,17 @@ console_main(void)
                "  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 {
@@ -323,6 +329,11 @@ console_main(void)
                                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';
@@ -385,7 +396,17 @@ console_main(void)
                                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;
@@ -472,6 +493,10 @@ console_main(void)
                        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;
@@ -497,12 +522,17 @@ TooMuchParameters:
 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();