#include "hexfile.h"
#include "keyboard.h"
-/* Maximum number of BreakPoints */
-#define MAXBP 32
-
-#define ENDLINE "\n"
-
-static int RunningState;
-static int NbBreakpoints;
-static unsigned int Breakpoints[MAXBP];
+extern struct options_t options;
/* Capitalize all letters in buffer */
static void
strcpy(buffer, &buffer[k]);
}
-/* Is the a breakpoint at Address */
-static int
-IsBreakpoint(unsigned int Address)
-{
- int Index = 0;
- while (Index < NbBreakpoints && (Breakpoints[Index] != Address))
- Index++;
-
- return ((Breakpoints[Index] == Address) && (Index < NbBreakpoints));
-}
-
-/* Show Breakpoints list */
-static void
-ShowBreakpoints(void)
-{
- int Index;
-
- for (Index = 0; Index < NbBreakpoints ; Index++)
- printf("Breakpoint at Address = %.4X\n", Breakpoints[Index]);
-}
-
-/* Clear Breakpoint at Address from list */
-static void
-ClearBreakpoint(unsigned int Address)
-{
- int Index = 0;
- while ((Index < NbBreakpoints) && (Breakpoints[Index] != Address))
- Index++;
- if (Breakpoints[Index] != Address)
- return;
- Breakpoints[Index] = Breakpoints[NbBreakpoints - 1];
- NbBreakpoints--;
-}
-
-/* Set Breakpoint at Address from list */
-static void
-SetBreakpoint(unsigned int Address)
-{
- if (IsBreakpoint(Address))
- return;
- if (NbBreakpoints < MAXBP)
- Breakpoints[NbBreakpoints++] = Address;
-}
-
/* CPU exec and Console UI update */
static void
console_exec(char *Address, char *NumberInst)
{
- char dummy;
int NbInst = -1; /* -1 is infinity */
if (strlen(Address) == 0) {
printf("Invalid address\n");
NbInst--;
} while (!IsBreakpoint(cpu8051.pc) && (NbInst != 0) && !kbhit());
if (kbhit()) {
- dummy = getch(); /* Flush key */
+ (void) getch(); /* Flush key */
printf("Caught break signal!\n");
}
if (NbInst == 0)
DisasmN(MemAddress, NbInst);
}
-/* Dump memory */
-static void
-DumpMem(char *Address, int memory_id)
-{
- unsigned int MemAddress;
- int Offset, Column;
- int size = 256;
-
- if (strlen(Address) != 0) {
- if (STREQ(Address, "PC"))
- MemAddress = cpu8051.pc;
- else
- MemAddress = Ascii2Hex(Address, strlen(Address));
- } else {
- MemAddress = 0;
- }
-
- for (Offset = 0; Offset < size; Offset += 16) {
- unsigned char data[16];
-
- printf("%.4X ", MemAddress + Offset);
- for (Column = 0; Column < 16; Column++) {
- data[Column] = memory_read8(memory_id, MemAddress +
- Offset + Column);
- printf(" %.2X", (int) data[Column]);
- }
- printf(" ");
-
- /* Display any ASCII characters */
- for (Column = 0; Column < 16; Column++) {
- if ((int) data[Column] >= 32 &&
- (int) data[Column] <= 126)
- printf("%c", data[Column]);
- else
- printf(".");
- }
- printf("\n");
- }
-}
-
/* Set NewValue to Register */
static void
SetRegister(char *Register, char *NewValue)
else if (STREQ(Register, "SP"))
cpu8051_WriteD(_SP_, Ascii2Hex(NewValue, 2));
else {
- printf("%sInvalid register name!%s", ENDLINE, ENDLINE);
+ printf("\nInvalid register name!\n");
printf("Valid registers are A, B, PC and SP.\n");
}
}
" Set Breakpoint.............. SB [address]",
" Remove Breakpoint........... RB [address]",
" Display Breakpoint(s)....... DB",
- " Dump External Data Memory... DE [address]",
- " Dump Internal Data Memory... DI [address]",
- " Dump Program Memory......... DP [address]",
+ " Dump External Data Memory... DE [address] [size]",
+ " Dump Internal Data Memory... DI [address] [size]",
+ " Dump Program Memory......... DP [address] [size]",
" Display Registers content... DR",
" Execute..................... EM [address"
" [number of instructions]]",
Index = 0;
while (Title[Index] != 0)
- printf("%s%s", Title[Index++], ENDLINE);
+ printf("%s\n", Title[Index++]);
Index = 0;
while (Menu[Index] != 0)
- printf("%s%s", Menu[Index++], ENDLINE);
+ printf("%s\n", Menu[Index++]);
console_reset();
while (!QuitRequest) {
int slen;
size_t len = 0;
- ssize_t bytes_read;
char Command[256];
char Args[256];
char Parameter1[256];
Parameter2[0] = '\0';
printf(prompt);
- bytes_read = getline(&line, &len, stdin);
+ (void) getline(&line, &len, stdin);
Capitalize(line);
RemoveSpaces(line);
switch (Command[0]) {
case 'D':
- if (strlen(Parameter2) == 0) {
- if (STREQ(Command, "DB") &&
- (strlen(Parameter1) == 0))
- ShowBreakpoints();
- else if (STREQ(Command, "DE"))
- DumpMem(Parameter1, EXT_MEM_ID);
- else if (STREQ(Command, "DI"))
- DumpMem(Parameter1, INT_MEM_ID);
- else if (STREQ(Command, "DP")) {
- if ((strlen(Parameter1) == 0))
- strcpy(Parameter1, "PC");
- DumpMem(Parameter1, PGM_MEM_ID);
- } else if (STREQ(Command, "DR") &&
- (strlen(Parameter1) == 0))
- console_show_registers();
- else
- goto syntax_error;
- } else
+ 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':
int
main(int argc, char **argv)
{
- char *hex_file;
-
- ParseCommandLineOptions(argc, argv);
+ parse_command_line_options(argc, argv);
cpu8051_init();
- RunningState = 0;
- NbBreakpoints = 0;
-
- hex_file = get_hex_filename();
-
- if (hex_file != NULL)
- LoadHexFile(hex_file);
+ if (options.filename != NULL)
+ LoadHexFile(options.filename);
console_main();
- printf("End of program.\n");
+
+ log_info("Terminate");
return 0;
}