1 /*-------------------------------------------------------------------------
2 sdcdb.c - main source file for sdcdb debugger
3 Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999)
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 2, or (at your option) any
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 In other words, you are welcome to use, share and improve this program.
20 You are forbidden to forbid anyone else to use, share and improve
21 what you give them. Help stamp out software-hoarding!
22 -------------------------------------------------------------------------*/
35 char *currModName = NULL;
36 cdbrecs *recsRoot = NULL ;
37 set *modules = NULL; /* set of all modules */
38 set *functions = NULL ; /* set of functions */
39 set *symbols = NULL ; /* set of symbols */
40 set *sfrsymbols= NULL ; /* set of symbols of sfr or sbit */
42 structdef **structs = NULL ; /* all structures */
44 linkrec **linkrecs = NULL; /* all linkage editor records */
45 context *currCtxt = NULL;
48 short userinterrupt = 0;
50 char *ssdirl = DATADIR LIB_DIR_SUFFIX ":" DATADIR LIB_DIR_SUFFIX "/small" ;
55 /* fake filename & lineno to make linker */
63 char *cmd ; /* command the user will enter */
64 int (*cmdfunc)(char *,context *); /* function to execute when command is entered */
65 char *htxt ; /* short help text */
68 /* NOTE:- the search is done from the top, so "break" should
69 precede the synonym "b" */
71 { "break" , cmdSetUserBp ,
72 "{b}reak\t\t\t [LINE | FILE:LINE | FILE:FUNCTION | FUNCTION | *<address>]\n",
74 { "b" , cmdSetUserBp , NULL },
76 { "clear" , cmdClrUserBp ,
77 "{cl}ear\t\t\t [LINE | FILE:LINE | FILE:FUNCTION | FUNCTION]\n"
79 { "cl" , cmdClrUserBp , NULL },
81 { "continue" , cmdContinue ,
82 "{c}ontinue\t\t Continue program being debugged, after breakpoint.\n"
84 { "c" , cmdContinue , NULL },
86 { "disassemble",cmdDisasmF , "disassemble [startaddr [endaddress]]\tdisassemble asm commands\n" },
87 { "delete" , cmdDelUserBp ,
88 "{d}elete n\t\t clears break point number n\n"
90 { "display" , cmdDisplay ,
91 "display [/<fmt>] [<variable>]\t print value of given variable each time the program stops\n"
93 { "undisplay" , cmdUnDisplay ,
94 "undisplay [<variable>]\t dont display this variable or all\n"
97 "down\t\tSelect and print stack frame called by this one.\nAn argument says how many frames down to go.\n"
100 "up\t\tSelect and print stack frame that called this one.\nAn argument says how many frames up to go.\n"
102 { "d" , cmdDelUserBp , NULL },
105 "info <break stack frame registers all-registers>\n"
106 "\t list all break points, call-stack, frame or register information\n"
109 { "listasm" , cmdListAsm ,
110 "listasm {la}\t\t list assembler code for the current C line\n"
112 { "la" , cmdListAsm , NULL },
113 { "ls" , cmdListSymbols , "ls,lf,lm\t\t list symbols,functions,modules\n" },
114 { "lf" , cmdListFunctions, NULL },
115 { "lm" , cmdListModules , NULL },
116 { "list" , cmdListSrc ,
117 "{l}ist\t\t\t [LINE | FILE:LINE | FILE:FUNCTION | FUNCTION]\n"
119 { "l" , cmdListSrc , NULL },
122 " <copying warranty>\t copying & distribution terms, warranty\n"
124 { "set" , cmdSetOption , "set <srcmode>\t\t toggle between c/asm.\nset variable <var> = >value\t\tset variable to new value\n" },
125 { "stepi" , cmdStepi ,
126 "stepi\t\t\tStep one instruction exactly.\n"
129 "{s}tep\t\t\tStep program until it reaches a different source line.\n"
131 { "s" , cmdStep , NULL },
132 { "nexti" , cmdNexti ,
133 "nexti\t\t\tStep one instruction, but proceed through subroutine calls.\n"
136 "{n}ext\t\t\tStep program, proceeding through subroutine calls.\n"
138 { "n" , cmdNext , NULL },
140 "{r}un\t\t\tStart debugged program. \n"
142 { "r" , cmdRun , NULL },
143 { "ptype" , cmdPrintType ,
144 "{pt}ype <variable>\tprint type information of a variable\n"
146 { "pt" , cmdPrintType , NULL },
147 { "print" , cmdPrint ,
148 "{p}rint <variable>\t print value of given variable\n"
150 { "output" , cmdOutput ,
151 "output <variable>\t print value of given variable without $ and newline \n"
153 { "p" , cmdPrint , NULL },
155 "file <filename>\t\t load symbolic information from <filename>\n"
157 { "frame" , cmdFrame ,
158 "{fr}ame\t\t print information about the current Stack\n"
160 { "finish" , cmdFinish ,
161 "{fi}nish\t\t execute till return of current function\n"
163 { "fi" , cmdFinish , NULL },
164 { "where" , cmdWhere , "where\t\t print stack\n" },
165 { "fr" , cmdFrame , NULL },
166 { "f" , cmdFrame , NULL },
167 { "x /i" , cmdDisasm1 , "x\t\t disassemble one asm command\n" },
168 { "!" , cmdSimulator ,
169 "!<simulator command>\t send a command directly to the simulator\n"
171 { "." , cmdSimulator ,
172 ".{cmd}\t switch from simulator or debugger command mode\n"
175 "{h|?}elp\t [CMD_NAME | 0,1,2,3(help page)] (general help or specific help)\n"
177 { "?" , cmdHelp , NULL },
178 { "h" , cmdHelp , NULL },
181 "{q}uit\t\t\t \"Watch me now. Iam going Down. My name is Bobby Brown\"\n"
183 { "q" , cmdQuit , NULL }
186 /*-----------------------------------------------------------------*/
187 /* gc_strdup - make a string duplicate garbage collector aware */
188 /*-----------------------------------------------------------------*/
189 char *gc_strdup(const char *s)
192 ret = Safe_malloc(strlen(s)+1);
197 /*-----------------------------------------------------------------*/
198 /* alloccpy - allocate copy and return a new string */
199 /*-----------------------------------------------------------------*/
200 char *alloccpy ( char *s, int size)
207 d = Safe_malloc(size+1);
214 /*-----------------------------------------------------------------*/
215 /* resize - resizes array of type with new size */
216 /*-----------------------------------------------------------------*/
217 void **resize (void **array, int newSize)
222 vptr = Safe_realloc(array,newSize*(sizeof(void **)));
224 vptr = calloc(1, sizeof(void **));
227 fprintf(stderr,"sdcdb: out of memory \n");
235 /*-----------------------------------------------------------------*/
236 /* readCdb - reads the cdb files & puts the records into cdbLine */
238 /*-----------------------------------------------------------------*/
239 static int readCdb (FILE *file)
245 if (!(bp = fgets(buffer,sizeof(buffer),file)))
248 currl = Safe_calloc(1,sizeof(cdbrecs));
253 /* make sure this is a cdb record */
254 if (strchr("STLFM",*bp) && *(bp+1) == ':') {
255 /* depending on the record type */
260 currl->type = SYM_REC;
263 currl->type = STRUCT_REC;
266 currl->type = LNK_REC;
269 currl->type = FUNC_REC;
272 currl->type = MOD_REC ;
276 currl->line = Safe_malloc(strlen(bp));
277 strncpy(currl->line,bp,strlen(bp)-1);
278 currl->line[strlen(bp)-1] = '\0';
281 if (!(bp = fgets(buffer,sizeof(buffer),file)))
287 currl->next = Safe_calloc(1,sizeof(cdbrecs));
291 return (recsRoot->line ? 1 : 0);
294 /*-----------------------------------------------------------------*/
295 /* searchDirsFname - search directory list & return the filename */
296 /*-----------------------------------------------------------------*/
297 char *searchDirsFname (char *fname)
303 /* first try the current directory */
304 if ((rfile = fopen(fname,"r"))) {
306 return strdup(fname) ;
310 return strdup(fname);
312 /* make a copy of the source directories */
313 dirs = sdirs = strdup(ssdirl);
315 /* assume that the separator is ':'
316 and try for each directory in the search list */
317 dirs = strtok(dirs,":");
319 if (dirs[strlen(dirs)] == '/')
320 sprintf(buffer,"%s%s",dirs,fname);
322 sprintf(buffer,"%s/%s",dirs,fname);
323 if ((rfile = fopen(buffer,"r")))
325 dirs = strtok(NULL,":");
331 return strdup(buffer);
333 return strdup(fname);
336 /*-----------------------------------------------------------------*/
337 /* searchDirsFopen - go thru list of directories for filename given*/
338 /*-----------------------------------------------------------------*/
339 FILE *searchDirsFopen(char *fname)
345 /* first try the current directory */
346 if ((rfile = fopen(fname,"r")))
351 /* make a copy of the source directories */
352 dirs = sdirs = strdup(ssdirl);
354 /* assume that the separator is ':'
355 and try for each directory in the search list */
356 dirs = strtok(dirs,":");
358 sprintf(buffer,"%s/%s",dirs,fname);
359 if ((rfile = fopen(buffer,"r")))
361 dirs = strtok(NULL,":");
369 /*-----------------------------------------------------------------*/
370 /* loadFile - loads a file into module buffer */
371 /*-----------------------------------------------------------------*/
372 srcLine **loadFile (char *name, int *nlines)
377 srcLine **slines = NULL;
380 if (!(mfile = searchDirsFopen(name))) {
381 fprintf(stderr,"sdcdb: cannot open module %s -- use '--directory=<source directory> option\n",name);
385 while ((bp = fgets(buffer,sizeof(buffer),mfile))) {
388 slines = (srcLine **)resize((void **)slines,*nlines);
390 slines[(*nlines)-1] = Safe_calloc(1,sizeof(srcLine));
391 slines[(*nlines)-1]->src = alloccpy(bp,strlen(bp));
399 /*-----------------------------------------------------------------*/
400 /* loadModules - reads the source files into module structure */
401 /*-----------------------------------------------------------------*/
402 static void loadModules ()
408 /* go thru the records & find out the module
409 records & load the modules specified */
410 for ( loop = recsRoot ; loop ; loop = loop->next ) {
412 switch (loop->type) {
413 /* for module records do */
415 currMod = parseModule(loop->line,TRUE);
416 currModName = currMod->name ;
418 currMod->cfullname = searchDirsFname(currMod->c_name);
420 /* load it into buffer */
421 currMod->cLines = loadFile (currMod->c_name,
424 /* do the same for the assembler file */
425 currMod->afullname = searchDirsFname(currMod->asm_name);
426 currMod->asmLines=loadFile (currMod->asm_name,
427 &currMod->nasmLines);
430 /* if this is a function record */
432 parseFunc(loop->line);
435 /* if this is a structure record */
437 parseStruct(loop->line);
440 /* if symbol then parse the symbol */
442 parseSymbol(loop->line,&rs,2);
446 parseLnkRec(loop->line);
452 /*-----------------------------------------------------------------*/
453 /* generate extra sets of sfr and sbit symbols */
454 /*-----------------------------------------------------------------*/
455 static void specialFunctionRegs ()
458 for (sym = setFirstItem(symbols);
460 sym = setNextItem(symbols))
462 if ( sym->addrspace == 'I' ||
463 sym->addrspace == 'J')
465 addSet(&sfrsymbols,sym);
469 /*-----------------------------------------------------------------*/
470 /* functionPoints - determine the execution points within a func */
471 /*-----------------------------------------------------------------*/
472 static void functionPoints ()
478 /* for all functions do */
479 for ( func = setFirstItem(functions); func;
480 func = setNextItem(functions)) {
486 Dprintf(D_sdcdb, ("sdcdb: func '%s' has entry '0x%x' exit '0x%x'\n",
491 if (!func->sym->addr && !func->sym->eaddr)
494 /* for all source lines in the module find
495 the ones with address >= start and <= end
496 and put them in the point */
498 if (! applyToSet(modules,moduleWithName,func->modName,&mod))
501 func->entryline= INT_MAX;
503 func->aentryline = INT_MAX ;
506 /* do it for the C Lines first */
507 for ( j = 0 ; j < mod->ncLines ; j++ ) {
508 if (mod->cLines[j]->addr >= sym->addr &&
509 mod->cLines[j]->addr <= sym->eaddr ) {
512 /* add it to the execution point */
513 if (func->entryline > j)
516 if (func->exitline < j)
519 ep = Safe_calloc(1,sizeof(exePoint));
520 ep->addr = mod->cLines[j]->addr ;
522 ep->block= mod->cLines[j]->block;
523 ep->level= mod->cLines[j]->level;
524 addSet(&func->cfpoints,ep);
527 /* check double line execution points of module */
528 for (ep = setFirstItem(mod->cfpoints); ep;
529 ep = setNextItem(mod->cfpoints))
531 if (ep->addr >= sym->addr &&
532 ep->addr <= sym->eaddr )
534 addSet(&func->cfpoints,ep);
537 /* do the same for asm execution points */
538 for ( j = 0 ; j < mod->nasmLines ; j++ ) {
539 if (mod->asmLines[j]->addr >= sym->addr &&
540 mod->asmLines[j]->addr <= sym->eaddr ) {
543 /* add it to the execution point */
544 if (func->aentryline > j)
545 func->aentryline = j;
547 if (func->aexitline < j)
550 /* add it to the execution point */
551 ep = Safe_calloc(1,sizeof(exePoint));
552 ep->addr = mod->asmLines[j]->addr ;
554 addSet(&func->afpoints,ep);
559 if (!( D_sdcdb & sdcdbDebug))
562 Dprintf(D_sdcdb, ("sdcdb: function '%s' has the following C exePoints\n",
567 for (ep = setFirstItem(func->cfpoints); ep;
568 ep = setNextItem(func->cfpoints))
569 Dprintf(D_sdcdb, ("sdcdb: {0x%x,%d} %s",
570 ep->addr,ep->line+1,mod->cLines[ep->line]->src));
572 Dprintf(D_sdcdb, ("sdcdb: and the following ASM exePoints\n"));
573 for (ep = setFirstItem(func->afpoints); ep;
574 ep = setNextItem(func->afpoints))
575 Dprintf (D_sdcdb, ("sdcdb: {0x%x,%d} %s",
576 ep->addr,ep->line+1,mod->asmLines[ep->line]->src));
583 /*-----------------------------------------------------------------*/
584 /* setEntryExitBP - set the entry & exit Break Points for functions*/
585 /*-----------------------------------------------------------------*/
586 DEFSETFUNC(setEntryExitBP)
588 function *func = item;
590 if (func->sym && func->sym->addr && func->sym->eaddr) {
592 /* set the entry break point */
593 setBreakPoint (func->sym->addr , CODE , FENTRY ,
594 fentryCB ,func->mod->c_name , func->entryline);
596 /* set the exit break point */
597 setBreakPoint (func->sym->eaddr , CODE , FEXIT ,
598 fexitCB ,func->mod->c_name , func->exitline );
604 /*-----------------------------------------------------------------*/
605 /* cmdFile - load file into the debugger */
606 /*-----------------------------------------------------------------*/
607 int cmdFile (char *s,context *cctxt)
613 while (isspace(*s)) s++;
615 fprintf(stdout,"No exec file now.\nNo symbol file now.\n");
619 sprintf(buffer,"%s.cdb",s);
620 /* try creating the cdbfile */
621 if (!(cdbFile = searchDirsFopen(buffer))) {
622 fprintf(stdout,"Cannot open file\"%s\", no symbolic information loaded\n",buffer);
626 /* allocate for context */
627 currCtxt = Safe_calloc(1,sizeof(context));
630 /* readin the debug information */
631 if (!readCdb (cdbFile)) {
632 fprintf(stdout,"No symbolic information found in file %s.cdb\n",s);
637 /* parse and load the modules required */
640 /* determine the execution points for this
644 /* extract known special function registers */
645 specialFunctionRegs();
647 /* start the simulator & setup connection to it */
649 openSimulator((char **)simArgs,nsimArgs);
650 fprintf(stdout,"%s",simResponse());
651 /* now send the filename to be loaded to the simulator */
652 sprintf(buffer,"%s.ihx",s);
653 bp=searchDirsFname(buffer);
657 /*set the break points
658 required by the debugger . i.e. the function entry
659 and function exit break points */
660 applyToSet(functions,setEntryExitBP);
666 /*-----------------------------------------------------------------*/
667 /* cmdHelp - help command */
668 /*-----------------------------------------------------------------*/
669 int cmdHelp (char *s, context *cctxt)
678 endline = ((*s - '0') * 20) + 20;
680 startline = endline - 20;
684 for (i = 0 ; i < (sizeof(cmdTab)/sizeof(struct cmdtab)) ; i++)
686 if ((cmdTab[i].htxt) && !strcmp(cmdTab[i].cmd,s))
688 s = strrchr(cmdTab[i].htxt,'\t');
693 fprintf(stdout,"%s",s);
700 for (i = 0 ; i < (sizeof(cmdTab)/sizeof(struct cmdtab)) ; i++) {
702 /* command string matches */
704 if ((cmdTab[i].htxt) && (i >= startline))
705 fprintf(stdout,"%s",cmdTab[i].htxt);
713 #define MAX_CMD_LEN 512
714 static char cmdbuff[MAX_CMD_LEN];
715 static int sim_cmd_mode = 0;
717 /*-----------------------------------------------------------------
718 interpretCmd - interpret and do the command. Return 0 to continue,
719 return 1 to exit program.
720 |-----------------------------------------------------------------*/
721 int interpretCmd (char *s)
723 static char *pcmd = NULL;
727 /* if nothing & previous command exists then
728 execute the previous command again */
729 if (*s == '\n' && pcmd)
732 /* if previous command exists & is different
733 from the current command then copy it */
735 if (strcmp(pcmd,s)) {
742 /* lookup the command table and do the task required */
746 if (strcmp(s,".") == 0) {
750 else if (s[0] == '.') {
751 /* kill the preceeding '.' and pass on as SDCDB command */
758 cmdSimulator (s, currCtxt);
762 if (strcmp(s,".") ==0) {
768 for (i = 0 ; i < (sizeof(cmdTab)/sizeof(struct cmdtab)) ; i++) {
770 /* command string matches */
771 if (strncmp(s,cmdTab[i].cmd,strlen(cmdTab[i].cmd)) == 0) {
772 if (!cmdTab[i].cmdfunc)
775 rv = (*cmdTab[i].cmdfunc)(s + strlen(cmdTab[i].cmd),currCtxt);
777 /* if full name then give the file name & position */
778 if (fullname && showfull && currCtxt && currCtxt->func) {
780 if (srcMode == SRC_CMODE)
781 fprintf(stdout,"\032\032%s:%d:1:beg:0x%08x\n",
782 currCtxt->func->mod->cfullname,
783 currCtxt->cline+1,currCtxt->addr);
785 fprintf(stdout,"\032\032%s:%d:1:beg:0x%08x\n",
786 currCtxt->func->mod->afullname,
787 currCtxt->asmline,currCtxt->addr);
788 displayAll(currCtxt);
794 fprintf(stdout,"Undefined command: \"%s\". Try \"help\".\n",s);
799 /*-----------------------------------------------------------------*/
800 /* commandLoop - the main command loop */
801 /*-----------------------------------------------------------------*/
804 char *prompt = "(sdcdb) ";
805 char *sim_prompt = "(sim) ";
809 printf("%s",sim_prompt);
811 fprintf(stdout,"%s",prompt);
815 if (fgets(cmdbuff,sizeof(cmdbuff),stdin) == NULL)
819 /* make a way to go into "ucSim" mode */
820 if (cmdbuff[0] == '$') {
821 if (sim_cmd_mode) sim_cmd_mode = 0;
822 else sim_cmd_mode = 1;
827 if (interpretCmd(cmdbuff))
832 /*-----------------------------------------------------------------*/
833 /* printVersionInfo - print the version information */
834 /*-----------------------------------------------------------------*/
835 static void printVersionInfo()
838 "SDCDB is free software and you are welcome to distribute copies of it\n"
839 "under certain conditions; type \"show copying\" to see the conditions.\n"
840 "There is absolutely no warranty for SDCDB; type \"show warranty\" for details.\n"
841 "SDCDB 0.8 . Copyright (C) 1999 Sandeep Dutta (sandeep.dutta@usa.net)\n"
842 "Type ? for help\n");
846 /*-----------------------------------------------------------------*/
847 /* parseCmdLine - parse the commandline arguments */
848 /*-----------------------------------------------------------------*/
849 static void parseCmdLine (int argc, char **argv)
852 char *filename = NULL;
853 int passon_args_flag = 0; /* if true, pass on args to simulator */
855 Dprintf(D_sdcdb, ("sdcdb: parseCmdLine\n"));
858 for ( i = 1; i < argc ; i++) {
859 //fprintf(stdout,"%s\n",argv[i]);
861 if (passon_args_flag) { /* if true, pass on args to simulator */
862 simArgs[nsimArgs++] = strdup(argv[i]);
866 /* if this is an option */
867 if (argv[i][0] == '-') {
869 /* if directory then mark directory */
870 if (strncmp(argv[i],"--directory=",12) == 0) {
872 ssdirl = &argv[i][12];
874 char *p = Safe_malloc(strlen(ssdirl)+strlen(&argv[i][12])+2);
875 strcat(strcat(strcpy(p,&argv[i][12]),":"),ssdirl);
881 if (strncmp(argv[i],"-fullname",9) == 0) {
886 if (strcmp(argv[i],"-cd") == 0) {
892 if (strncmp(argv[i],"-cd=",4) == 0) {
898 if (strncmp(argv[i],"-d=",3) == 0) {
899 sdcdbDebug = strtol(&argv[i][3],0,0);
903 if (strncmp(argv[i],"-contsim",8) == 0) {
909 if (strncmp(argv[i],"-m",2) == 0) {
910 strncpy(model_str, &argv[i][2], 15);
911 if (strcmp(model_str,"avr") == 0)
913 else if (strcmp(model_str,"xa") == 0)
915 else if (strcmp(model_str,"z80") == 0)
920 /* -z all remaining options are for simulator */
921 if (strcmp(argv[i],"-z") == 0) {
922 passon_args_flag = 1;
926 /* the simulator arguments */
929 if (strcmp(argv[i],"-t") == 0 ||
930 strcmp(argv[i],"-cpu") == 0) {
932 simArgs[nsimArgs++] = "-t";
933 simArgs[nsimArgs++] = strdup(argv[++i]);
938 if (strcmp(argv[i],"-X") == 0 ||
939 strcmp(argv[i],"-frequency") == 0) {
940 simArgs[nsimArgs++] = "-X";
941 simArgs[nsimArgs++] = strdup(argv[++i]);
946 if ( (strcmp(argv[i],"-S") == 0) ||
947 (strcmp(argv[i],"-s") == 0)) {
948 simArgs[nsimArgs++] = strdup(argv[i]);
949 simArgs[nsimArgs++] = strdup(argv[++i]);
953 fprintf(stderr,"unknown option %s --- ignored\n",
957 /* must be file name */
959 fprintf(stderr,"too many filenames .. parameter '%s' ignored\n",
964 filename = strtok(argv[i],".");
970 cmdFile(filename,NULL);
973 /*-----------------------------------------------------------------*/
974 /* setsignals - catch some signals */
975 /*-----------------------------------------------------------------*/
988 /* may be interrupt from user: stop debugger and also simulator */
993 /* the only child can be the simulator */
994 static void sigchld(int sig)
996 /* the only child can be the simulator */
998 retpid = wait ( &status );
999 /* if ( retpid == simPid ) */
1006 signal(SIGHUP , bad_signal);
1007 signal(SIGINT , sigintr );
1008 signal(SIGTERM, bad_signal);
1009 signal(SIGCHLD, sigchld );
1011 signal(SIGABRT, bad_signal);
1012 signal(SIGALRM, bad_signal);
1013 signal(SIGFPE, bad_signal);
1014 signal(SIGILL, bad_signal);
1015 signal(SIGPIPE, bad_signal);
1016 signal(SIGQUIT, bad_signal);
1017 signal(SIGSEGV, bad_signal);
1020 /*-----------------------------------------------------------------*/
1022 /*-----------------------------------------------------------------*/
1024 int main ( int argc, char **argv)
1027 printf("WARNING: SDCDB is EXPERIMENTAL.\n");
1029 simArgs[nsimArgs++] = "s51";
1030 simArgs[nsimArgs++] = "-P";
1031 simArgs[nsimArgs++] = "-r 9756";
1032 /* parse command line */
1035 parseCmdLine(argc,argv);