/*-------------------------------------------------------------------------
sdcdb.c - main source file for sdcdb debugger
- Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999)
+ Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999)
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
-
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
+
In other words, you are welcome to use, share and improve this program.
You are forbidden to forbid anyone else to use, share and improve
- what you give them. Help stamp out software-hoarding!
+ what you give them. Help stamp out software-hoarding!
-------------------------------------------------------------------------*/
#include "sdcdb.h"
#include "simi.h"
#include "break.h"
#include "cmd.h"
+#include "newalloc.h"
char *currModName = NULL;
cdbrecs *recsRoot = NULL ;
context *currCtxt = NULL;
short fullname = 0;
char *ssdirl = SDCC_LIB_DIR ":" SDCC_LIB_DIR "/small" ;
-char *simArgs[8];
+char *simArgs[20];
int nsimArgs = 0;
+char model_str[20];
/* fake filename & lineno to make linker */
char *filename=NULL;
/* command table */
struct cmdtab
{
- char *cmd ; /* command the user will enter */
+ char *cmd ; /* command the user will enter */
int (*cmdfunc)(char *,context *); /* function to execute when command is entered */
- char *htxt ; /* short help text */
-
+ char *htxt ; /* short help text */
+
} cmdTab[] = {
/* NOTE:- the search is done from the top, so "break" should
precede the synonym "b" */
{ "help" , cmdHelp ,
"{h|?}elp\t\t this message\n"
- },
+ },
{ "?" , cmdHelp , NULL },
{ "h" , cmdHelp , NULL },
-
+
{ "info" , cmdInfo ,
- "info\n"
+ "info"
"\t {break}\t list all break points\n"
"\t {stack}\t information about call stack\n"
"\t {frame}\t current frame information\n"
{ "la" , cmdListAsm , NULL },
{ "list" , cmdListSrc ,
"{l}ist\t\t\t [LINE | FILE:LINE | FILE:FUNCTION | FUNCTION]\n"
- },
+ },
{ "l" , cmdListSrc , NULL },
{ "show" , cmdShow ,
- "show\n"
+ "show"
"\t {copying}\t copying & distribution terms\n"
"\t {warranty}\t warranty information\n"
},
- { "set" , cmdSetOption , NULL },
+ { "set" , cmdSetOption , NULL },
{ "step" , cmdStep ,
"{s}tep\t\t\t Step program until it reaches a different source line.\n"
},
{ "s" , cmdStep , NULL },
- { "next" , cmdNext ,
+ { "next" , cmdNext ,
"{n}ext\t\t\t Step program, proceeding through subroutine calls.\n"
},
{ "n" , cmdNext , NULL },
- { "run" , cmdRun ,
+ { "run" , cmdRun ,
"{r}un\t\t\t Start debugged program. \n"
},
{ "r" , cmdRun , NULL },
- { "ptype" , cmdPrintType ,
+ { "ptype" , cmdPrintType ,
"{pt}ype <variable>\t print type information of a variable\n"
},
{ "pt" , cmdPrintType , NULL },
- { "print" , cmdPrint ,
+ { "print" , cmdPrint ,
"{p}rint <variable>\t print value of given variable\n"
},
{ "p" , cmdPrint , NULL },
{ "file" , cmdFile ,
"file <filename>\t\t load symbolic information from <filename>\n"
- },
- { "frame" , cmdFrame ,
+ },
+ { "frame" , cmdFrame ,
"{fr}ame\t\t\t print information about the current Stack\n"
},
{ "finish" , cmdFinish ,
{ "fi" , cmdFinish , NULL },
{ "fr" , cmdFrame , NULL },
{ "f" , cmdFrame , NULL },
- { "!" , cmdSimulator ,
+ { "!" , cmdSimulator ,
"!<simulator command>\t send a command directly to the simulator\n"
},
- { "quit" , cmdQuit ,
+ { "quit" , cmdQuit ,
"{q}uit\t\t\t \"Watch me now. Iam going Down. My name is Bobby Brown\"\n"
},
{ "q" , cmdQuit , NULL }
char *gc_strdup(const char *s)
{
char *ret;
- ALLOC_ATOMIC(ret, strlen(s)+1);
+ ret = Safe_malloc(strlen(s)+1);
strcpy(ret, s);
return ret;
}
char *d;
if (!size)
- return NULL;
+ return NULL;
- ALLOC(d,size+1);
+ d = Safe_malloc(size+1);
memcpy(d,s,size);
d[size] = '\0';
void **vptr;
if (array)
- vptr = realloc(array,newSize*(sizeof(void **)));
+ vptr = Safe_realloc(array,newSize*(sizeof(void **)));
else
- vptr = calloc(1, sizeof(void **));
-
+ vptr = calloc(1, sizeof(void **));
+
if (!vptr) {
- fprintf(stderr,"sdcdb: out of memory \n");
- exit(1);
+ fprintf(stderr,"sdcdb: out of memory \n");
+ exit(1);
}
return vptr;
-
+
}
/*-----------------------------------------------------------------*/
cdbrecs *currl ;
char buffer[1024];
char *bp ;
-
+
if (!(bp = fgets(buffer,sizeof(buffer),file)))
- return 0;
-
- ALLOC(currl,sizeof(cdbrecs));
+ return 0;
+
+ currl = Safe_calloc(1,sizeof(cdbrecs));
recsRoot = currl ;
while (1) {
-
- /* make sure this is a cdb record */
- if (strchr("STLFM",*bp) && *(bp+1) == ':') {
- /* depending on the record type */
-
- switch (*bp) {
- case 'S':
- /* symbol record */
- currl->type = SYM_REC;
- break;
- case 'T':
- currl->type = STRUCT_REC;
- break;
- case 'L':
- currl->type = LNK_REC;
- break;
- case 'F':
- currl->type = FUNC_REC;
- break;
- case 'M':
- currl->type = MOD_REC ;
- }
-
- bp += 2;
- ALLOC(currl->line,strlen(bp));
- strncpy(currl->line,bp,strlen(bp)-1);
- currl->line[strlen(bp)-1] = '\0';
- }
-
- if (!(bp = fgets(buffer,sizeof(buffer),file)))
- break;
-
- if (feof(file))
- break;
-
- ALLOC(currl->next,sizeof(cdbrecs));
- currl = currl->next;
+
+ /* make sure this is a cdb record */
+ if (strchr("STLFM",*bp) && *(bp+1) == ':') {
+ /* depending on the record type */
+
+ switch (*bp) {
+ case 'S':
+ /* symbol record */
+ currl->type = SYM_REC;
+ break;
+ case 'T':
+ currl->type = STRUCT_REC;
+ break;
+ case 'L':
+ currl->type = LNK_REC;
+ break;
+ case 'F':
+ currl->type = FUNC_REC;
+ break;
+ case 'M':
+ currl->type = MOD_REC ;
+ }
+
+ bp += 2;
+ currl->line = Safe_malloc(strlen(bp));
+ strncpy(currl->line,bp,strlen(bp)-1);
+ currl->line[strlen(bp)-1] = '\0';
+ }
+
+ if (!(bp = fgets(buffer,sizeof(buffer),file)))
+ break;
+
+ if (feof(file))
+ break;
+
+ currl->next = Safe_calloc(1,sizeof(cdbrecs));
+ currl = currl->next;
}
return (recsRoot->line ? 1 : 0);
/* first try the current directory */
if ((rfile = fopen(fname,"r"))) {
- fclose(rfile);
- return strdup(fname) ;
+ fclose(rfile);
+ return strdup(fname) ;
}
if (!ssdirl)
- return strdup(fname);
+ return strdup(fname);
/* make a copy of the source directories */
- dirs = sdirs = strdup(ssdirl);
-
- /* assume that the separator is ':'
+ dirs = sdirs = strdup(ssdirl);
+
+ /* assume that the separator is ':'
and try for each directory in the search list */
dirs = strtok(dirs,":");
while (dirs) {
- if (dirs[strlen(dirs)] == '/')
- sprintf(buffer,"%s%s",dirs,fname);
- else
- sprintf(buffer,"%s/%s",dirs,fname);
- if ((rfile = fopen(buffer,"r")))
- break ;
- dirs = strtok(NULL,":");
+ if (dirs[strlen(dirs)] == '/')
+ sprintf(buffer,"%s%s",dirs,fname);
+ else
+ sprintf(buffer,"%s/%s",dirs,fname);
+ if ((rfile = fopen(buffer,"r")))
+ break ;
+ dirs = strtok(NULL,":");
}
-
+
free(sdirs);
if (rfile) {
- fclose(rfile);
- return strdup(buffer);
+ fclose(rfile);
+ return strdup(buffer);
} else
- return strdup(fname);
+ return strdup(fname);
}
/*-----------------------------------------------------------------*/
/* first try the current directory */
if ((rfile = fopen(fname,"r")))
- return rfile;
+ return rfile;
if (!ssdirl)
- return NULL;
+ return NULL;
/* make a copy of the source directories */
- dirs = sdirs = strdup(ssdirl);
-
- /* assume that the separator is ':'
+ dirs = sdirs = strdup(ssdirl);
+
+ /* assume that the separator is ':'
and try for each directory in the search list */
dirs = strtok(dirs,":");
while (dirs) {
- sprintf(buffer,"%s/%s",dirs,fname);
- if ((rfile = fopen(buffer,"r")))
- break ;
- dirs = strtok(NULL,":");
+ sprintf(buffer,"%s/%s",dirs,fname);
+ if ((rfile = fopen(buffer,"r")))
+ break ;
+ dirs = strtok(NULL,":");
}
-
+
free(sdirs);
return rfile ;
-
+
}
/*-----------------------------------------------------------------*/
char buffer[512];
char *bp;
srcLine **slines = NULL;
-
-
+
+
if (!(mfile = searchDirsFopen(name))) {
- fprintf(stderr,"sdcdb: cannot open module %s -- use '--directory=<source directory> option\n",name);
- return NULL;
+ fprintf(stderr,"sdcdb: cannot open module %s -- use '--directory=<source directory> option\n",name);
+ return NULL;
}
while ((bp = fgets(buffer,sizeof(buffer),mfile))) {
- (*nlines)++;
+ (*nlines)++;
- slines = (srcLine **)resize((void **)slines,*nlines);
+ slines = (srcLine **)resize((void **)slines,*nlines);
- ALLOC(slines[(*nlines)-1],sizeof(srcLine));
- slines[(*nlines)-1]->src = alloccpy(bp,strlen(bp));
+ slines[(*nlines)-1] = Safe_calloc(1,sizeof(srcLine));
+ slines[(*nlines)-1]->src = alloccpy(bp,strlen(bp));
}
fclose(mfile);
/* go thru the records & find out the module
records & load the modules specified */
for ( loop = recsRoot ; loop ; loop = loop->next ) {
-
- switch (loop->type) {
- /* for module records do */
- case MOD_REC:
- currMod = parseModule(loop->line,TRUE);
- currModName = currMod->name ;
-
- currMod->cfullname = searchDirsFname(currMod->c_name);
-
- /* load it into buffer */
- currMod->cLines = loadFile (currMod->c_name,
- &currMod->ncLines);
-
- /* do the same for the assembler file */
- currMod->afullname = searchDirsFname(currMod->asm_name);
- currMod->asmLines=loadFile (currMod->asm_name,
- &currMod->nasmLines);
- break;
-
- /* if this is a function record */
- case FUNC_REC:
- parseFunc(loop->line);
- break;
-
- /* if this is a structure record */
- case STRUCT_REC:
- parseStruct(loop->line);
- break;
-
- /* if symbol then parse the symbol */
- case SYM_REC:
- parseSymbol(loop->line,&rs);
- break;
-
- case LNK_REC:
- parseLnkRec(loop->line);
- break;
- }
+
+ switch (loop->type) {
+ /* for module records do */
+ case MOD_REC:
+ currMod = parseModule(loop->line,TRUE);
+ currModName = currMod->name ;
+
+ currMod->cfullname = searchDirsFname(currMod->c_name);
+
+ /* load it into buffer */
+ currMod->cLines = loadFile (currMod->c_name,
+ &currMod->ncLines);
+
+ /* do the same for the assembler file */
+ currMod->afullname = searchDirsFname(currMod->asm_name);
+ currMod->asmLines=loadFile (currMod->asm_name,
+ &currMod->nasmLines);
+ break;
+
+ /* if this is a function record */
+ case FUNC_REC:
+ parseFunc(loop->line);
+ break;
+
+ /* if this is a structure record */
+ case STRUCT_REC:
+ parseStruct(loop->line);
+ break;
+
+ /* if symbol then parse the symbol */
+ case SYM_REC:
+ parseSymbol(loop->line,&rs);
+ break;
+
+ case LNK_REC:
+ parseLnkRec(loop->line);
+ break;
+ }
}
}
/* for all functions do */
for ( func = setFirstItem(functions); func;
- func = setNextItem(functions)) {
- int j ;
- module *mod;
-
- sym = func->sym;
-
-#ifdef SDCDB_DEBUG
- printf("func '%s' has entry '%x' exit '%x'\n",
- func->sym->name,
- func->sym->addr,
- func->sym->eaddr);
-#endif
- if (!func->sym->addr && !func->sym->eaddr)
- continue ;
-
- /* for all source lines in the module find
- the ones with address >= start and <= end
- and put them in the point */
- mod = NULL ;
- if (! applyToSet(modules,moduleWithName,func->modName,&mod))
- continue ;
- func->mod = mod ;
- func->entryline= INT_MAX;
- func->exitline = 0;
- func->aentryline = INT_MAX ;
- func->aexitline = 0;
-
- /* do it for the C Lines first */
- for ( j = 0 ; j < mod->ncLines ; j++ ) {
- if (mod->cLines[j]->addr >= sym->addr &&
- mod->cLines[j]->addr <= sym->eaddr ) {
-
- exePoint *ep ;
-
- /* add it to the execution point */
- if (func->entryline > j)
- func->entryline = j;
-
- if (func->exitline < j)
- func->exitline = j;
-
- ALLOC(ep,sizeof(exePoint));
- ep->addr = mod->cLines[j]->addr ;
- ep->line = j;
- ep->block= mod->cLines[j]->block;
- ep->level= mod->cLines[j]->level;
- addSet(&func->cfpoints,ep);
- }
- }
-
- /* do the same for asm execution points */
- for ( j = 0 ; j < mod->nasmLines ; j++ ) {
- if (mod->asmLines[j]->addr >= sym->addr &&
- mod->asmLines[j]->addr <= sym->eaddr ) {
-
- exePoint *ep ;
- /* add it to the execution point */
- if (func->aentryline > j)
- func->aentryline = j;
-
- if (func->aexitline < j)
- func->aexitline = j;
-
- /* add it to the execution point */
- ALLOC(ep,sizeof(exePoint));
- ep->addr = mod->asmLines[j]->addr ;
- ep->line = j;
- addSet(&func->afpoints,ep);
- }
- }
+ func = setNextItem(functions)) {
+ int j ;
+ module *mod;
+
+ sym = func->sym;
+
+ Dprintf(D_sdcdb, ("func '%s' has entry '%x' exit '%x'\n",
+ func->sym->name,
+ func->sym->addr,
+ func->sym->eaddr));
+
+ if (!func->sym->addr && !func->sym->eaddr)
+ continue ;
+
+ /* for all source lines in the module find
+ the ones with address >= start and <= end
+ and put them in the point */
+ mod = NULL ;
+ if (! applyToSet(modules,moduleWithName,func->modName,&mod))
+ continue ;
+ func->mod = mod ;
+ func->entryline= INT_MAX;
+ func->exitline = 0;
+ func->aentryline = INT_MAX ;
+ func->aexitline = 0;
+
+ /* do it for the C Lines first */
+ for ( j = 0 ; j < mod->ncLines ; j++ ) {
+ if (mod->cLines[j]->addr >= sym->addr &&
+ mod->cLines[j]->addr <= sym->eaddr ) {
+
+ exePoint *ep ;
+
+ /* add it to the execution point */
+ if (func->entryline > j)
+ func->entryline = j;
+
+ if (func->exitline < j)
+ func->exitline = j;
+
+ ep = Safe_calloc(1,sizeof(exePoint));
+ ep->addr = mod->cLines[j]->addr ;
+ ep->line = j;
+ ep->block= mod->cLines[j]->block;
+ ep->level= mod->cLines[j]->level;
+ addSet(&func->cfpoints,ep);
+ }
+ }
+
+ /* do the same for asm execution points */
+ for ( j = 0 ; j < mod->nasmLines ; j++ ) {
+ if (mod->asmLines[j]->addr >= sym->addr &&
+ mod->asmLines[j]->addr <= sym->eaddr ) {
+
+ exePoint *ep ;
+ /* add it to the execution point */
+ if (func->aentryline > j)
+ func->aentryline = j;
+
+ if (func->aexitline < j)
+ func->aexitline = j;
+
+ /* add it to the execution point */
+ ep = Safe_calloc(1,sizeof(exePoint));
+ ep->addr = mod->asmLines[j]->addr ;
+ ep->line = j;
+ addSet(&func->afpoints,ep);
+ }
+ }
#ifdef SDCDB_DEBUG
- printf("function '%s' has the following C exePoints\n",
- func->sym->name);
- {
- exePoint *ep;
-
- for (ep = setFirstItem(func->cfpoints); ep;
- ep = setNextItem(func->cfpoints))
- fprintf (stdout,"{%x,%d} %s",ep->addr,ep->line,mod->cLines[ep->line]->src);
-
- fprintf(stdout," and the following ASM exePoints\n");
- for (ep = setFirstItem(func->afpoints); ep;
- ep = setNextItem(func->afpoints))
- fprintf (stdout,"{%x,%d} %s",ep->addr,ep->line,mod->asmLines[ep->line]->src);
-
- }
+ Dprintf(D_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, (" 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));
+ }
#endif
}
}
if (func->sym && func->sym->addr && func->sym->eaddr) {
- /* set the entry break point */
- setBreakPoint (func->sym->addr , CODE , FENTRY ,
- fentryCB ,func->mod->c_name , func->entryline);
+ /* set the entry break point */
+ setBreakPoint (func->sym->addr , CODE , FENTRY ,
+ fentryCB ,func->mod->c_name , func->entryline);
- /* set the exit break point */
- setBreakPoint (func->sym->eaddr , CODE , FEXIT ,
- fexitCB ,func->mod->c_name , func->exitline );
+ /* set the exit break point */
+ setBreakPoint (func->sym->eaddr , CODE , FEXIT ,
+ fexitCB ,func->mod->c_name , func->exitline );
}
return 0;
while (isspace(*s)) s++;
if (!*s) {
- fprintf(stdout,"No exec file now.\nNo symbol file now.\n");
- return 0;
+ fprintf(stdout,"No exec file now.\nNo symbol file now.\n");
+ return 0;
}
sprintf(buffer,"%s.cdb",s);
/* try creating the cdbfile */
if (!(cdbFile = searchDirsFopen(buffer))) {
- fprintf(stdout,"Cannot open file\"%s\"",buffer);
- return 0;
+ fprintf(stdout,"Cannot open file\"%s\"",buffer);
+ return 0;
}
/* allocate for context */
- ALLOC(currCtxt ,sizeof(context));
-
+ currCtxt = Safe_calloc(1,sizeof(context));
+
/* readin the debug information */
if (!readCdb (cdbFile)) {
- fprintf(stdout,"No symbolic information found in file %s.cdb\n",s);
- return 0;
- }
-
+ fprintf(stdout,"No symbolic information found in file %s.cdb\n",s);
+ return 0;
+ }
+
/* parse and load the modules required */
loadModules();
-
+
/* determine the execution points for this
module */
functionPoints();
/* start the simulator & setup connection to it */
openSimulator((char **)simArgs,nsimArgs);
fprintf(stdout,"%s",simResponse());
- /* now send the filename to be loaded to the simulator */
+ /* now send the filename to be loaded to the simulator */
sprintf(buffer,"%s.ihx",s);
bp=searchDirsFname(buffer);
simLoadFile(bp);
/* cmdHelp - help command */
/*-----------------------------------------------------------------*/
int cmdHelp (char *s, context *cctxt)
-{
+{
int i ;
-
+
for (i = 0 ; i < (sizeof(cmdTab)/sizeof(struct cmdtab)) ; i++) {
-
- /* command string matches */
- if (cmdTab[i].htxt)
- fprintf(stdout,"%s",cmdTab[i].htxt);
+
+ /* command string matches */
+ if (cmdTab[i].htxt)
+ fprintf(stdout,"%s",cmdTab[i].htxt);
}
-
+
return 0;
}
/* if nothing & previous command exists then
execute the previous command again */
if (*s == '\n' && pcmd)
- strcpy(s,pcmd);
+ strcpy(s,pcmd);
/* if previous command exists & is different
from the current command then copy it */
if (pcmd) {
- if (strcmp(pcmd,s)) {
- free(pcmd);
- pcmd = strdup(s);
- }
+ if (strcmp(pcmd,s)) {
+ free(pcmd);
+ pcmd = strdup(s);
+ }
} else
- pcmd = strdup(s);
+ pcmd = strdup(s);
/* lookup the command table and do the
task required */
strtok(s,"\n");
for (i = 0 ; i < (sizeof(cmdTab)/sizeof(struct cmdtab)) ; i++) {
-
- /* command string matches */
- if (strncmp(s,cmdTab[i].cmd,strlen(cmdTab[i].cmd)) == 0) {
- if (!cmdTab[i].cmdfunc)
- return 1;
- rv = (*cmdTab[i].cmdfunc)(s + strlen(cmdTab[i].cmd),currCtxt);
-
- /* if full name then give the file name & position */
- if (fullname && currCtxt && currCtxt->func) {
- if (srcMode == SRC_CMODE)
- fprintf(stdout,"\032\032%s:%d:1\n",
- currCtxt->func->mod->cfullname,
- currCtxt->cline+1);
- else
- fprintf(stdout,"\032\032%s:%d:1\n",
- currCtxt->func->mod->afullname,
- currCtxt->asmline+1);
- }
- goto ret;
- }
+
+ /* command string matches */
+ if (strncmp(s,cmdTab[i].cmd,strlen(cmdTab[i].cmd)) == 0) {
+ if (!cmdTab[i].cmdfunc)
+ return 1;
+ rv = (*cmdTab[i].cmdfunc)(s + strlen(cmdTab[i].cmd),currCtxt);
+
+ /* if full name then give the file name & position */
+ if (fullname && currCtxt && currCtxt->func) {
+ if (srcMode == SRC_CMODE)
+ fprintf(stdout,"\032\032%s:%d:1\n",
+ currCtxt->func->mod->cfullname,
+ currCtxt->cline+1);
+ else
+ fprintf(stdout,"\032\032%s:%d:1\n",
+ currCtxt->func->mod->afullname,
+ currCtxt->asmline+1);
+ }
+ goto ret;
+ }
}
-
+
fprintf(stdout,"Undefined command: \"%s\". Try \"help\".\n",s);
ret:
return rv;
{
while (1) {
- fprintf(stdout,"%s",prompt);
- fflush(stdout);
+ fprintf(stdout,"%s",prompt);
+ fflush(stdout);
- if (fgets(cmdbuff,sizeof(cmdbuff),stdin) == NULL)
- break;
+ if (fgets(cmdbuff,sizeof(cmdbuff),stdin) == NULL)
+ break;
+
+ if (interpretCmd(cmdbuff))
+ break;
- if (interpretCmd(cmdbuff))
- break;
-
}
}
static void printVersionInfo()
{
fprintf(stdout,
- "SDCDB is free software and you are welcome to distribute copies of it\n"
- "under certain conditions; type \"show copying\" to see the conditions.\n"
- "There is absolutely no warranty for SDCDB; type \"show warranty\" for details.\n"
- "SDCDB 0.8 . Copyright (C) 1999 Sandeep Dutta (sandeep.dutta@usa.net)\n"
- "Type ? for help\n");
+ "SDCDB is free software and you are welcome to distribute copies of it\n"
+ "under certain conditions; type \"show copying\" to see the conditions.\n"
+ "There is absolutely no warranty for SDCDB; type \"show warranty\" for details.\n"
+ "SDCDB 0.8 . Copyright (C) 1999 Sandeep Dutta (sandeep.dutta@usa.net)\n"
+ "Type ? for help\n");
}
char *filename = NULL;
char buffer[100];
for ( i = 1; i < argc ; i++) {
- fprintf(stdout,"%s\n",argv[i]);
-
- /* if this is an option */
- if (argv[i][0] == '-') {
-
- /* if directory then mark directory */
- if (strncmp(argv[i],"--directory=",12) == 0) {
- if (!ssdirl)
- ssdirl = &argv[i][12];
- else {
- char *p = malloc(strlen(ssdirl)+strlen(&argv[i][12])+2);
- strcat(strcat(strcpy(p,&argv[i][12]),":"),ssdirl);
- ssdirl = p;
- }
- continue;
- }
-
- if (strncmp(argv[i],"-fullname",9) == 0) {
- fullname = TRUE;
- continue;
- }
-
- if (strcmp(argv[i],"-cd") == 0) {
- i++;
- chdir(argv[i]);
- continue;
- }
-
- if (strncmp(argv[i],"-cd=",4) == 0) {
- chdir(argv[i][4]);
- continue;
- }
-
- /* the simulator arguments */
-
- /* cpu */
- if (strcmp(argv[i],"-t") == 0 ||
- strcmp(argv[i],"-cpu") == 0) {
-
- simArgs[nsimArgs++] = "-t";
- simArgs[nsimArgs++] = strdup(argv[++i]);
- continue ;
- }
-
- /* XTAL Frequency */
- if (strcmp(argv[i],"-X") == 0 ||
- strcmp(argv[i],"-frequency") == 0) {
- simArgs[nsimArgs++] = "-X";
- simArgs[nsimArgs++] = strdup(argv[++i]);
- continue ;
- }
-
- /* serial port */
- if (strcmp(argv[i],"-s") == 0) {
- simArgs[nsimArgs++] = "-s";
- simArgs[nsimArgs++] = strdup(argv[++i]);
- continue ;
- }
-
- if (strcmp(argv[i],"-S") == 0) {
- simArgs[nsimArgs++] = "-s";
- simArgs[nsimArgs++] = strdup(argv[++i]);
- continue ;
- }
-
- fprintf(stderr,"unknown option %s --- ignored\n",
- argv[i]);
- } else {
- /* must be file name */
- if (filename) {
- fprintf(stderr,"too many filenames .. parameter '%s' ignored\n",
- argv[i]);
- continue ;
- }
-
- filename = strtok(argv[i],".");
-
- }
+ fprintf(stdout,"%s\n",argv[i]);
+
+ /* if this is an option */
+ if (argv[i][0] == '-') {
+
+ /* if directory then mark directory */
+ if (strncmp(argv[i],"--directory=",12) == 0) {
+ if (!ssdirl)
+ ssdirl = &argv[i][12];
+ else {
+ char *p = Safe_malloc(strlen(ssdirl)+strlen(&argv[i][12])+2);
+ strcat(strcat(strcpy(p,&argv[i][12]),":"),ssdirl);
+ ssdirl = p;
+ }
+ continue;
+ }
+
+ if (strncmp(argv[i],"-fullname",9) == 0) {
+ fullname = TRUE;
+ continue;
+ }
+
+ if (strcmp(argv[i],"-cd") == 0) {
+ i++;
+ chdir(argv[i]);
+ continue;
+ }
+
+ if (strncmp(argv[i],"-cd=",4) == 0) {
+ chdir(argv[i][4]);
+ continue;
+ }
+
+ /* the simulator arguments */
+
+ /* cpu */
+ if (strcmp(argv[i],"-t") == 0 ||
+ strcmp(argv[i],"-cpu") == 0) {
+
+ simArgs[nsimArgs++] = "-t";
+ simArgs[nsimArgs++] = strdup(argv[++i]);
+ continue ;
+ }
+
+ /* XTAL Frequency */
+ if (strcmp(argv[i],"-X") == 0 ||
+ strcmp(argv[i],"-frequency") == 0) {
+ simArgs[nsimArgs++] = "-X";
+ simArgs[nsimArgs++] = strdup(argv[++i]);
+ continue ;
+ }
+
+ /* serial port */
+ if (strcmp(argv[i],"-s") == 0) {
+ simArgs[nsimArgs++] = "-s";
+ simArgs[nsimArgs++] = strdup(argv[++i]);
+ continue ;
+ }
+
+ if (strcmp(argv[i],"-S") == 0) {
+ simArgs[nsimArgs++] = "-s";
+ simArgs[nsimArgs++] = strdup(argv[++i]);
+ continue ;
+ }
+
+ /* model string */
+ if (strncmp(argv[i],"-m",2) == 0) {
+ strncpy(model_str, &argv[i][2], 15);
+ if (strcmp(model_str,"avr") == 0)
+ simArgs[0] = "savr";
+ else if (strcmp(model_str,"rrz80") == 0)
+ simArgs[0] = "rrz80";
+ else if (strcmp(model_str,"xa") == 0)
+ simArgs[0] = "sxa";
+ else if (strcmp(model_str,"z80") == 0)
+ simArgs[0] = "sz80";
+ continue ;
+ }
+
+ fprintf(stderr,"unknown option %s --- ignored\n",
+ argv[i]);
+ } else {
+ /* must be file name */
+ if (filename) {
+ fprintf(stderr,"too many filenames .. parameter '%s' ignored\n",
+ argv[i]);
+ continue ;
+ }
+
+ filename = strtok(argv[i],".");
+
+ }
}
-
+
if (filename)
- cmdFile(filename,NULL);
+ cmdFile(filename,NULL);
}
-
+
/*-----------------------------------------------------------------*/
/* main - */
/*-----------------------------------------------------------------*/
int main ( int argc, char **argv)
{
printVersionInfo();
+
+ simArgs[nsimArgs++] = "s51";
+ simArgs[nsimArgs++] = "-P";
+ simArgs[nsimArgs++] = "-r 9756";
/* parse command line */
+
parseCmdLine(argc,argv);
commandLoop();
-
+
return 0;
}