#include "cmd.h"
#include "newalloc.h"
+#ifdef SDCDB_DEBUG
+int sdcdbDebug = 0;
+#endif
+
char *currModName = NULL;
cdbrecs *recsRoot = NULL ;
set *modules = NULL; /* set of all modules */
set *functions = NULL ; /* set of functions */
set *symbols = NULL ; /* set of symbols */
+set *sfrsymbols= NULL ; /* set of symbols of sfr or sbit */
int nStructs = 0 ;
structdef **structs = NULL ; /* all structures */
int nLinkrecs = 0;
precede the synonym "b" */
/* break point */
{ "break" , cmdSetUserBp ,
- "{b}reak\t\t\t [LINE | FILE:LINE | FILE:FUNCTION | FUNCTION]\n",
+ "{b}reak\t\t\t [LINE | FILE:LINE | FILE:FUNCTION | FUNCTION | *<address>]\n",
},
{ "b" , cmdSetUserBp , NULL },
},
{ "c" , cmdContinue , NULL },
- { "disassemble",cmdDisasmF , "x disassemble asm commands\n" },
+ { "disassemble",cmdDisasmF , "disassemble [startaddr [endaddress]]\tdisassemble asm commands\n" },
{ "delete" , cmdDelUserBp ,
"{d}elete n\t\t clears break point number n\n"
},
{ "display" , cmdDisplay ,
- "display [<variable>]\t print value of given variable each time the program stops\n"
+ "display [/<fmt>] [<variable>]\t print value of given variable each time the program stops\n"
},
{ "undisplay" , cmdUnDisplay ,
"undisplay [<variable>]\t dont display this variable or all\n"
},
+ { "down" , cmdDown ,
+ "down\t\tSelect and print stack frame called by this one.\nAn argument says how many frames down to go.\n"
+ },
+ { "up" , cmdUp ,
+ "up\t\tSelect and print stack frame that called this one.\nAn argument says how many frames up to go.\n"
+ },
{ "d" , cmdDelUserBp , NULL },
{ "info" , cmdInfo ,
" <copying warranty>\t copying & distribution terms, warranty\n"
},
{ "set" , cmdSetOption , "set <srcmode>\t\t toggle between c/asm.\nset variable <var> = >value\t\tset variable to new value\n" },
+ { "stepi" , cmdStepi ,
+ "stepi\t\t\tStep one instruction exactly.\n"
+ },
{ "step" , cmdStep ,
- "{s}tep\t\t\t Step program until it reaches a different source line.\n"
+ "{s}tep\t\t\tStep program until it reaches a different source line.\n"
},
{ "s" , cmdStep , NULL },
+ { "nexti" , cmdNexti ,
+ "nexti\t\t\tStep one instruction, but proceed through subroutine calls.\n"
+ },
{ "next" , cmdNext ,
- "{n}ext\t\t\t Step program, proceeding through subroutine calls.\n"
+ "{n}ext\t\t\tStep program, proceeding through subroutine calls.\n"
},
{ "n" , cmdNext , NULL },
{ "run" , cmdRun ,
- "{r}un\t\t\t Start debugged program. \n"
+ "{r}un\t\t\tStart debugged program. \n"
},
{ "r" , cmdRun , NULL },
{ "ptype" , cmdPrintType ,
- "{pt}ype <variable>\t print type information of a variable\n"
+ "{pt}ype <variable>\tprint type information of a variable\n"
},
{ "pt" , cmdPrintType , NULL },
{ "print" , cmdPrint ,
"file <filename>\t\t load symbolic information from <filename>\n"
},
{ "frame" , cmdFrame ,
- "{fr}ame\t\t\t print information about the current Stack\n"
+ "{fr}ame\t\t print information about the current Stack\n"
},
{ "finish" , cmdFinish ,
"{fi}nish\t\t execute till return of current function\n"
},
{ "fi" , cmdFinish , NULL },
- { "where" , cmdWhere , "where\t\t\t print stack\n" },
+ { "where" , cmdWhere , "where\t\t print stack\n" },
{ "fr" , cmdFrame , NULL },
{ "f" , cmdFrame , NULL },
{ "x /i" , cmdDisasm1 , "x\t\t disassemble one asm command\n" },
/* if symbol then parse the symbol */
case SYM_REC:
- parseSymbol(loop->line,&rs);
+ parseSymbol(loop->line,&rs,2);
break;
case LNK_REC:
}
}
+/*-----------------------------------------------------------------*/
+/* generate extra sets of sfr and sbit symbols */
+/*-----------------------------------------------------------------*/
+static void specialFunctionRegs ()
+{
+ symbol *sym;
+ for (sym = setFirstItem(symbols);
+ sym ;
+ sym = setNextItem(symbols))
+ {
+ if ( sym->addrspace == 'I' ||
+ sym->addrspace == 'J')
+ {
+ addSet(&sfrsymbols,sym);
+ }
+ }
+}
/*-----------------------------------------------------------------*/
/* functionPoints - determine the execution points within a func */
/*-----------------------------------------------------------------*/
sym = func->sym;
- Dprintf(D_sdcdb, ("func '%s' has entry '%x' exit '%x'\n",
+ Dprintf(D_sdcdb, ("sdcdb: func '%s' has entry '0x%x' exit '0x%x'\n",
func->sym->name,
func->sym->addr,
func->sym->eaddr));
}
#ifdef SDCDB_DEBUG
- Dprintf(D_sdcdb, ("function '%s' has the following C exePoints\n",
+ if (!( D_sdcdb & sdcdbDebug))
+ continue;
+
+ Dprintf(D_sdcdb, ("sdcdb: function '%s' has the following C exePoints\n",
func->sym->name));
{
exePoint *ep;
for (ep = setFirstItem(func->cfpoints); ep;
ep = setNextItem(func->cfpoints))
- Dprintf(D_sdcdb, ("{%x,%d} %s",
- ep->addr,ep->line,mod->cLines[ep->line]->src));
+ Dprintf(D_sdcdb, ("sdcdb: {0x%x,%d} %s",
+ ep->addr,ep->line+1,mod->cLines[ep->line]->src));
- Dprintf(D_sdcdb, (" and the following ASM exePoints\n"));
+ Dprintf(D_sdcdb, ("sdcdb: and the following ASM exePoints\n"));
for (ep = setFirstItem(func->afpoints); ep;
ep = setNextItem(func->afpoints))
- Dprintf (D_sdcdb, ("{%x,%d} %s",
- ep->addr,ep->line,mod->asmLines[ep->line]->src));
+ Dprintf (D_sdcdb, ("sdcdb: {0x%x,%d} %s",
+ ep->addr,ep->line+1,mod->asmLines[ep->line]->src));
}
#endif
}
module */
functionPoints();
+ /* extract known special function registers */
+ specialFunctionRegs();
+
/* start the simulator & setup connection to it */
if ( sock == -1 )
openSimulator((char **)simArgs,nsimArgs);
for (i = 0 ; i < (sizeof(cmdTab)/sizeof(struct cmdtab)) ; i++)
{
if ((cmdTab[i].htxt) && !strcmp(cmdTab[i].cmd,s))
- fprintf(stdout,"%s",cmdTab[i].htxt);
+ {
+ s = strrchr(cmdTab[i].htxt,'\t');
+ if ( !s )
+ s = cmdTab[i].htxt;
+ else
+ s++;
+ fprintf(stdout,"%s",s);
+ break;
+ }
}
return 0;
}
if (srcMode == SRC_CMODE)
fprintf(stdout,"\032\032%s:%d:1:beg:0x%08x\n",
currCtxt->func->mod->cfullname,
- currCtxt->cline,currCtxt->addr);
+ currCtxt->cline+1,currCtxt->addr);
else
fprintf(stdout,"\032\032%s:%d:1:beg:0x%08x\n",
currCtxt->func->mod->afullname,
char *filename = NULL;
int passon_args_flag = 0; /* if true, pass on args to simulator */
- Dprintf(D_sdcdb, ("parseCmdLine\n"));
+ Dprintf(D_sdcdb, ("sdcdb: parseCmdLine\n"));
for ( i = 1; i < argc ; i++) {
//fprintf(stdout,"%s\n",argv[i]);
continue;
}
+#ifdef SDCDB_DEBUG
+ if (strncmp(argv[i],"-d=",3) == 0) {
+ sdcdbDebug = strtol(&argv[i][3],0,0);
+ continue;
+ }
+#endif
+
/* model string */
if (strncmp(argv[i],"-m",2) == 0) {
strncpy(model_str, &argv[i][2], 15);
/* XTAL Frequency */
if (strcmp(argv[i],"-X") == 0 ||
- strcmp(argv[i],"-frequency") == 0) {
+ strcmp(argv[i],"-frequency") == 0) {
simArgs[nsimArgs++] = "-X";
simArgs[nsimArgs++] = strdup(argv[++i]);
continue ;
/* serial port */
if ( (strcmp(argv[i],"-S") == 0) ||
(strcmp(argv[i],"-s") == 0)) {
- simArgs[nsimArgs++] = "-s";
+ simArgs[nsimArgs++] = strdup(argv[i]);
simArgs[nsimArgs++] = strdup(argv[++i]);
continue ;
}
static void
sigintr(int sig)
{
- /* may be interrupt from user: stop debugger ( also simulator ??) */
+ /* may be interrupt from user: stop debugger and also simulator */
userinterrupt = 1;
+ sendSim("stop\n");
}
/* the only child can be the simulator */
signal(SIGTERM, bad_signal);
signal(SIGCHLD, sigchld );
- signal(SIGPIPE, SIG_IGN);
signal(SIGABRT, bad_signal);
signal(SIGALRM, bad_signal);
signal(SIGFPE, bad_signal);
int main ( int argc, char **argv)
{
printVersionInfo();
- printf("WARNING: SDCDB is EXPERIMENTAL and NOT A FULLY FUNCTIONING TOOL.\n");
+ printf("WARNING: SDCDB is EXPERIMENTAL.\n");
simArgs[nsimArgs++] = "s51";
simArgs[nsimArgs++] = "-P";