- while (!QuitRequest) {
- int slen;
- size_t len = 0;
- char Command[256];
- char Args[256];
- char Parameter1[256];
- char Parameter2[256];
-
- Parameter1[0] = '\0';
- Parameter2[0] = '\0';
-
- printf("%s", prompt);
- (void) getline(&line, &len, stdin);
- Capitalize(line);
- RemoveSpaces(line);
-
- /* Strip trailing newline */
- slen = strlen(line);
- if (line[slen - 1] == '\n')
- line[slen - 1] = '\0';
-
- /* Find command-arguments delimiter */
- for (Index = 0; Index < strlen(line); Index++) {
- if (isblank(line[Index]))
- break;
- }
-
- /* Keep only the Command part from the input line */
- memcpy(Command, &line[0], Index);
- Command[Index] = '\0';
-
- /* Keep only the arguments part from the input line */
- if (Index < strlen(line)) {
- slen = strlen(line) - Index;
- memcpy(Args, &line[Index + 1], slen);
- } else {
- slen = 0;
- }
- Args[slen] = '\0';
- RemoveSpaces(Args);
-
- /* Find multi-arguments delimiter */
- for (Index = 0; Index < strlen(Args); Index++) {
- if (isblank(Args[Index]))
- break;
- }
-
- memcpy(Parameter1, &Args[0], Index);
- Parameter1[Index] = '\0';
-
- if (Index < strlen(Args)) {
- slen = strlen(Args) - Index;
- memcpy(Parameter2, &Args[Index + 1], slen);
- } else {
- slen = 0;
- }
- Parameter2[slen] = '\0';
- RemoveSpaces(Parameter2);
-
- if (strlen(Command) == 0) {
- goto syntax_error;
- continue;
- }
-
- if ((strlen(Parameter1) > 4) || (strlen(Parameter2) > 4)) {
- printf("Invalid Parameter Format!\n");
- continue;
- }
-
- switch (Command[0]) {
- case 'D':
- if (STREQ(Command, "DB") &&
- (strlen(Parameter1) == 0))
- ShowBreakpoints();
- else if (STREQ(Command, "DE"))
- DumpMem(Parameter1, Parameter2, EXT_MEM_ID);
- else if (STREQ(Command, "DI"))
- DumpMem(Parameter1, Parameter2, INT_MEM_ID);
- else if (STREQ(Command, "DP")) {
- if ((strlen(Parameter1) == 0))
- strcpy(Parameter1, "PC");
- DumpMem(Parameter1, Parameter2, PGM_MEM_ID);
- } else if (STREQ(Command, "DR") &&
- (strlen(Parameter1) == 0))
- console_show_registers();
- else
- goto syntax_error;
- break;
- case 'E':
- if (STREQ(Command, "EM"))
- console_exec(Parameter1, Parameter2);
- else
- goto syntax_error;
- break;
- case 'H':
- case '?':
- if ((STREQ(Command, "H") || STREQ(Command, "?")) &&
- (strlen(Parameter1) == 0) &&
- (strlen(Parameter2) == 0)) {
- Index = 0;
- while (Menu[Index] != 0)
- printf("%s\n", Menu[Index++]);
- } else
- goto syntax_error;
- break;
- case 'M':
- if ((strlen(Parameter1) == 0) ||
- (strlen(Parameter2) == 0))
- printf("Missing Parameter!\n");
- else if (STREQ(Command, "ME")) {
- unsigned int adresse = Ascii2Hex(Parameter1, 4);
- unsigned char valeur = Ascii2Hex(Parameter2, 2);
- memory_write8(EXT_MEM_ID, adresse, valeur);
- } else if (STREQ(Command, "MI")) {
- unsigned int adresse = Ascii2Hex(Parameter1, 2);
- unsigned char valeur = Ascii2Hex(Parameter2, 2);
- memory_write8(INT_MEM_ID, adresse, valeur);
- } else if (STREQ(Command, "MP")) {
- unsigned int adresse = Ascii2Hex(Parameter1, 4);
- unsigned char valeur = Ascii2Hex(Parameter2, 2);
- memory_write8(PGM_MEM_ID, adresse, valeur);
- } else if (STREQ(Command, "MR"))
- SetRegister(Parameter1, Parameter2);
- else
- goto syntax_error;
- break;
- case 'Q':
- if (STREQ(Command, "Q") && (strlen(Parameter1) == 0) &&
- (strlen(Parameter2) == 0))
- QuitRequest = 1;
- else
- goto syntax_error;
- break;
- case 'R':
- if (strlen(Parameter2) != 0)
- goto TooMuchParameters;
- if (STREQ(Command, "RB")) {
- if (strlen(Parameter1) == 0)
- ClearBreakpoint(cpu8051.pc);
- else
- ClearBreakpoint(
- Ascii2Hex(Parameter1, 4));
- } else
- goto syntax_error;
- break;
- case 'S':
- if (strlen(Parameter2) != 0)
- goto TooMuchParameters;
-
- if (STREQ(Command, "SB")) {
- if (strlen(Parameter1) == 0)
- SetBreakpoint(cpu8051.pc);
- else
- SetBreakpoint(Ascii2Hex(Parameter1, 4));
- } else
- goto syntax_error;
- break;
- case 'T':
- if (strlen(Parameter2) != 0)
- printf("Wrong Number of Parameters!\n");
-
- if (STREQ(Command, "T"))
- console_trace(Parameter1);
- else
- goto syntax_error;
- break;
- case 'U':
- if (STREQ(Command, "U"))
- Disasm(Parameter1, Parameter2);
- else
- goto syntax_error;
- break;
- case 'Z':
- if (STREQ(Command, "Z") && (strlen(Parameter1) == 0) &&
- (strlen(Parameter2) == 0))
- cpu8051_Reset();
- else
- goto syntax_error;
- break;
- case '\n':
- break;
- default:
- goto syntax_error;
- }
- continue;
-
-syntax_error:
- printf("Syntax Error!\n");
- continue;
-TooMuchParameters:
- printf("Wrong Number of Parameters!\n");
- continue;
- }
-
- if (line)
- free(line);
-}
-
-int
-main(int argc, char **argv)
-{
- parse_command_line_options(argc, argv);
-
- cpu8051_init();
-
- if (options.filename != NULL)
- LoadHexFile(options.filename);
-
- console_main();
-
- log_info("Terminate");
-