📄 main.c
字号:
/*
* File: main.c
* Purpose: Main entry point of debugger.
*
* Notes:
*
* Author: Eric DeVolder
* Date:
*
* Modifications:
*
*/
/********************************************************************/
#include "src/include/dbug.h"
#include "src/uif/uif.h"
/********************************************************************/
/*
* Static variables
*/
const int UIF_VER_MAJOR = 3;
const char UIF_VER_MINOR = 'b';
static const char PROMPT[] = "dBUG> ";
static const char SYNTAX[] = "Error: Invalid syntax for: %s\n";
static char cmdline1 [UIF_MAX_LINE];
static char cmdline2 [UIF_MAX_LINE];
/********************************************************************/
char *
get_line (char *line)
{
int pos;
int ch;
pos = 0;
board_putchar_flush();
ch = (int)board_getchar();
while ( (ch != 0x0D /* CR */) &&
(ch != 0x0A /* LF/NL */) &&
(pos < UIF_MAX_LINE))
{
switch (ch)
{
case 0x08: /* Backspace */
case 0x7F: /* Delete */
if (pos > 0)
{
pos -= 1;
board_putchar(0x08); /* backspace */
board_putchar(' ');
board_putchar(0x08); /* backspace */
}
break;
default:
if ((pos+1) < UIF_MAX_LINE)
{
if ((ch > 0x1f) && (ch < 0x80))
{
line[pos++] = (char)ch;
board_putchar((char)ch);
}
}
break;
}
ch = (int)board_getchar();
}
line[pos] = '\0';
board_putchar(0x0D); /* CR */
board_putchar(0x0A); /* LF */
return line;
}
/********************************************************************/
int
make_argv (char *cmdline, char *argv[])
{
int argc, i, in_text;
/* break cmdline into strings and argv */
/* it is permissible for argv to be NULL, in which case */
/* the purpose of this routine becomes to count args */
argc = 0;
i = 0;
in_text = FALSE;
while (cmdline[i] != '\0') /* getline() must place 0x00 on end */
{
if (((cmdline[i] == ' ') ||
(cmdline[i] == '\t')) )
{
if (in_text)
{
/* end of command line argument */
cmdline[i] = '\0';
in_text = FALSE;
}
else
{
/* still looking for next argument */
}
}
else
{
/* got non-whitespace character */
if (in_text)
{
}
else
{
/* start of an argument */
in_text = TRUE;
if (argc < UIF_MAX_ARGS)
{
if (argv != NULL)
argv[argc] = &cmdline[i];
argc++;
}
else
/*return argc;*/
break;
}
}
i++; /* proceed to next character */
}
if (argv != NULL)
argv[argc] = NULL;
return argc;
}
/********************************************************************/
void
run_cmd (void)
{
/*
* Global array of pointers to emulate C argc,argv interface
*/
extern void get_history_line (char *);
int argc;
char *argv[UIF_MAX_ARGS + 1]; /* one extra for null terminator */
get_history_line(cmdline1);
if (!(argc = make_argv(cmdline1,argv)))
{
/* no command entered, just a blank line */
strcpy(cmdline1,cmdline2);
argc = make_argv(cmdline1,argv);
}
cmdline2[0] = '\0';
if (argc)
{
int i;
/*
* First try for an exact match on command name
*/
for (i = 0; i < UIF_NUM_CMD; i++)
{
if (strcasecmp(UIF_CMDTAB[i].cmd,argv[0]) == 0)
{
if (((argc-1) >= UIF_CMDTAB[i].min_args) &&
((argc-1) <= UIF_CMDTAB[i].max_args))
{
if (UIF_CMDTAB[i].flags & UIF_CMD_FLAG_REPEAT)
{
strcpy(cmdline2,argv[0]);
}
UIF_CMDTAB[i].func(argc,argv);
return;
}
else
{
printf(SYNTAX,argv[0]);
return;
}
}
}
/*
* Now try for short-hand match on command name
*/
for (i = 0; i < UIF_NUM_CMD; i++)
{
if (strncasecmp(UIF_CMDTAB[i].cmd,argv[0],
UIF_CMDTAB[i].unique) == 0)
{
if (((argc-1) >= UIF_CMDTAB[i].min_args) &&
((argc-1) <= UIF_CMDTAB[i].max_args))
{
if (UIF_CMDTAB[i].flags & UIF_CMD_FLAG_REPEAT)
{
strcpy(cmdline2,argv[0]);
}
UIF_CMDTAB[i].func(argc,argv);
return;
}
else
{
printf(SYNTAX,argv[0]);
return;
}
}
}
printf(INVCMD,argv[0]);
printf(HELPMSG);
}
}
static const char PAUSEMSG[] = "Press <ENTER> to continue.";
/********************************************************************/
int
pause (int *displayed)
{
int quit = FALSE;
int done = FALSE;
int i;
if (++*displayed >= 22)
{
printf(PAUSEMSG);
while (TRUE)
{
switch (board_getchar())
{
case '\r':
case '\n':
done = TRUE;
break;
case 'Q':
case 'q':
case '\003':
case '.':
done = TRUE;
quit = TRUE;
break;
default:
break;
}
if (done)
break;
}
/* printf("\n"); */
for (i = 0; i < sizeof(PAUSEMSG); ++i)
{
board_putchar(0x08); /* backspace */
board_putchar(' ');
board_putchar(0x08); /* backspace */
}
*displayed = 0;
}
return quit;
}
/********************************************************************/
void mainloop (void)
{
while (TRUE)
{
printf(PROMPT);
run_cmd();
}
}
/********************************************************************/
int
main (void)
{
extern char __DATA_ROM[];
extern char __DATA_RAM[];
extern char __DATA_END[];
extern char __BSS_START[];
extern char __BSS_END[];
extern uint32 VECTOR_TABLE[];
extern uint32 __VECTOR_RAM[];
extern void cpu_init (void);
extern void uif_init (void);
uint32 vector;
/* move to cpu_init() ???? */
/*
* Copy the dBUG vector table from ROM to RAM
*/
if (__VECTOR_RAM != VECTOR_TABLE)
{
#if defined(CPU_ARCH_CF)
for (vector = 0; vector < 256; vector++)
{
__VECTOR_RAM[vector] = VECTOR_TABLE[vector];
}
#elif defined(CPU_ARCH_PPC)
for (vector = 0; vector < (0x00002000>>2); vector++)
{
__VECTOR_RAM[vector] = VECTOR_TABLE[vector];
}
#else
#error "Error: CPU vector table in main.c"
#endif
}
/*
* Move initialized data from ROM to RAM.
*/
if (__DATA_ROM != __DATA_RAM)
{
memcpy(__DATA_RAM,__DATA_ROM,__DATA_END-__DATA_RAM);
}
/*
* Zero uninitialized data
*/
if (__BSS_START != __BSS_END)
{
memset(__BSS_START,0,__BSS_END-__BSS_START);
}
board_init();
cpu_init();
uif_init();
cmdline1[0] = '\0';
cmdline2[0] = '\0';
board_init2();
uif_cmd_ver(NULL,NULL);
board_init3();
printf(HELPMSG);
#if defined(DEBUG_PRINT)
printf("High-level DEBUG_PRINT on\n");
#endif
printf("\n");
mainloop();
return 0; /* useless, should never reach! */
}
/********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -