/*-------------------------------------------------------------------------
cmd.c - source file for debugger command execution
-
- 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
no better context is available */
static module *list_mod = NULL;
-EXTERN_STACK_DCL(callStack,function *,1024);
-
#if defined(__APPLE__) && defined(__MACH__)
static char *copying=
{" GNU GENERAL PUBLIC LICENSE Version 2"};
#endif
static void printTypeInfo(link *);
-static void printValAggregates (symbol *,link *,char,unsigned int,int);
+static void printValAggregates (symbol *,link *,char,unsigned int,int,int);
static int printOrSetSymValue (symbol *sym, context *cctxt,
int flg, int dnum, int fmt,
char *rs, char *val, char cmp);
int srcMode = SRC_CMODE ;
-static set *dispsymbols = NULL ; /* set of displayable symbols */
+set *dispsymbols = NULL ; /* set of displayable symbols */
static int currentFrame = 0; /* actual displayed frame */
/*-----------------------------------------------------------------*/
/* funcWithName - returns function with name */
V_ARG(function **,funcp);
if (*funcp)
- return 0;
+ return 0;
if (strcmp(func->sym->name,name) == 0) {
- *funcp = func;
- return 1;
+ *funcp = func;
+ return 1;
}
return 0;
next_line = line;
for ( ; next_line < (srcMode == SRC_CMODE ? mod->ncLines : mod->nasmLines ) ;
- next_line++ ) {
- if (srcMode == SRC_CMODE) {
- if (mod->cLines[next_line]->addr != INT_MAX) {
- setBreakPoint (mod->cLines[next_line]->addr, CODE, bpType,
- userBpCB, mod->c_name, next_line);
- return;
-// break;
- }
- }
- else {
- if (mod->asmLines[next_line]->addr != INT_MAX) {
- setBreakPoint (mod->asmLines[next_line]->addr, CODE, bpType,
- userBpCB, mod->asm_name, next_line);
- return;
-// break;
- }
- }
+ next_line++ ) {
+ if (srcMode == SRC_CMODE) {
+ if (mod->cLines[next_line]->addr != INT_MAX) {
+ setBreakPoint (mod->cLines[next_line]->addr, CODE, bpType,
+ userBpCB, mod->c_name, next_line);
+ return;
+// break;
+ }
+ }
+ else {
+ if (mod->asmLines[next_line]->addr != INT_MAX) {
+ setBreakPoint (mod->asmLines[next_line]->addr, CODE, bpType,
+ userBpCB, mod->asm_name, next_line);
+ return;
+// break;
+ }
+ }
}
- fprintf(stderr,"No line %d or after in file \"%s\"..\n",
- line,mod->c_name);
+ fprintf(stderr,"No line %d or after in file \"%s\"..\n",
+ line,mod->c_name);
return;
}
/* look for the first executable line after the line
specified & get the break point there */
if (srcMode == SRC_CMODE && line > mod->ncLines) {
- fprintf(stderr,"No line %d in file \"%s\".\n",
- line,mod->c_name);
- return ;
+ fprintf(stderr,"No line %d in file \"%s\".\n",
+ line,mod->c_name);
+ return ;
}
if (srcMode == SRC_AMODE && line > mod->ncLines) {
- fprintf(stderr,"No line %d in file \"%s\".\n",
- line,mod->c_name);
- return ;
+ fprintf(stderr,"No line %d in file \"%s\".\n",
+ line,mod->c_name);
+ return ;
}
for ( ; line < (srcMode == SRC_CMODE ? mod->ncLines : mod->nasmLines ) ;
- line++ ) {
- if (srcMode == SRC_CMODE)
- if (mod->cLines[line]->addr) {
- clearUSERbp (mod->cLines[line]->addr);
- break;
- }
- else
- if (mod->asmLines[line]->addr) {
- clearUSERbp (mod->asmLines[line]->addr);
- break;
- }
+ line++ ) {
+ if (srcMode == SRC_CMODE)
+ if (mod->cLines[line]->addr) {
+ clearUSERbp (mod->cLines[line]->addr);
+ break;
+ }
+ else
+ if (mod->asmLines[line]->addr) {
+ clearUSERbp (mod->asmLines[line]->addr);
+ break;
+ }
}
return;
return 0;
if (strcmp(func->sym->name,fname) == 0 &&
- strcmp(func->mod->c_name,mname) == 0) {
- *funcp = func;
- return 1;
+ strcmp(func->mod->c_name,mname) == 0) {
+ *funcp = func;
+ return 1;
}
return 0;
V_ARG(function **,funcp);
if (*funcp)
- return 0;
+ return 0;
/* in the address range */
if (func->sym->addr <= addr &&
- func->sym->eaddr >= addr) {
+ func->sym->eaddr >= addr) {
- *funcp = func;
- return 1;
+ *funcp = func;
+ return 1;
}
return 0;
if (func->sym && func->sym->addr ) {
- /* set the entry break point */
- setBreakPoint (func->sym->addr , CODE , STEP ,
- stepBpCB ,func->mod->c_name , func->entryline);
+ /* set the entry break point */
+ setBreakPoint (func->sym->addr , CODE , STEP ,
+ stepBpCB ,func->mod->c_name , func->entryline);
- return 1;
+ return 1;
}
return 0;
V_ARG(char *,mname);
setBreakPoint (ep->addr, CODE, bptype,
- stepBpCB, mname, ep->line);
+ stepBpCB, mname, ep->line);
return 1;
}
V_ARG(char *,mname);
setBreakPoint (ep->addr, CODE, bptype,
- nextBpCB, mname, ep->line);
+ nextBpCB, mname, ep->line);
return 1;
}
/* address must be an exact match */
if (ep->addr == addr) {
- *line = ep->line;
- if (block)
- *block = ep->block ;
- if (level)
- *level = ep->level ;
- return 1;
+ *line = ep->line;
+ if (block)
+ *block = ep->block ;
+ if (level)
+ *level = ep->level ;
+ return 1;
}
return 0;
/* the line in which the address is */
if (ep->addr <= addr) {
- *line = ep->line;
- if (block)
- *block = ep->block ;
- if (level)
- *level = ep->level ;
- return 1;
+ *line = ep->line;
+ if (block)
+ *block = ep->block ;
+ if (level)
+ *level = ep->level ;
+ return 1;
}
return 0;
/*-----------------------------------------------------------------*/
/* discoverContext - find out the current context of the bp */
/*-----------------------------------------------------------------*/
-context *discoverContext (unsigned addr, function *func)
+context *discoverContext (unsigned addr, function *func, context *ctxt)
{
module *mod = NULL;
int line = 0;
fprintf(stderr, "addr 0x%x in no module/function (runtime env?)\n",addr);
return NULL;
}
- currCtxt->func = func;
- currCtxt->addr = addr;
- currCtxt->modName = mod->name;
- currCtxt->cline = func->exitline;
+ ctxt->func = func;
+ ctxt->addr = addr;
+ ctxt->modName = mod->name;
+ ctxt->cline = func->exitline;
}
else
{
- currCtxt->func = func;
- currCtxt->addr = func->laddr = addr;
- currCtxt->modName = func->modName;
+ ctxt->func = func;
+ ctxt->addr = func->laddr = addr;
+ ctxt->modName = func->modName;
/* find the c line number */
if(applyToSet(func->cfpoints,lineAtAddr,addr,
- &line,&currCtxt->block,&currCtxt->level))
- currCtxt->cline = func->lline = line;
+ &line,&ctxt->block,&ctxt->level))
+ ctxt->cline = func->lline = line;
else if(applyToSet(func->cfpoints,lineNearAddr,addr,
- &line,&currCtxt->block,&currCtxt->level))
- currCtxt->cline = func->lline = line;
+ &line,&ctxt->block,&ctxt->level))
+ ctxt->cline = func->lline = line;
else
- currCtxt->cline = -1;
+ ctxt->cline = -1;
}
/* find the asm line number */
line = 0;
if (applyToSet(func->afpoints,lineAtAddr,addr,
- &line,NULL,NULL))
- currCtxt->asmline = line;
+ &line,NULL,NULL))
+ ctxt->asmline = line;
else
- currCtxt->asmline = -1;
+ ctxt->asmline = -1;
+
+ return ctxt;
+}
+
+#define IS_BRANCH 1
+#define IS_CALL 2
+#define IS_RET 4
+#define IS_ADDR11 8
+#define IS_ADDR16 16
+#define IS_COND 32
+
+struct instruction {
+ unsigned char flags;
+ unsigned char len;
+};
+
+static struct instruction instructions[] = {
+ [0x28] = { .flags = 0, .len = 1 }, /* ADD A,Rn */
+ [0x29] = { .flags = 0, .len = 1 }, /* ADD A,Rn */
+ [0x2A] = { .flags = 0, .len = 1 }, /* ADD A,Rn */
+ [0x2B] = { .flags = 0, .len = 1 }, /* ADD A,Rn */
+ [0x2C] = { .flags = 0, .len = 1 }, /* ADD A,Rn */
+ [0x2D] = { .flags = 0, .len = 1 }, /* ADD A,Rn */
+ [0x2E] = { .flags = 0, .len = 1 }, /* ADD A,Rn */
+ [0x2F] = { .flags = 0, .len = 1 }, /* ADD A,Rn */
+ [0x25] = { .flags = 0, .len = 2 }, /* ADD A,direct */
+ [0x26] = { .flags = 0, .len = 1 }, /* ADD A,@Ri */
+ [0x27] = { .flags = 0, .len = 1 }, /* ADD A,@Ri */
+ [0x24] = { .flags = 0, .len = 2 }, /* ADD A,#data */
+
+ [0x38] = { .flags = 0, .len = 1 }, /* ADDC A,Rn */
+ [0x39] = { .flags = 0, .len = 1 }, /* ADDC A,Rn */
+ [0x3A] = { .flags = 0, .len = 1 }, /* ADDC A,Rn */
+ [0x3B] = { .flags = 0, .len = 1 }, /* ADDC A,Rn */
+ [0x3C] = { .flags = 0, .len = 1 }, /* ADDC A,Rn */
+ [0x3D] = { .flags = 0, .len = 1 }, /* ADDC A,Rn */
+ [0x3E] = { .flags = 0, .len = 1 }, /* ADDC A,Rn */
+ [0x3F] = { .flags = 0, .len = 1 }, /* ADDC A,Rn */
+ [0x35] = { .flags = 0, .len = 2 }, /* ADDC A,direct */
+ [0x36] = { .flags = 0, .len = 1 }, /* ADDC A,@Ri */
+ [0x37] = { .flags = 0, .len = 1 }, /* ADDC A,@Ri */
+ [0x34] = { .flags = 0, .len = 2 }, /* ADDC A,#data */
+
+ [0x98] = { .flags = 0, .len = 1 }, /* SUBB A,Rn */
+ [0x99] = { .flags = 0, .len = 1 }, /* SUBB A,Rn */
+ [0x9A] = { .flags = 0, .len = 1 }, /* SUBB A,Rn */
+ [0x9B] = { .flags = 0, .len = 1 }, /* SUBB A,Rn */
+ [0x9C] = { .flags = 0, .len = 1 }, /* SUBB A,Rn */
+ [0x9D] = { .flags = 0, .len = 1 }, /* SUBB A,Rn */
+ [0x9E] = { .flags = 0, .len = 1 }, /* SUBB A,Rn */
+ [0x9F] = { .flags = 0, .len = 1 }, /* SUBB A,Rn */
+ [0x95] = { .flags = 0, .len = 2 }, /* SUBB A,direct */
+ [0x96] = { .flags = 0, .len = 1 }, /* SUBB A,@Ri */
+ [0x97] = { .flags = 0, .len = 1 }, /* SUBB A,@Ri */
+ [0x94] = { .flags = 0, .len = 2 }, /* SUBB A,#data */
+
+ [0x08] = { .flags = 0, .len = 1 }, /* INC Rn */
+ [0x09] = { .flags = 0, .len = 1 }, /* INC Rn */
+ [0x0A] = { .flags = 0, .len = 1 }, /* INC Rn */
+ [0x0B] = { .flags = 0, .len = 1 }, /* INC Rn */
+ [0x0C] = { .flags = 0, .len = 1 }, /* INC Rn */
+ [0x0D] = { .flags = 0, .len = 1 }, /* INC Rn */
+ [0x0E] = { .flags = 0, .len = 1 }, /* INC Rn */
+ [0x0F] = { .flags = 0, .len = 1 }, /* INC Rn */
+ [0x05] = { .flags = 0, .len = 2 }, /* INC direct */
+ [0x06] = { .flags = 0, .len = 1 }, /* INC @Ri */
+ [0x07] = { .flags = 0, .len = 1 }, /* INC @Ri */
+ [0x04] = { .flags = 0, .len = 1 }, /* INC A */
+
+ [0xA3] = { .flags = 0, .len = 1 }, /* INC DPTR */
+
+ [0x18] = { .flags = 0, .len = 1 }, /* DEC Rn */
+ [0x19] = { .flags = 0, .len = 1 }, /* DEC Rn */
+ [0x1A] = { .flags = 0, .len = 1 }, /* DEC Rn */
+ [0x1B] = { .flags = 0, .len = 1 }, /* DEC Rn */
+ [0x1C] = { .flags = 0, .len = 1 }, /* DEC Rn */
+ [0x1D] = { .flags = 0, .len = 1 }, /* DEC Rn */
+ [0x1E] = { .flags = 0, .len = 1 }, /* DEC Rn */
+ [0x1F] = { .flags = 0, .len = 1 }, /* DEC Rn */
+ [0x15] = { .flags = 0, .len = 2 }, /* DEC direct */
+ [0x16] = { .flags = 0, .len = 1 }, /* DEC @Ri */
+ [0x17] = { .flags = 0, .len = 1 }, /* DEC @Ri */
+ [0x14] = { .flags = 0, .len = 1 }, /* DEC A */
+
+ [0xA4] = { .flags = 0, .len = 1 }, /* MUL AB */
+ [0x84] = { .flags = 0, .len = 1 }, /* DIV AB */
+
+ [0xD4] = { .flags = 0, .len = 1 }, /* DA A */
+
+ [0x58] = { .flags = 0, .len = 1 }, /* ANL A,Rn */
+ [0x59] = { .flags = 0, .len = 1 }, /* ANL A,Rn */
+ [0x5A] = { .flags = 0, .len = 1 }, /* ANL A,Rn */
+ [0x5B] = { .flags = 0, .len = 1 }, /* ANL A,Rn */
+ [0x5C] = { .flags = 0, .len = 1 }, /* ANL A,Rn */
+ [0x5D] = { .flags = 0, .len = 1 }, /* ANL A,Rn */
+ [0x5E] = { .flags = 0, .len = 1 }, /* ANL A,Rn */
+ [0x5F] = { .flags = 0, .len = 1 }, /* ANL A,Rn */
+ [0x55] = { .flags = 0, .len = 2 }, /* ANL A,direct */
+ [0x56] = { .flags = 0, .len = 1 }, /* ANL A,@Ri */
+ [0x57] = { .flags = 0, .len = 1 }, /* ANL A,@Ri */
+ [0x54] = { .flags = 0, .len = 2 }, /* ANL A,#data */
+ [0x52] = { .flags = 0, .len = 2 }, /* ANL direct,A */
+ [0x53] = { .flags = 0, .len = 3 }, /* ANL direct,#data */
+
+ [0x48] = { .flags = 0, .len = 1 }, /* ORL A,Rn */
+ [0x49] = { .flags = 0, .len = 1 }, /* ORL A,Rn */
+ [0x4A] = { .flags = 0, .len = 1 }, /* ORL A,Rn */
+ [0x4B] = { .flags = 0, .len = 1 }, /* ORL A,Rn */
+ [0x4C] = { .flags = 0, .len = 1 }, /* ORL A,Rn */
+ [0x4D] = { .flags = 0, .len = 1 }, /* ORL A,Rn */
+ [0x4E] = { .flags = 0, .len = 1 }, /* ORL A,Rn */
+ [0x4F] = { .flags = 0, .len = 1 }, /* ORL A,Rn */
+ [0x45] = { .flags = 0, .len = 2 }, /* ORL A,direct */
+ [0x46] = { .flags = 0, .len = 1 }, /* ORL A,@Ri */
+ [0x47] = { .flags = 0, .len = 1 }, /* ORL A,@Ri */
+ [0x44] = { .flags = 0, .len = 2 }, /* ORL A,#data */
+ [0x42] = { .flags = 0, .len = 2 }, /* ORL direct,A */
+ [0x43] = { .flags = 0, .len = 3 }, /* ORL direct,#data */
+
+ [0x68] = { .flags = 0, .len = 1 }, /* XRL A,Rn */
+ [0x69] = { .flags = 0, .len = 1 }, /* XRL A,Rn */
+ [0x6A] = { .flags = 0, .len = 1 }, /* XRL A,Rn */
+ [0x6B] = { .flags = 0, .len = 1 }, /* XRL A,Rn */
+ [0x6C] = { .flags = 0, .len = 1 }, /* XRL A,Rn */
+ [0x6D] = { .flags = 0, .len = 1 }, /* XRL A,Rn */
+ [0x6E] = { .flags = 0, .len = 1 }, /* XRL A,Rn */
+ [0x6F] = { .flags = 0, .len = 1 }, /* XRL A,Rn */
+ [0x65] = { .flags = 0, .len = 2 }, /* XRL A,direct */
+ [0x66] = { .flags = 0, .len = 1 }, /* XRL A,@Ri */
+ [0x67] = { .flags = 0, .len = 1 }, /* XRL A,@Ri */
+ [0x64] = { .flags = 0, .len = 2 }, /* XRL A,#data */
+ [0x62] = { .flags = 0, .len = 2 }, /* XRL direct,A */
+ [0x63] = { .flags = 0, .len = 3 }, /* XRL direct,#data */
+
+ [0xE4] = { .flags = 0, .len = 1 }, /* CLR A */
+ [0xF4] = { .flags = 0, .len = 1 }, /* CPL A */
+
+ [0x23] = { .flags = 0, .len = 1 }, /* RL A */
+ [0x33] = { .flags = 0, .len = 1 }, /* RLC A */
+ [0x03] = { .flags = 0, .len = 1 }, /* RR A */
+ [0x13] = { .flags = 0, .len = 1 }, /* RRC A */
+
+ [0xC4] = { .flags = 0, .len = 1 }, /* SWAP A */
+
+ [0xE8] = { .flags = 0, .len = 1 }, /* MOV A,Rn */
+ [0xE9] = { .flags = 0, .len = 1 }, /* MOV A,Rn */
+ [0xEA] = { .flags = 0, .len = 1 }, /* MOV A,Rn */
+ [0xEB] = { .flags = 0, .len = 1 }, /* MOV A,Rn */
+ [0xEC] = { .flags = 0, .len = 1 }, /* MOV A,Rn */
+ [0xED] = { .flags = 0, .len = 1 }, /* MOV A,Rn */
+ [0xEE] = { .flags = 0, .len = 1 }, /* MOV A,Rn */
+ [0xEF] = { .flags = 0, .len = 1 }, /* MOV A,Rn */
+ [0xE5] = { .flags = 0, .len = 2 }, /* MOV A,direct */
+ [0xE6] = { .flags = 0, .len = 1 }, /* MOV A,@Ri */
+ [0xE7] = { .flags = 0, .len = 1 }, /* MOV A,@Ri */
+ [0x74] = { .flags = 0, .len = 2 }, /* MOV A,#data */
+
+ [0xF8] = { .flags = 0, .len = 1 }, /* MOV Rn,A */
+ [0xF9] = { .flags = 0, .len = 1 }, /* MOV Rn,A */
+ [0xFA] = { .flags = 0, .len = 1 }, /* MOV Rn,A */
+ [0xFB] = { .flags = 0, .len = 1 }, /* MOV Rn,A */
+ [0xFC] = { .flags = 0, .len = 1 }, /* MOV Rn,A */
+ [0xFD] = { .flags = 0, .len = 1 }, /* MOV Rn,A */
+ [0xFE] = { .flags = 0, .len = 1 }, /* MOV Rn,A */
+ [0xFF] = { .flags = 0, .len = 1 }, /* MOV Rn,A */
+
+ [0xA8] = { .flags = 0, .len = 2 }, /* MOV Rn,direct */
+ [0xA9] = { .flags = 0, .len = 2 }, /* MOV Rn,direct */
+ [0xAA] = { .flags = 0, .len = 2 }, /* MOV Rn,direct */
+ [0xAB] = { .flags = 0, .len = 2 }, /* MOV Rn,direct */
+ [0xAC] = { .flags = 0, .len = 2 }, /* MOV Rn,direct */
+ [0xAD] = { .flags = 0, .len = 2 }, /* MOV Rn,direct */
+ [0xAE] = { .flags = 0, .len = 2 }, /* MOV Rn,direct */
+ [0xAF] = { .flags = 0, .len = 2 }, /* MOV Rn,direct */
+
+ [0x78] = { .flags = 0, .len = 2 }, /* MOV Rn,#data */
+ [0x79] = { .flags = 0, .len = 2 }, /* MOV Rn,#data */
+ [0x7A] = { .flags = 0, .len = 2 }, /* MOV Rn,#data */
+ [0x7B] = { .flags = 0, .len = 2 }, /* MOV Rn,#data */
+ [0x7C] = { .flags = 0, .len = 2 }, /* MOV Rn,#data */
+ [0x7D] = { .flags = 0, .len = 2 }, /* MOV Rn,#data */
+ [0x7E] = { .flags = 0, .len = 2 }, /* MOV Rn,#data */
+ [0x7F] = { .flags = 0, .len = 2 }, /* MOV Rn,#data */
+
+ [0xF5] = { .flags = 0, .len = 2 }, /* MOV direct,A */
+ [0x88] = { .flags = 0, .len = 2 }, /* MOV direct,Rn */
+ [0x89] = { .flags = 0, .len = 2 }, /* MOV direct,Rn */
+ [0x8A] = { .flags = 0, .len = 2 }, /* MOV direct,Rn */
+ [0x8B] = { .flags = 0, .len = 2 }, /* MOV direct,Rn */
+ [0x8C] = { .flags = 0, .len = 2 }, /* MOV direct,Rn */
+ [0x8D] = { .flags = 0, .len = 2 }, /* MOV direct,Rn */
+ [0x8E] = { .flags = 0, .len = 2 }, /* MOV direct,Rn */
+ [0x8F] = { .flags = 0, .len = 2 }, /* MOV direct,Rn */
+ [0x85] = { .flags = 0, .len = 3 }, /* MOV direct,direct */
+ [0x86] = { .flags = 0, .len = 2 }, /* MOV direct,@Ri */
+ [0x87] = { .flags = 0, .len = 2 }, /* MOV direct,@Ri */
+ [0x75] = { .flags = 0, .len = 3 }, /* MOV direct,#data */
+
+ [0xF6] = { .flags = 0, .len = 1 }, /* MOV @Ri,A */
+ [0xF7] = { .flags = 0, .len = 1 }, /* MOV @Ri,A */
+ [0xA6] = { .flags = 0, .len = 2 }, /* MOV @Ri,direct */
+ [0xA7] = { .flags = 0, .len = 2 }, /* MOV @Ri,direct */
+ [0x76] = { .flags = 0, .len = 2 }, /* MOV @Ri,#data */
+ [0x77] = { .flags = 0, .len = 2 }, /* MOV @Ri,#data */
+
+
+ [0x90] = { .flags = 0, .len = 3 }, /* MOV DPTR,#data16 */
+
+ [0x93] = { .flags = 0, .len = 1 }, /* MOVC A,@A+DPTR */
+ [0x83] = { .flags = 0, .len = 1 }, /* MOVC A,@A+PC */
+
+ [0xE2] = { .flags = 0, .len = 1 }, /* MOVX A,@Ri */
+ [0xE3] = { .flags = 0, .len = 1 }, /* MOVX A,@Ri */
+ [0xE0] = { .flags = 0, .len = 1 }, /* MOVX A,@DPTR */
+ [0xF2] = { .flags = 0, .len = 1 }, /* MOVX @Ri,A */
+ [0xF3] = { .flags = 0, .len = 1 }, /* MOVX @Ri,A */
+ [0xF0] = { .flags = 0, .len = 1 }, /* MOVX @DPTR,A */
+
+ [0xC0] = { .flags = 0, .len = 2 }, /* PUSH direct */
+ [0xD0] = { .flags = 0, .len = 2 }, /* POP direct */
+ [0xF5] = { .flags = 0, .len = 2 }, /* MOV direct,A */
+ [0xF5] = { .flags = 0, .len = 2 }, /* MOV direct,A */
+ [0xF5] = { .flags = 0, .len = 2 }, /* MOV direct,A */
+ [0xF5] = { .flags = 0, .len = 2 }, /* MOV direct,A */
+
+ [0xC8] = { .flags = 0, .len = 1 }, /* XCH A,Rn */
+ [0xC9] = { .flags = 0, .len = 1 }, /* XCH A,Rn */
+ [0xCA] = { .flags = 0, .len = 1 }, /* XCH A,Rn */
+ [0xCB] = { .flags = 0, .len = 1 }, /* XCH A,Rn */
+ [0xCC] = { .flags = 0, .len = 1 }, /* XCH A,Rn */
+ [0xCD] = { .flags = 0, .len = 1 }, /* XCH A,Rn */
+ [0xCE] = { .flags = 0, .len = 1 }, /* XCH A,Rn */
+ [0xCF] = { .flags = 0, .len = 1 }, /* XCH A,Rn */
+ [0xC5] = { .flags = 0, .len = 2 }, /* XCH A,direct */
+ [0xC6] = { .flags = 0, .len = 1 }, /* XCH A,@Ri */
+ [0xC7] = { .flags = 0, .len = 1 }, /* XCH A,@Ri */
+ [0xD6] = { .flags = 0, .len = 1 }, /* XCHD A,@Ri */
+ [0xD7] = { .flags = 0, .len = 1 }, /* XCHD A,@Ri */
+
+ [0x11] = { .flags = IS_CALL, .len = 2 }, /* ACALL addr11 */
+ [0x31] = { .flags = IS_CALL, .len = 2 }, /* ACALL addr11 */
+ [0x51] = { .flags = IS_CALL, .len = 2 }, /* ACALL addr11 */
+ [0x71] = { .flags = IS_CALL, .len = 2 }, /* ACALL addr11 */
+ [0x91] = { .flags = IS_CALL, .len = 2 }, /* ACALL addr11 */
+ [0xb1] = { .flags = IS_CALL, .len = 2 }, /* ACALL addr11 */
+ [0xd1] = { .flags = IS_CALL, .len = 2 }, /* ACALL addr11 */
+ [0xf1] = { .flags = IS_CALL, .len = 2 }, /* ACALL addr11 */
+ [0x12] = { .flags = IS_CALL, .len = 3 }, /* LCALL addr16 */
+
+ [0x22] = { .flags = IS_RET, .len = 1 }, /* RET */
+ [0x32] = { .flags = IS_RET, .len = 1 }, /* RETI */
+
+ [0x01] = { .flags = IS_BRANCH, .len = 2 }, /* AJMP addr11 */
+ [0x21] = { .flags = IS_BRANCH, .len = 2 }, /* AJMP addr11 */
+ [0x41] = { .flags = IS_BRANCH, .len = 2 }, /* AJMP addr11 */
+ [0x61] = { .flags = IS_BRANCH, .len = 2 }, /* AJMP addr11 */
+ [0x81] = { .flags = IS_BRANCH, .len = 2 }, /* AJMP addr11 */
+ [0xa1] = { .flags = IS_BRANCH, .len = 2 }, /* AJMP addr11 */
+ [0xc1] = { .flags = IS_BRANCH, .len = 2 }, /* AJMP addr11 */
+ [0xe1] = { .flags = IS_BRANCH, .len = 2 }, /* AJMP addr11 */
+ [0x02] = { .flags = IS_BRANCH, .len = 3 }, /* LJMP addr16 */
+
+ [0x80] = { .flags = IS_BRANCH, .len = 2 }, /* SJMP rel */
+
+ [0x73] = { .flags = IS_BRANCH, .len = 1 }, /* JMP @A+DPTR */
+
+ [0x60] = { .flags = IS_BRANCH, .len = 2 }, /* JZ rel */
+ [0x70] = { .flags = IS_BRANCH, .len = 2 }, /* JNZ rel */
+ [0x40] = { .flags = IS_BRANCH, .len = 2 }, /* JC rel */
+ [0x50] = { .flags = IS_BRANCH, .len = 2 }, /* JNC rel */
+ [0x20] = { .flags = IS_BRANCH, .len = 3 }, /* JB bit,rel */
+ [0x30] = { .flags = IS_BRANCH, .len = 3 }, /* JNB bit,rel */
+ [0x10] = { .flags = IS_BRANCH, .len = 3 }, /* JBC bit,direct rel */
+
+ [0xB5] = { .flags = IS_BRANCH, .len = 3 }, /* CJNE A,direct rel */
+ [0xB4] = { .flags = IS_BRANCH, .len = 3 }, /* CJNE A,#data rel */
+ [0xB8] = { .flags = IS_BRANCH, .len = 3 }, /* CJNE Rn,#data rel */
+ [0xB9] = { .flags = IS_BRANCH, .len = 3 }, /* CJNE Rn,#data rel */
+ [0xBA] = { .flags = IS_BRANCH, .len = 3 }, /* CJNE Rn,#data rel */
+ [0xBB] = { .flags = IS_BRANCH, .len = 3 }, /* CJNE Rn,#data rel */
+ [0xBC] = { .flags = IS_BRANCH, .len = 3 }, /* CJNE Rn,#data rel */
+ [0xBD] = { .flags = IS_BRANCH, .len = 3 }, /* CJNE Rn,#data rel */
+ [0xBE] = { .flags = IS_BRANCH, .len = 3 }, /* CJNE Rn,#data rel */
+ [0xBF] = { .flags = IS_BRANCH, .len = 3 }, /* CJNE Rn,#data rel */
+ [0xB6] = { .flags = IS_BRANCH, .len = 3 }, /* CJNE @Ri,direct rel */
+ [0xB7] = { .flags = IS_BRANCH, .len = 3 }, /* CJNE @Ri,direct rel */
+
+ [0xD8] = { .flags = IS_BRANCH, .len = 2 }, /* DNJZ Rn,rel */
+ [0xD9] = { .flags = IS_BRANCH, .len = 2 }, /* DNJZ Rn,rel */
+ [0xDA] = { .flags = IS_BRANCH, .len = 2 }, /* DNJZ Rn,rel */
+ [0xDB] = { .flags = IS_BRANCH, .len = 2 }, /* DNJZ Rn,rel */
+ [0xDC] = { .flags = IS_BRANCH, .len = 2 }, /* DNJZ Rn,rel */
+ [0xDD] = { .flags = IS_BRANCH, .len = 2 }, /* DNJZ Rn,rel */
+ [0xDE] = { .flags = IS_BRANCH, .len = 2 }, /* DNJZ Rn,rel */
+ [0xDF] = { .flags = IS_BRANCH, .len = 2 }, /* DNJZ Rn,rel */
+ [0xD5] = { .flags = IS_BRANCH, .len = 3 }, /* DNJZ direct,rel */
+
+ [0x00] = { .flags = 0, .len = 1 }, /* NOP */
+
+ [0xC3] = { .flags = 0, .len = 1 }, /* CLR C */
+ [0xC2] = { .flags = 0, .len = 2 }, /* CLR bit */
+ [0xD3] = { .flags = 0, .len = 1 }, /* SETB C */
+ [0xD2] = { .flags = 0, .len = 2 }, /* SETB bit */
+
+ [0xB3] = { .flags = 0, .len = 1 }, /* CPL C */
+ [0xB2] = { .flags = 0, .len = 2 }, /* CPL bit */
+
+ [0x82] = { .flags = 0, .len = 2 }, /* ANL C,bit */
+ [0xB0] = { .flags = 0, .len = 2 }, /* ANL C,/bit */
+ [0x72] = { .flags = 0, .len = 2 }, /* ORL C,bit */
+ [0xA0] = { .flags = 0, .len = 2 }, /* ORL C,/bit */
+
+ [0xA2] = { .flags = 0, .len = 2 }, /* MOV C,bit */
+ [0x92] = { .flags = 0, .len = 2 }, /* MOV bit,C */
+
+ [0xA5] = { .flags = 0, .len = 1 }, /* TRAP */
+};
+
+#define RET 0x22
+#define RETI 0x32
+
+#define PUSH 0xC0
+#define POP 0xD0
+#define MOV_direct_A 0xF5
+#define MOV_A_direct 0xE5
+#define ADD_A_imm 0x24
+#define SP 0x81
+#define RET 0x22
+#define RETI 0x32
+#define LJMP_addr16 0x02
+#define SJMP_rel 0x80
+
+static int stack_change(unsigned addr)
+{
+ unsigned char insn;
+ unsigned char direct;
+
+ insn = simGetValue(addr, 'C', 1);
+ switch (insn) {
+ case PUSH:
+ return 1;
+ case POP:
+ return -1;
+ case MOV_direct_A:
+ direct = simGetValue(addr+1, 'C', 1);
+ if (direct == SP) {
+ unsigned char add_insn;
+ unsigned char add_direct;
+
+ add_insn = simGetValue(addr-2, 'C', 1);
+ if (add_insn == ADD_A_imm) {
+ add_direct = simGetValue(addr-1, 'C', 1);
+ return (signed char) add_direct;
+ }
+ }
+ break;
+ case RET:
+ return 0;
+ case RETI:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+static int pc_change(unsigned addr, unsigned addrs[2])
+{
+ unsigned char insn;
+ unsigned new_addr;
+ signed char delta;
+ int len;
+
+ insn = simGetValue(addr, 'C', 1);
+ if (instructions[insn].flags & IS_RET)
+ return 0;
+
+ if (!(instructions[insn].flags & IS_BRANCH)) {
+ addrs[0] = addr + instructions[insn].len;
+ return 1;
+ }
+
+ if (insn == LJMP_addr16) {
+ addrs[0] = ((simGetValue(addr+1, 'C', 1) << 8) |
+ (simGetValue(addr+2, 'C', 1)));
+ return 1;
+ }
+
+ /* AJMP */
+ if ((insn & 0x1f) == 0x01) {
+ unsigned char direct = simGetValue(addr+1,'C', 1);
+
+ addrs[0] = ((addr + 2) & 0xf800) | ((insn & 0xe0) << 3) | direct;
+ return 1;
+ }
+
+ /* otherwise, relative branch */
+ len = instructions[insn].len;
+
+ delta = (signed char) simGetValue(addr+len-1, 'C', 1);
+ new_addr = (addr + len) + delta;
+
+ if (insn == SJMP_rel) {
+ addrs[0] = new_addr;
+ return 1;
+ }
+
+ addrs[0] = addr + len;
+ addrs[1] = new_addr;
+ return 2;
+}
+
+#define SEARCH_FAILED 0x8000
+
+static int
+stack_depth(unsigned pc, int search)
+{
+ unsigned new_pc[2];
+ unsigned max_pc = pc;
+ int n;
+ int s;
+ int change;
+
+ change = 0;
+ for (;;) {
+ change += stack_change(pc);
+ n = pc_change(pc, new_pc);
+ if (n == 0)
+ return change;
+ if (n != 1)
+ break;
+ pc = new_pc[0];
+ /* detect infinite loop */
+ if (pc == max_pc)
+ return change;
+ if (pc > max_pc)
+ max_pc = pc;
+ }
+
+ if (search == 0)
+ return SEARCH_FAILED;
+
+ for (s = 0; s < search - 1; s++) {
+ int d;
+ int i;
+ d = SEARCH_FAILED;
+ for (i = 0; i < n; i++) {
+ d = stack_depth(new_pc[i], search-1);
+ if (d != SEARCH_FAILED)
+ return d + change;
+ }
+ }
+ return SEARCH_FAILED;
+}
+
+unsigned int
+stack_start(void)
+{
+ symbol *start_stack = symLookup("__start_stack", NULL);
+ if (start_stack)
+ return start_stack->addr;
+ return 0x8;
+}
+
+static int
+frameStart(unsigned int *bpp, unsigned int *pcp)
+{
+ unsigned int bp;
+ unsigned int sp;
+ unsigned int pc;
+ int depth;
+ symbol *bp_sym;
- return currCtxt ;
+ pc = simGetPC();
+ sp = simGetValue(0x81,'I',1);
+ depth = stack_depth(pc, 100);
+ bp = sp + depth;
+ if (bp < stack_start())
+ return 0;
+ *bpp = bp;
+ *pcp = pc;
+ return 1;
}
+static int
+frameNext(unsigned int *bpp, unsigned int *pcp)
+{
+ unsigned int bp = *bpp;
+ unsigned int pc;
+ int depth;
+ symbol *start_stack;
+
+ if (bp < stack_start())
+ return 0;
+ pc = simGetValue(bp - 1, 'B', 2);
+ depth = stack_depth(pc, 100);
+ bp = bp - 2 + depth;
+ *bpp = bp;
+ *pcp = pc;
+ return 1;
+}
+
+static int running = 0;
+
+static int is_running(void) {
+ return running;
+}
+
+static int set_running(int run) {
+ running = run;
+}
/*-----------------------------------------------------------------*/
/* simGo - send 'go' cmd to simulator and wait till a break occurs */
userinterrupt = 0;
return;
}
+#if 0
if ( gaddr == 0 )
{
function *func = NULL;;
if (applyToSet(functions,funcInAddr,gaddr,&func))
STACK_PUSH(callStack,func);
}
+#endif
addr = simGoTillBp (gaddr);
/* got the pc for the break point now first
discover the program context i.e. module, function
linenumber of the source etc, etc etc */
currentFrame = 0;
- ctxt = discoverContext (addr, NULL);
+ ctxt = discoverContext (addr, NULL, currCtxt);
/* dispatch all the break point call back functions */
rv = dispatchCB (addr,ctxt);
of the program */
if (!rv)
{
- if ( gaddr == 0 )
+ if ( gaddr == 0 )
gaddr = -1;
- if ( gaddr == -1 || doingSteps == 1 )
+ if ( gaddr == -1 || doingSteps == 1 )
goto top ;
}
/*-----------------------------------------------------------------*/
static char *preparePrint(char *s, context *cctxt, int *fmt, symbol **sym)
{
- char *bp = s+strlen(s) -1;
+ char *bp;
char save_ch ;
+ int ptr = 0;
*fmt = FMT_NON;
*sym = NULL;
- while (isspace(*s)) s++;
+ s = trim(s);
if (!*s)
return (char *)0;
- while (isspace(*bp)) bp--;
- bp++ ;
- *bp = '\0';
-
if ( *s == '/' )
{
/* format of printout */
break;
}
s++;
- while (isspace(*s)) s++;
+ s = trim_left(s);
+ }
+ while (*s == '*') {
+ ptr++;
+ s++;
}
for ( bp = s; *bp && ( isalnum( *bp ) || *bp == '_' || *bp == '$'); bp++ );
save_ch = *bp;
if ( *s )
*sym = symLookup(s,cctxt);
*bp = save_ch;
+ while (ptr--)
+ strcat(bp,"*");
if ( ! *sym )
fprintf(stdout,"No symbol \"%s\" in current context.\n", s);
if ( args > 0 )
{
- while (*s && isspace(*s)) s++;
+ s = trim_left(s);
if ( isdigit(*s))
{
saddr = strtol(s,&s,0);
if ( args > 1 )
{
- while (*s && isspace(*s)) s++;
+ s = trim_left(s);
if ( isdigit(*s))
eaddr = strtol(s,0,0);
else
{
if ( args > 1 )
- printf("Dump of assembler code from 0x%08x to 0x%08x:\n",saddr,eaddr);
+ printf("Dump of assembler code from 0x%08lx to 0x%08lx:\n",saddr,eaddr);
found = 0;
while ( saddr < eaddr )
{
*/
if (!cctxt) {
- fprintf(stdout,"No symbol table is loaded. Use the \"file\" command.\n");
- return 0;
+ fprintf(stdout,"No symbol table is loaded. Use the \"file\" command.\n");
+ return 0;
}
- /* white space skip */
- while (*s && isspace(*s)) s++;
-
- /* null terminate it after stripping trailing blanks*/
- bp = s + strlen(s);
- while (bp != s && isspace(*bp)) bp--;
- *bp = '\0';
+ /* trim left and right */
+ s = trim(s);
/* case a) nothing */
/* if nothing given then current location : we know
the current execution location from the currentContext */
if (! *s ) {
- /* if current context is known */
- if (cctxt->func) {
+ /* if current context is known */
+ if (cctxt->func) {
Dprintf(D_break, ("commonSetUserBp: a) cctxtaddr:%x \n",cctxt->addr));
- if (srcMode == SRC_CMODE)
- /* set the break point */
- setBreakPoint ( cctxt->addr , CODE , bpType , userBpCB ,
- cctxt->func->mod->c_name, cctxt->cline);
- else
- setBreakPoint ( cctxt->addr , CODE , bpType , userBpCB ,
- cctxt->func->mod->asm_name, cctxt->asmline);
+ if (srcMode == SRC_CMODE)
+ /* set the break point */
+ setBreakPoint ( cctxt->addr , CODE , bpType , userBpCB ,
+ cctxt->func->mod->c_name, cctxt->cline);
+ else
+ setBreakPoint ( cctxt->addr , CODE , bpType , userBpCB ,
+ cctxt->func->mod->asm_name, cctxt->asmline);
- }
- else
- fprintf(stderr,"No default breakpoint address now.\n");
+ }
+ else
+ fprintf(stderr,"No default breakpoint address now.\n");
- goto ret ;
+ goto ret ;
}
/* case g) *addr */
if ( *s == '*' && isdigit(*(s+1)))
module *modul;
if (!applyToSet(modules,moduleLineWithAddr,braddr,&modul,&line))
{
- fprintf(stderr,"Address 0x%08x not exists in code.\n",braddr);
+ fprintf(stderr,"Address 0x%08lx not exists in code.\n",braddr);
}
else
{
- Dprintf(D_break, ("commonSetUserBp: g) addr:%x \n",braddr));
+ Dprintf(D_break, ("commonSetUserBp: g) addr:%lx \n",braddr));
setBreakPoint ( braddr , CODE , bpType , userBpCB ,
modul->c_name,line);
}
goto ret ;
}
- else
+ else
{
int line = func->exitline;
if ( !applyToSet(func->cfpoints,lineAtAddr,braddr,
setBreakPoint ( braddr , CODE , bpType , userBpCB ,
func->mod->c_name,line);
}
- goto ret ;
+ goto ret ;
}
/* case b) lineno */
/* check if line number */
if ( !strchr(s,':') && isdigit(*s)) {
- /* get the lineno */
- int line = atoi(s) -1;
+ /* get the lineno */
+ int line = atoi(s) -1;
Dprintf(D_break, ("commonSetUserBp: b) line:%d \n",line));
if ( line < 0 )
{
- fprintf(stdout,"linenumber <= 0\n");
+ fprintf(stdout,"linenumber <= 0\n");
goto ret;
}
- /* if current context not present then we must get the module
- which has main & set the break point @ line number provided
- of that module : if current context known then set the bp
- at the line number given for the current module
- */
- if (cctxt->func) {
- if (!cctxt->func->mod) {
- if (!applyToSet(functions,funcWithName,"main"))
- fprintf(stderr,"Function \"main\" not defined.\n");
- else
- setBPatModLine(func->mod,line, bpType);
- } else
- setBPatModLine(cctxt->func->mod,line, bpType);
- } else {
- if (list_mod) {
- setBPatModLine(list_mod,line, bpType);
- } else {
- fprintf(stdout,"Sdcdb fails to have module symbol context at %d\n", __LINE__);
- }
- }
+ /* if current context not present then we must get the module
+ which has main & set the break point @ line number provided
+ of that module : if current context known then set the bp
+ at the line number given for the current module
+ */
+ if (cctxt->func) {
+ if (!cctxt->func->mod) {
+ if (!applyToSet(functions,funcWithName,"main"))
+ fprintf(stderr,"Function \"main\" not defined.\n");
+ else
+ setBPatModLine(func->mod,line, bpType);
+ } else
+ setBPatModLine(cctxt->func->mod,line, bpType);
+ } else {
+ if (list_mod) {
+ setBPatModLine(list_mod,line, bpType);
+ } else {
+ fprintf(stdout,"Sdcdb fails to have module symbol context at %d\n", __LINE__);
+ }
+ }
- goto ret;
+ goto ret;
}
if ((bp = strchr(s,':'))) {
- module *mod = NULL;
- *bp = '\0';
+ module *mod = NULL;
+ *bp = '\0';
- if (srcMode == SRC_CMODE) {
- if (!applyToSet(modules,moduleWithCName,s,&mod)) {
- fprintf (stderr,"No source file named %s.\n",s);
- goto ret;
- }
- } else {
- if (!applyToSet(modules,moduleWithAsmName,s,&mod)) {
- fprintf (stderr,"No source file named %s.\n",s);
- goto ret;
- }
- }
+ if (srcMode == SRC_CMODE) {
+ if (!applyToSet(modules,moduleWithCName,s,&mod)) {
+ fprintf (stderr,"No source file named %s.\n",s);
+ goto ret;
+ }
+ } else {
+ if (!applyToSet(modules,moduleWithAsmName,s,&mod)) {
+ fprintf (stderr,"No source file named %s.\n",s);
+ goto ret;
+ }
+ }
- /* case c) filename:lineno */
- if (isdigit(*(bp +1))) {
+ /* case c) filename:lineno */
+ if (isdigit(*(bp +1))) {
Dprintf(D_break, ("commonSetUserBp: c) line:%d \n",atoi(bp+1)));
- setBPatModLine (mod,atoi(bp+1)-1,bpType);
- goto ret;
+ setBPatModLine (mod,atoi(bp+1)-1,bpType);
+ goto ret;
- }
- /* case d) filename:function */
- if (!applyToSet(functions,funcWithNameModule,bp+1,s,&func))
- fprintf(stderr,"Function \"%s\" not defined.\n",bp+1);
- else
+ }
+ /* case d) filename:function */
+ if (!applyToSet(functions,funcWithNameModule,bp+1,s,&func))
+ fprintf(stderr,"Function \"%s\" not defined.\n",bp+1);
+ else
Dprintf(D_break, ("commonSetUserBp: d) \n"));
- setBPatModLine (mod,
- (srcMode == SRC_CMODE ?
- func->entryline :
- func->aentryline),bpType);
+ setBPatModLine (mod,
+ (srcMode == SRC_CMODE ?
+ func->entryline :
+ func->aentryline),bpType);
- goto ret;
+ goto ret;
}
/* case e) function */
Dprintf(D_break, ("commonSetUserBp: e) \n"));
if (!applyToSet(functions,funcWithName,s,&func))
- fprintf(stderr,"Function \"%s\" not defined.\n",s);
+ fprintf(stderr,"Function \"%s\" not defined.\n",s);
else
- setBPatModLine(func->mod,
- (srcMode == SRC_CMODE ?
- func->entryline :
- func->aentryline),bpType);
+ setBPatModLine(func->mod,
+ (srcMode == SRC_CMODE ?
+ func->entryline :
+ func->aentryline),bpType);
ret:
return 0;
/*-----------------------------------------------------------------*/
int cmdJump (char *s, context *cctxt)
{
- char *bp ;
+ char *bp;
function *func = NULL;
- if (STACK_EMPTY(callStack))
+ if (!is_running())
{
fprintf(stdout,"The program is not running.\n");
return 0;
}
- /* white space skip */
- while (*s && isspace(*s)) s++;
+ /* trim left and right */
+ s = trim(s);
- /* null terminate it after stripping trailing blanks*/
- bp = s + strlen(s);
- while (bp != s && isspace(*bp)) bp--;
- *bp = '\0';
if (! *s )
{
fprintf(stdout,"No argument: need line or *addr.\n");
int line = atoi(s) -1;
if (!cctxt || !cctxt->func || !cctxt->func->mod)
{
- fprintf(stderr,"Function not defined.\n");
+ fprintf(stderr,"Function not defined.\n");
return 0;
}
if (line >= cctxt->func->entryline &&
}
if (line >= cctxt->func->mod->ncLines )
{
- fprintf(stderr,"line not in module.\n");
+ fprintf(stderr,"line not in module.\n");
return 0;
}
fprintf(stdout,"Warning line %d outside actual function.\n",line+1);
line = atoi(bp) -1;
if (line >= mod->ncLines )
{
- fprintf(stderr,"line not in module.\n");
+ fprintf(stderr,"line not in module.\n");
return 0;
}
if ( mod != cctxt->func->mod ||
/*-----------------------------------------------------------------*/
int cmdSetOption (char *s, context *cctxt)
{
- while (*s && isspace(*s)) s++;
+ s = trim_left(s);
if (strncmp(s,"srcmode",7) == 0 ) {
- if (srcMode == SRC_CMODE)
- srcMode = SRC_AMODE;
- else
- srcMode = SRC_CMODE;
- fprintf(stderr,"source mode set to '%s'\n",
- (srcMode == SRC_CMODE ? "C" : "asm"));
- return 0;
+ if (srcMode == SRC_CMODE)
+ srcMode = SRC_AMODE;
+ else
+ srcMode = SRC_CMODE;
+ fprintf(stderr,"source mode set to '%s'\n",
+ (srcMode == SRC_CMODE ? "C" : "asm"));
+ return 0;
}
if (strncmp(s,"listsize ",9) == 0)
s = rs;
while (*s && *s != '=') s++;
*s++ = '\0';
- while (isspace(*s)) *s++ = '\0';
+ s = trim_left(s);
if (*s && sym)
{
printOrSetSymValue(sym,cctxt,0,0,0,rs,s,'\0');
/*-----------------------------------------------------------------*/
int cmdContinue (char *s, context *cctxt)
{
- if (STACK_EMPTY(callStack)) {
- fprintf(stdout,"The program is not being run.\n");
- return 0;
+ if (!is_running()) {
+ fprintf(stdout,"The program is not being run.\n");
+ return 0;
}
fprintf(stdout,"Continuing.\n");
int cmdIgnore (char *s, context *cctxt)
{
int bpnum, cnt ;
- while (isspace(*s)) s++;
+ s = trim_left(s);
if (!*s )
{
fprintf(stdout,"Argument required (breakpoint number).\n");
return 0;
}
bpnum = strtol(s,&s,10);
- while (isspace(*s)) s++;
+ s = trim_left(s);
if (!*s )
{
fprintf(stdout,"Second argument (specified ignore-count) is missing.");
int cmdCondition (char *s, context *cctxt)
{
int bpnum ;
- while (isspace(*s)) s++;
+ s = trim_left(s);
if (!*s )
{
fprintf(stdout,"Argument required (breakpoint number).\n");
return 0;
}
bpnum = strtol(s,&s,10);
- while (isspace(*s)) s++;
+ s = trim_left(s);
if (*s)
s = Safe_strdup(s);
else
{
int bpnum ;
char *cmds,*line;
- while (isspace(*s)) s++;
+ s = trim_left(s);
if (!*s )
bpnum = getLastBreakptNumber();
cmds = NULL;
while ((line = getNextCmdLine()))
{
- while (isspace(*line)) line++;
+ line = trim_left(line);
if (!strncmp(line,"end",3))
break;
if (! cmds )
int cmdDelUserBp (char *s, context *cctxt)
{
int bpnum ;
- while (isspace(*s)) s++;
+ s = trim_left(s);
if (!*s ) {
- if (userBpPresent) {
- char buffer[10];
- fprintf (stdout,"Delete all breakpoints? (y or n) ");
- fflush(stdout);
- fgets(buffer,sizeof(buffer),stdin);
- if (toupper(buffer[0]) == 'Y')
- deleteUSERbp(-1);
- }
- return 0;
+ if (userBpPresent) {
+ char buffer[10];
+ fprintf (stdout,"Delete all breakpoints? (y or n) ");
+ fflush(stdout);
+ fgets(buffer,sizeof(buffer),stdin);
+ if (toupper(buffer[0]) == 'Y')
+ deleteUSERbp(-1);
+ }
+ return 0;
}
/* determine the break point number */
if (sscanf(s,"%d",&bpnum) == 1)
- deleteUSERbp(bpnum);
+ deleteUSERbp(bpnum);
return 0;
}
int cmdStepi (char *s, context *cctxt)
{
- if (0 /*STACK_EMPTY(callStack)*/)
+ if (!is_running())
fprintf(stdout,"The program is not being run.\n");
else
{
doingSteps = 2;
- simGo(2);
+ simGo(2);
doingSteps = 0;
showfull = 1;
}
return 0;
}
+static unsigned line_start_addr(context *ctx, int line)
+{
+ function *func = ctx->func;
+ module *mod = func->mod;
+ unsigned addr;
+ int nlines;
+
+ if (srcMode == SRC_CMODE)
+ nlines = mod->ncLines;
+ else
+ nlines = mod->nasmLines;
+
+ do {
+ if (srcMode == SRC_CMODE)
+ addr = mod->cLines[line]->addr;
+ else
+ addr = mod->asmLines[line]->addr;
+ ++line;
+ } while (addr == 0x7fffffff && line < nlines);
+ if (addr == 0x7fffffff)
+ addr = func->sym->eaddr;
+ return addr;
+}
+
+static unsigned line_end_addr(context *ctx, int line)
+{
+ function *func = ctx->func;
+ module *mod = func->mod;
+ int next_line, nlines;
+ unsigned start_addr = line_start_addr(ctx, line);
+ unsigned next_addr = func->sym->eaddr + 1;
+ unsigned addr;
+
+ if (srcMode == SRC_CMODE)
+ nlines = mod->ncLines;
+ else
+ nlines = mod->nasmLines;
+ for (next_line = 0; next_line < nlines; next_line++) {
+ if (next_line == line)
+ continue;
+ if (srcMode == SRC_CMODE)
+ addr = mod->cLines[next_line]->addr;
+ else
+ addr = mod->asmLines[next_line]->addr;
+ if (start_addr < addr && addr < next_addr)
+ next_addr = addr;
+ }
+ return next_addr;
+}
+
+BP_CALLBACK(step_bp_callback)
+{
+ deleteSTEPbp();
+ return 1;
+}
+
+static int do_step(context *ctx, int into)
+{
+ function *func = ctx->func;
+ module *mod = func->mod;
+ srcLine **lines;
+ srcLine *line;
+ int nlines;
+ int start, end;
+ int start_l;
+ unsigned len;
+ unsigned start_addr, end_addr, addr;
+ unsigned char insn;
+ unsigned char flags;
+
+ if (srcMode == SRC_CMODE) {
+ lines = mod->cLines;
+ nlines = mod->ncLines;
+ start_l = ctx->cline;
+ } else {
+ lines = mod->asmLines;
+ nlines = mod->nasmLines;
+ start_l = ctx->asmline;
+ }
+ if (start_l == -1)
+ return 0;
+ flags = IS_BRANCH|IS_RET;
+ if (into)
+ flags |= IS_CALL;
+ line = lines[start_l];
+ start = line_start_addr(ctx, start_l);
+ end = line_end_addr(ctx, start_l);
+
+ while (start <= ctx->addr && ctx->addr < end) {
+ insn = 0xff;
+ for (addr = ctx->addr; addr < end; addr += len) {
+ insn = simGetValue(addr, 'C', 1);
+ if (instructions[insn].flags & flags)
+ break;
+ len = instructions[insn].len;
+ if (len == 0) {
+ fprintf(stderr, "Unknown opcode 0x%02x\n", insn);
+ return 0;
+ }
+ }
+ if (addr != ctx->addr) {
+ setBreakPoint(addr, CODE, STEP,
+ step_bp_callback,
+ mod->name, start_l);
+ doingSteps = 1;
+ /* run to breakpoint */
+ simGo(-1);
+ doingSteps = 0;
+ }
+ /* step over instruction at breakpoint */
+ if (start <= ctx->addr && ctx->addr < end) {
+ doingSteps = 2;
+ simGo(2);
+ doingSteps = 0;
+ }
+ }
+ stepBpCB(ctx->addr, NULL, ctx);
+ showfull = 1;
+}
+
/*-----------------------------------------------------------------*/
/* cmdStep - single step thru C source file */
/*-----------------------------------------------------------------*/
{
function *func = NULL;
- if (STACK_EMPTY(callStack))
+ if (!is_running())
fprintf(stdout,"The program is not being run.\n");
- else {
- /* if we are @ the end of a function then set
- break points at execution points of the
- function in the call stack... */
- if (cctxt->addr == cctxt->func->sym->eaddr) {
- if ((func = STACK_PEEK(callStack))) {
- if (srcMode == SRC_CMODE)
- applyToSet (func->cfpoints,setStepEPBp,STEP,
- func->mod->c_name);
- else
- applyToSet (func->afpoints,setStepEPBp,STEP,
- func->mod->asm_name);
- }
- } else {
- /* set breakpoints at all function entry points
- and all exepoints of this functions & for
- all functions one up in the call stack */
-
- /* all function entry points */
- applyToSet(functions,setStepBp);
-
- if (srcMode == SRC_CMODE) {
- /* for all execution points in this function */
- applyToSet(cctxt->func->cfpoints,setStepEPBp,STEP,
- cctxt->func->mod->c_name);
-
- /* set a break point @ the current function's
- exit */
- setBreakPoint (cctxt->func->sym->eaddr, CODE, STEP ,
- stepBpCB, cctxt->func->mod->c_name,
- cctxt->func->exitline);
-
- /* now break point @ callers execution points */
- if ((func = STACK_PPEEK(callStack))) {
- applyToSet (func->cfpoints,setStepEPBp,STEP,
- func->mod->c_name);
- /* set bp @ callers exit point */
- setBreakPoint (func->sym->eaddr, CODE, STEP ,
- stepBpCB, func->mod->c_name,
- func->exitline);
- }
- } else {
- /* for all execution points in this function */
- applyToSet(cctxt->func->afpoints,setStepEPBp,STEP,
- cctxt->func->mod->asm_name);
-
- /* set a break point @ the current function's
- exit */
- setBreakPoint (cctxt->func->sym->eaddr, CODE, STEP ,
- stepBpCB, cctxt->func->mod->asm_name,
- cctxt->func->aexitline);
-
- /* now break point @ callers execution points */
- if ((func = STACK_PPEEK(callStack))) {
-
- applyToSet (func->afpoints,setStepEPBp,STEP,
- func->mod->asm_name);
-
- /* set bp @ callers exit point */
- setBreakPoint (func->sym->eaddr, CODE, STEP ,
- stepBpCB, func->mod->asm_name,
- func->aexitline);
- }
- }
- }
-
- doingSteps = 1;
- simGo(2);
- doingSteps = 0;
- showfull = 1;
- }
+ else
+ do_step(cctxt, 1);
return 0;
}
/*-----------------------------------------------------------------*/
int cmdNexti (char *s, context *cctxt)
{
- if (STACK_EMPTY(callStack))
+ if (!is_running())
fprintf(stdout,"The program is not being run.\n");
else
{
doingSteps = 2;
- simGo(1);
+ simGo(1);
doingSteps = 0;
showfull = 1;
}
/* next is almost the same as step except we don't
we don't set break point for all function entry
points */
- if (STACK_EMPTY(callStack))
+ if (!is_running())
fprintf(stdout,"The program is not being run.\n");
- else {
- /* if we are @ the end of a function then set
- break points at execution points of the
- function in the call stack... */
- if (cctxt->addr == cctxt->func->sym->eaddr) {
- if ((func = STACK_PEEK(callStack))) {
- if (srcMode == SRC_CMODE)
- applyToSet (func->cfpoints,setStepEPBp,NEXT,
- func->mod->c_name);
- else
- applyToSet (func->afpoints,setStepEPBp,NEXT,
- func->mod->asm_name);
- }
- } else {
- if (srcMode == SRC_CMODE) {
- /* for all execution points in this function */
- applyToSet(cctxt->func->cfpoints,setNextEPBp,NEXT,
- cctxt->func->mod->c_name);
- /* set a break point @ the current function's
- exit */
- setBreakPoint (cctxt->func->sym->eaddr, CODE, NEXT ,
- nextBpCB, cctxt->func->mod->c_name,
- cctxt->func->exitline);
-
- /* now break point @ callers execution points */
- if ((func = STACK_PPEEK(callStack))) {
- applyToSet (func->cfpoints,setNextEPBp,NEXT ,
- func->mod->c_name);
- /* set bp @ callers exit point */
- setBreakPoint (func->sym->eaddr, CODE, NEXT ,
- stepBpCB, func->mod->c_name,
- func->exitline);
- }
- } else {
- /* for all execution points in this function */
- applyToSet(cctxt->func->afpoints,setNextEPBp,NEXT,
- cctxt->func->mod->asm_name);
- /* set a break point @ the current function's
- exit */
- setBreakPoint (cctxt->func->sym->eaddr, CODE, NEXT ,
- nextBpCB, cctxt->func->mod->asm_name,
- cctxt->func->aexitline);
-
- /* now break point @ callers execution points */
- if ((func = STACK_PPEEK(callStack))) {
- applyToSet (func->cfpoints,setNextEPBp,NEXT ,
- func->mod->asm_name);
- /* set bp @ callers exit point */
- setBreakPoint (func->sym->eaddr, CODE, NEXT ,
- stepBpCB, func->mod->asm_name,
- func->aexitline);
- }
- }
- }
- doingSteps = 1;
- simGo(1);
- doingSteps = 0;
- showfull = 1;
- }
+ else
+ do_step(cctxt, 0);
return 0;
}
int cmdRun (char *s, context *cctxt)
{
char buff[10];
- if (STACK_EMPTY(callStack)) {
- fprintf(stdout,"Starting program\n");
+
+ if (!is_running()) {
+ fprintf(stdout,"Starting program\n");
if ( ! simactive )
{
fprintf(stdout,"No executable file specified.\nUse the \"file\" command.\n");
return 0;
}
resetHitCount();
- simGo(0);
+ simGo(0);
} else {
- fprintf(stdout,
- "The program being debugged has been started already.\n");
- fprintf(stdout,"Start it from the beginning? (y or n) ");
- fflush(stdout);
+ fprintf(stdout,
+ "The program being debugged has been started already.\n");
+ fprintf(stdout,"Start it from the beginning? (y or n) ");
+ fflush(stdout);
- fgets(buff,sizeof(buff),stdin);
- if (toupper(buff[0]) == 'Y') {
- simReset();
+ fgets(buff,sizeof(buff),stdin);
+ if (toupper(buff[0]) == 'Y') {
+ simReset();
resetHitCount();
- simGo(0);
- }
+ simGo(0);
+ }
}
showfull = 1;
+ set_running(1);
return 0;
}
for ( j = 0; j < 8 ; j++ )
{
val = simGetValue (j,'R',1);
- fprintf(stdout," 0x%02X",val);
+ fprintf(stdout," 0x%02lX",val);
}
fprintf(stdout,"\n");
val = simGetValue (0xe0,'I',1);
- fprintf(stdout,"ACC : 0x%02X %d %c\n",val,val,(isprint(val) ? val : '.'));
+ fprintf(stdout,"ACC : 0x%02lX %lu %c\n",val,val,(isprint(val) ? (char)val : '.'));
val = simGetValue (0xf0,'I',1);
- fprintf(stdout,"B : 0x%02X %d %c\n",val,val,(isprint(val) ? val : '.'));
+ fprintf(stdout,"B : 0x%02lX %lu %c\n",val,val,(isprint(val) ? (char)val : '.'));
val = simGetValue (0x82,'I',2);
- fprintf(stdout,"DPTR: 0x%04X %d\n",val,val);
+ fprintf(stdout,"DPTR: 0x%04lX %lu\n",val,val);
val = simGetValue (0x81,'I',1);
- fprintf(stdout,"SP : 0x%02X (0x%04X)\n",val,simGetValue (val-1,'B',2));
+ fprintf(stdout,"SP : 0x%02lX (0x%04lX)\n",val,simGetValue (val-1,'B',2));
fprintf(stdout,"PSW : 0x%02X | CY : %c | AC : %c | OV : %c | P : %c\n",
i,(i&0x80)?'1':'0',(i&0x40)?'1':'0',(i&4)?'1':'0',(i&1)?'1':'0');
if ( all )
if (applyToSetFTrue(sfrsymbols,symWithAddr,i,'I',&sym))
{
val = simGetValue (sym->addr,sym->addrspace,sym->size);
- fprintf(stdout,"%s : 0x%02x",sym->name,val);
+ fprintf(stdout,"%s : 0x%02lx",sym->name,val);
if ( !(i & 0x07 ))
{
for ( j = 0 ; j < 8 ; j++ )
{
function *func ;
int i = 0 ;
-
- STACK_STARTWALK(callStack) ;
- while ((func = STACK_WALK(callStack))) {
- Dprintf(D_break, ("break: infoStack: %s %p (%p)\n",func->sym->name, w_callStack,p_callStack));
-
- fprintf(stdout,"#%d 0x%08x in %s () at %s:%d\n",i++,
- func->laddr,func->sym->name,
- func->mod->c_name,func->lline+1);
+ context *ctx, my_context;
+ unsigned int bp, pc, addr = ctxt->addr;
+ int status;
+
+ for (status = frameStart(&bp,&pc); status; status = frameNext(&bp, &pc)) {
+ ctx = discoverContext(pc, NULL, &my_context);
+ if (ctx) {
+ func = ctx->func;
+ Dprintf(D_break, ("break: infoStack: %s 0x%02x\n",func->sym->name, bp));
+
+ fprintf(stdout,"#%d 0x%08x in %s () at %s:%d\n",i++,
+ pc,func->sym->name,
+ func->mod->c_name,func->lline+1);
+ } else {
+ fprintf(stdout,"#%d 0x%08x\n", i++, pc);
+ }
}
if ( !i )
fprintf(stdout,"no stack.\n");
/*-----------------------------------------------------------------*/
int cmdWhere(char *s, context *cctxt)
{
- infoStack(cctxt);
- return 0;
+ infoStack(cctxt);
+ return 0;
}
/*-----------------------------------------------------------------*/
int cmdInfo (char *s, context *cctxt)
{
- while (isspace(*s)) s++;
+ /* trim left and_right*/
+ s = trim(s);
/* list all break points */
if (strncmp(s,"break",5) == 0) {
- listUSERbp();
- return 0;
+ listUSERbp();
+ return 0;
}
/* info frame same as frame */
- if (strcmp(s,"frame") == 0) {
- cmdFrame (s,cctxt);
- return 0;
+ if (strncmp(s,"frame",5) == 0) {
+ cmdFrame (s+5,cctxt);
+ return 0;
}
if (strncmp(s,"line",4) == 0) {
- infomode=1;
- cmdListSrc (s+4,cctxt);
- return 0;
+ infomode=1;
+ cmdListSrc (s+4,cctxt);
+ return 0;
}
if (strncmp(s,"source",6) == 0)
{
}
return 0;
}
- if (strncmp(s,"functions",7) == 0)
+ if (strcmp(s,"functions") == 0)
{
function *f;
module *m = NULL;
}
/* info stack display call stack */
if (strcmp(s,"stack") == 0) {
- infoStack(cctxt);
- showfull = 1;
- return 0;
+ infoStack(cctxt);
+ showfull = 1;
+ return 0;
}
/* info stack display call stack */
if (strcmp(s,"registers") == 0) {
infoRegisters(0,cctxt);
- return 0;
+ return 0;
}
/* info stack display call stack */
int cmdQuit (char *s, context *cctxt)
{
if (simactive)
- closeSimulator();
+ closeSimulator();
return 1;
}
function *func = NULL;
- while (*s && isspace(*s)) s++;
+ s = trim_left(s);
/* if the user has spcified line numer then the line number
can be of the following formats
FILE:FUNCTION - function in file */
if (*s) {
- /* case a) LINE */
- if (isdigit(*s)) {
- if (!cctxt || !cctxt->func || !cctxt->func->mod) {
- if (!list_mod) {
- fprintf(stdout,"Sdcdb fails to have a proper context at %d.\n", __LINE__);
- return 0;
- }
- }
- else
- list_mod = cctxt->func->mod;
+ /* case a) LINE */
+ if (isdigit(*s)) {
+ if (!cctxt || !cctxt->func || !cctxt->func->mod) {
+ if (!list_mod) {
+ fprintf(stdout,"Sdcdb fails to have a proper context at %d.\n", __LINE__);
+ return 0;
+ }
+ }
+ else
+ list_mod = cctxt->func->mod;
pline = strtol(s,&s,10) - 1;
if (s && (s = strchr(s,',')))
{
else
llines = listlines;
}
- }
- else {
- char *bp;
-
- /* if ':' present then FILE:LINE || FILE:FUNCTION */
- if ((bp = strchr(s,':'))) {
- *bp = '\0';
- bp ++;
- if (isdigit(*bp)) {
- /* FILE:LINE */
- list_mod=NULL; /* bug fix 2-09-02, moduleWithCName expects mod to be null */
- if (srcMode == SRC_CMODE) {
- if (!applyToSet(modules,moduleWithCName,s,&list_mod)) {
- fprintf (stderr,"No c source file named %s.\n",s);
- return 0;
- }
- } else {
- if (!applyToSet(modules,moduleWithAsmName,s,&list_mod)) {
- fprintf (stderr,"No source file named %s.\n",s);
- return 0;
- }
- }
- pline = strtol(bp,&bp,10) - 1;
+ }
+ else {
+ char *bp;
+
+ /* if ':' present then FILE:LINE || FILE:FUNCTION */
+ if ((bp = strchr(s,':'))) {
+ *bp = '\0';
+ bp ++;
+ if (isdigit(*bp)) {
+ /* FILE:LINE */
+ list_mod=NULL; /* bug fix 2-09-02, moduleWithCName expects mod to be null */
+ if (srcMode == SRC_CMODE) {
+ if (!applyToSet(modules,moduleWithCName,s,&list_mod)) {
+ fprintf (stderr,"No c source file named %s.\n",s);
+ return 0;
+ }
+ } else {
+ if (!applyToSet(modules,moduleWithAsmName,s,&list_mod)) {
+ fprintf (stderr,"No source file named %s.\n",s);
+ return 0;
+ }
+ }
+ pline = strtol(bp,&bp,10) - 1;
if (bp && (bp = strchr(bp,',')))
{
/* FILE:LINE,LASTLINE */
else
llines = listlines;
}
- } else {
- /* FILE:FUCTION */
- if (!applyToSet(functions,funcWithNameModule,bp,s,&func)) {
- fprintf(stdout,"Function \"%s\" not defined.\n",bp);
- return 0;
- }
- list_mod = func->mod;
- if (srcMode == SRC_CMODE) {
- pline = func->entryline;
- llines = func->exitline - func->entryline + 1;
- } else {
- pline = func->aentryline;
- llines = func->aexitline - func->aentryline + 1;
- }
- }
- }
- else {
- /* FUNCTION */
+ } else {
+ /* FILE:FUCTION */
+ if (!applyToSet(functions,funcWithNameModule,bp,s,&func)) {
+ fprintf(stdout,"Function \"%s\" not defined.\n",bp);
+ return 0;
+ }
+ list_mod = func->mod;
+ if (srcMode == SRC_CMODE) {
+ pline = func->entryline;
+ llines = func->exitline - func->entryline + 1;
+ } else {
+ pline = func->aentryline;
+ llines = func->aexitline - func->aentryline + 1;
+ }
+ }
+ }
+ else {
+ /* FUNCTION */
if (*s == '\'')
{
/* 'FUNCTION' */
}
}
- if (!applyToSet(functions,funcWithName,s,&func)) {
- fprintf(stderr,"Function \"%s\" not defined.\n",s);
- return 0;
- }
- else {
- list_mod = func->mod;
- if (srcMode == SRC_CMODE) {
- pline = func->entryline;
- llines = func->exitline - func->entryline + 1;
- } else {
- pline = func->aentryline;
- llines = func->aexitline - func->aentryline + 1;
- }
- }
- }
- }
+ if (!applyToSet(functions,funcWithName,s,&func)) {
+ fprintf(stderr,"Function \"%s\" not defined.\n",s);
+ return 0;
+ }
+ else {
+ list_mod = func->mod;
+ if (srcMode == SRC_CMODE) {
+ pline = func->entryline;
+ llines = func->exitline - func->entryline + 1;
+ } else {
+ pline = func->aentryline;
+ llines = func->aexitline - func->aentryline + 1;
+ }
+ }
+ }
+ }
} else {
- /* if no line specified & we had listed
- before then continue from that listing */
- if (currline)
- pline = currline ;
- else {
- if (!cctxt || !cctxt->func || !cctxt->func->mod) {
- fprintf(stdout,"Missing context at %d. Try list filename:lineno\n", __LINE__);
- return 0;
- }
- list_mod = cctxt->func->mod;
- if (srcMode == SRC_CMODE)
- pline = cctxt->cline;
- else
- pline = cctxt->asmline;
- }
+ /* if no line specified & we had listed
+ before then continue from that listing */
+ if (currline)
+ pline = currline ;
+ else {
+ if (!cctxt || !cctxt->func || !cctxt->func->mod) {
+ fprintf(stdout,"Missing context at %d. Try list filename:lineno\n", __LINE__);
+ return 0;
+ }
+ list_mod = cctxt->func->mod;
+ if (srcMode == SRC_CMODE)
+ pline = cctxt->cline;
+ else
+ pline = cctxt->asmline;
+ }
}
if (!list_mod) {
if ( infomode )
{
unsigned firstaddr , lastaddr ;
- if ( pline >= list_mod->ncLines )
+ if ( pline >= list_mod->ncLines )
pline = cctxt->cline;
firstaddr = lastaddr = list_mod->cLines[pline]->addr;
if (!func && cctxt && cctxt->func )
func = cctxt->func;
- fprintf(stdout,"Line %d of \"%s\" starts at address 0x%08x <%s+%d>",
+ fprintf(stdout,"Line %d of \"%s\" starts at address 0x%08x <%s+%d>",
pline+1,
list_mod->c_name, lastaddr,
func ? func->sym->name : "?",
infomode=0;
if ( func )
fprintf(stdout,"\032\032%s:%d:1:beg:0x%08x\n",
- func->mod->cfullname,
+ canonname(func->mod->cfullname),
llines,firstaddr);
else
showfull=1;
return 0;
}
for ( i = 0 ; i < llines ; i++ ) {
- if (srcMode == SRC_CMODE) {
- if ( (pline + i) >= list_mod->ncLines )
- break;
- fprintf(stdout,"%d\t%s",pline + i,
- list_mod->cLines[pline +i]->src);
- } else {
- if ( (pline + i) >= list_mod->nasmLines )
- break;
- fprintf(stdout,"%d\t%s",pline + i,
- list_mod->asmLines[pline +i]->src);
- }
+ if (srcMode == SRC_CMODE) {
+ if ( (pline + i) >= list_mod->ncLines )
+ break;
+ fprintf(stdout,"%d\t%s",pline + i,
+ list_mod->cLines[pline +i]->src);
+ } else {
+ if ( (pline + i) >= list_mod->nasmLines )
+ break;
+ fprintf(stdout,"%d\t%s",pline + i,
+ list_mod->asmLines[pline +i]->src);
+ }
}
currline = pline + i ;
return 0;
if (IS_FLOAT(type))
v.f = strtod(val,NULL);
else
- if (IS_PTR(type))
- v.val = strtol(val,NULL,0);
- else
+ if (IS_PTR(type))
+ v.val = strtol(val,NULL,0);
+ else
{
- if (IS_INTEGRAL(type))
+ if (IS_INTEGRAL(type))
{
link *etype;
if ( type->next )
v.i.lo = strtol(val,NULL,0);
else
v.val = strtol(val,NULL,0);
- }
+ }
else
v.val = strtol(val,NULL,0);
}
};
static int radixOfFormat[] = { 0 , 2, 8 ,10, 16 };
static int olenOfSize[] = { 0 , 3, 6 , 8, 11 };
- char buf[40];
- char negative = 0;
- int charPos = 38;
+ char buf[40];
+ char negative = 0;
+ int charPos = 38;
int radix;
if ( fmt == FMT_NON || fmt == FMT_DEZ )
negative = 1;
*/
- if (!negative)
- val = -val;
+ if (!negative)
+ val = -val;
- buf[39] = '\0';
+ buf[39] = '\0';
while (val <= -radix)
{
- buf[charPos--] = digits[-(val % radix)];
- val = val / radix;
- }
- buf[charPos] = digits[-val];
+ buf[charPos--] = digits[-(val % radix)];
+ val = val / radix;
+ }
+ buf[charPos] = digits[-val];
switch ( fmt )
{
buf[--charPos] = '0';
break;
}
- if (negative) {
- buf[--charPos] = '-';
- }
+ if (negative) {
+ buf[--charPos] = '-';
+ }
fputs(&buf[charPos],stdout);
}
v.val = simGetValue(addr,mem,size);
/* if this a floating point number then */
if (IS_FLOAT(type))
- fprintf(stdout,"%f",v.f);
+ fprintf(stdout,"%f",v.f);
else
- if (IS_PTR(type))
- fprintf(stdout,"0x%*x",size<<1,v.val);
- else
+ if (IS_PTR(type))
+ fprintf(stdout,"0x%0*lx",size<<1,v.val);
+ else
if (IS_INTEGRAL(type))
{
link *etype;
if (IS_BITVAR(etype))
fprintf(stdout,"%c",(v.val?'1':'0'));
else
- fprintf(stdout,"0x%0*x",size<<1,v.val);
+ fprintf(stdout,"0x%0*lx",size<<1,v.val);
}
}
- } else
- fprintf(stdout,"0x%0*x",size<<1,v.val);
+ } else
+ fprintf(stdout,"0x%0*lx",size<<1,v.val);
}
/*-----------------------------------------------------------------*/
fprintf(stdout,"print function not yet implemented");
}
+static void
+do_indent(int indent) {
+ while (indent--)
+ fprintf(stdout, " ");
+
+}
+
/*-----------------------------------------------------------------*/
/* printArrayValue - will print the values of array elements */
/*-----------------------------------------------------------------*/
static void printArrayValue (symbol *sym, link *type,
- char space, unsigned int addr, int fmt)
+ char space, unsigned int addr, int fmt,
+ int indent)
{
- link *elem_type = type->next;
- int i;
+ link *elem_type = type->next;
+ int i;
+ int col;
- fprintf(stdout,"{");
- for (i = 0 ; i < DCL_ELEM(type) ; i++) {
- if (IS_AGGREGATE(elem_type)) {
- printValAggregates(sym,elem_type,space,addr,fmt);
- } else {
- printValBasic(sym,elem_type,space,addr,getSize(elem_type),fmt);
- }
- addr += getSize(elem_type);
- if (i != DCL_ELEM(type) -1)
- fprintf(stdout,",");
+ fprintf(stdout,"{");
+ for (i = 0 ; i < DCL_ELEM(type) ; i++) {
+ if (IS_AGGREGATE(elem_type)) {
+ printValAggregates(sym,elem_type,space,addr,fmt,indent);
+ col = 0;
+ } else {
+ printValBasic(sym,elem_type,space,addr,getSize(elem_type),fmt);
+ col++;
+ }
+ addr += getSize(elem_type);
+ if (i != DCL_ELEM(type) -1) {
+ fprintf(stdout,",");
+ if (col == 16) {
+ fprintf(stdout,"\n");
+ do_indent(indent);
+ col = 0;
+ }
}
+ }
- fprintf(stdout,"}");
+ fprintf(stdout,"}");
}
/*-----------------------------------------------------------------*/
/* printStructValue - prints structures elements */
/*-----------------------------------------------------------------*/
static void printStructValue (symbol *sym, link *type,
- char space, unsigned int addr, int fmt)
+ char space, unsigned int addr, int fmt,
+ int indent)
{
- symbol *fields = SPEC_STRUCT(type)->fields;
+ symbol *fields = SPEC_STRUCT(type)->fields;
int first = 1;
- fprintf(stdout," { ");
- while (fields) {
- fprintf(stdout,"%s%s = ",(first ? "": ", "),fields->name);
- first = 0;
- if (IS_AGGREGATE(fields->type)) {
- printValAggregates(fields,fields->type,space, addr, fmt);
- } else {
- printValBasic(fields,fields->type,space,addr,getSize(fields->type), fmt);
- }
- addr += getSize(fields->type);
- fields = fields->next;
+ do_indent (indent);
+ fprintf(stdout,"{\n");
+ while (fields) {
+ do_indent(indent + 1);
+ fprintf(stdout,"%s = ", fields->name);
+ first = 0;
+ if (IS_AGGREGATE(fields->type)) {
+ printValAggregates(fields,fields->type,space, addr, fmt, indent + 1);
+ } else {
+ printValBasic(fields,fields->type,space,addr,getSize(fields->type), fmt);
}
- fprintf(stdout,"}");
+ fprintf(stdout,",\n");
+ addr += getSize(fields->type);
+ fields = fields->next;
+ }
+ do_indent(indent);
+ fprintf(stdout,"}");
}
/*-----------------------------------------------------------------*/
/* printValAggregates - print value of aggregates */
/*-----------------------------------------------------------------*/
static void printValAggregates (symbol *sym, link *type,
- char space,unsigned int addr, int fmt)
+ char space,unsigned int addr, int fmt,
+ int indent)
{
- if (IS_ARRAY(type)) {
- printArrayValue(sym, type, space, addr, fmt);
- return ;
- }
+ if (IS_ARRAY(type)) {
+ printArrayValue(sym, type, space, addr, fmt, indent);
+ return ;
+ }
- if (IS_STRUCT(type)) {
- printStructValue(sym, type, space, addr, fmt);
- return;
- }
+ if (IS_STRUCT(type)) {
+ printStructValue(sym, type, space, addr, fmt, indent);
+ return;
+ }
}
/*-----------------------------------------------------------------*/
{
static char fmtChar[] = " todx ";
static int stack = 1;
- symbol *fields;
+ symbol *fields;
link *type;
unsigned int addr;
int size, n;
char *s, *s2;
char save_ch, save_ch2;
+ int get_member = 0;
/* if it is on stack then compute address & fall thru */
if (sym->isonstack)
while ( *rs )
{
- if ( *rs == '[' && IS_ARRAY(type))
+ if ( *rs == '[' && (IS_ARRAY(type) || IS_PTR(type)))
{
s = rs+1;
while ( *rs && *rs != ']' ) rs++ ;
{
n = strtol(s,0,0);
}
- if ( n < 0 || n >= DCL_ELEM(type))
+ if ( IS_ARRAY(type) && (n < 0 || n >= DCL_ELEM(type)))
{
fprintf(stdout,"Wrong index %d.\n", n);
return 1;
}
+ if (IS_PTR(type))
+ addr = simGetValue(addr, sym->addrspace, size);
type = type->next;
size = getSize(type);
- addr += size * n;
+ addr += size * n;
*rs++ = save_ch;
}
- else if ( *rs == '.' && IS_STRUCT(type))
+ else if ( (*rs == '.' || get_member) && IS_STRUCT(type))
{
s = rs+1;
/* search structure element */
size = getSize(type);
addr += fields->offset;
}
+ else if ( *rs == '*' && IS_PTR(type))
+ {
+ addr = simGetValue(addr, sym->addrspace, size);
+ type = type->next;
+ size = getSize(type);
+ rs++;
+ }
+ else if ( rs[0] == '-' && rs[1] == '>' &&
+ IS_PTR(type) && IS_STRUCT(type->next))
+ {
+ addr = simGetValue(addr, sym->addrspace, size);
+ type = type->next;
+ size = getSize(type);
+ rs++;
+ get_member = 1;
+ continue;
+ }
else
break;
+ get_member = 0;
}
/* arrays & structures first */
if (IS_AGGREGATE(type))
{
- if ( val )
+ if ( val )
{
fprintf(stdout,"Cannot set/compare aggregate variable\n");
return 1;
}
else
- printValAggregates(sym,type,sym->addrspace,addr,fmt);
+ printValAggregates(sym,type,sym->addrspace,addr,fmt,0);
}
else
- /* functions */
- if (IS_FUNC(type))
+ /* functions */
+ if (IS_FUNC(type))
{
- if ( !val )
+ if ( !val )
printValFunc(sym,fmt);
else
return 1;
}
- else
+ else
{
- if ( val )
+ if ( val )
{
unsigned long newval;
newval = getValBasic(sym,type,val);
printValBasic(sym,type,sym->addrspace,addr,size,fmt);
}
if ( flg > 0 ) fprintf(stdout,"\n");
- return 0;
+ return 0;
}
/*-----------------------------------------------------------------*/
int i = 0 ;
while (field) {
- i += field->offset;
- field = field->next;
+ i += field->offset;
+ field = field->next;
}
fprintf(stdout,"%s %s {\n",(i ? "struct" : "union" ), sdef->tag);
field = sdef->fields;
while (field) {
- printTypeInfo (field->type);
- fprintf(stdout," %s ;\n",field->name);
- field = field->next ;
+ printTypeInfo (field->type);
+ fprintf(stdout," %s ;\n",field->name);
+ field = field->next ;
}
fprintf(stdout,"}\n");
static void printTypeInfo(link *p)
{
if (!p)
- return ;
+ return ;
if (IS_DECL(p)) {
- switch (DCL_TYPE(p)) {
- case FUNCTION:
- printTypeInfo (p->next);
- fprintf(stdout,"()");
- break;
- case ARRAY:
- printTypeInfo (p->next);
- fprintf(stdout,"[%d]",DCL_ELEM(p));
- break;
+ switch (DCL_TYPE(p)) {
+ case FUNCTION:
+ printTypeInfo (p->next);
+ fprintf(stdout,"()");
+ break;
+ case ARRAY:
+ printTypeInfo (p->next);
+ fprintf(stdout,"[%d]",DCL_ELEM(p));
+ break;
- case IPOINTER:
- case PPOINTER:
- case POINTER:
- printTypeInfo (p->next);
- fprintf(stdout,"(_near *)");
- break;
+ case IPOINTER:
+ case PPOINTER:
+ case POINTER:
+ printTypeInfo (p->next);
+ fprintf(stdout,"(_near *)");
+ break;
- case FPOINTER:
- printTypeInfo (p->next);
- fprintf(stdout,"(_xdata *)");
- break;
+ case FPOINTER:
+ printTypeInfo (p->next);
+ fprintf(stdout,"(_xdata *)");
+ break;
- case CPOINTER:
- printTypeInfo( p->next);
- fprintf(stdout,"(_code *)");
- break;
+ case CPOINTER:
+ printTypeInfo( p->next);
+ fprintf(stdout,"(_code *)");
+ break;
- case GPOINTER:
- printTypeInfo( p->next);
- fprintf(stdout,"(_generic *)");
- break;
- }
+ case GPOINTER:
+ printTypeInfo( p->next);
+ fprintf(stdout,"(_generic *)");
+ break;
+ }
} else {
- switch (SPEC_NOUN(p)) { /* depending on the specifier type */
- case V_INT:
- (IS_LONG(p) ? fputs("long ",stdout) :
- ( IS_SHORT(p) ? fputs("short ",stdout) :
- fputs("int ",stdout))) ;
- break;
- case V_FLOAT:
- fputs("float ",stdout);
- break;
+ switch (SPEC_NOUN(p)) { /* depending on the specifier type */
+ case V_INT:
+ (IS_LONG(p) ? fputs("long ",stdout) :
+ ( IS_SHORT(p) ? fputs("short ",stdout) :
+ fputs("int ",stdout))) ;
+ break;
+ case V_FLOAT:
+ fputs("float ",stdout);
+ break;
- case V_CHAR:
- fputs ("char ",stdout);
- break;
+ case V_CHAR:
+ fputs ("char ",stdout);
+ break;
- case V_VOID:
- fputs("void ",stdout);
- break;
+ case V_VOID:
+ fputs("void ",stdout);
+ break;
- case V_STRUCT:
- printStructInfo (SPEC_STRUCT(p));
- break;
+ case V_STRUCT:
+ printStructInfo (SPEC_STRUCT(p));
+ break;
- case V_SBIT:
- fputs("sbit ",stdout);
- break;
+ case V_SBIT:
+ fputs("sbit ",stdout);
+ break;
- case V_BIT:
- fprintf(stdout,": %d" ,SPEC_BLEN(p));
- break;
- }
+ case V_BIT:
+ fprintf(stdout,": %d" ,SPEC_BLEN(p));
+ break;
+ }
}
}
}
s++ ;
}
- while (isspace(*s)) *s++ = '\0';
+ s = trim_left(s);
fmt = printOrSetSymValue(sym,cctxt,0,0,0,rs,s,cmp_char);
}
Safe_free(dup);
dsymbol *dsym;
int dnum;
- while (isspace(*s)) s++;
+ s = trim_left(s);
if (!*s)
{
for (dsym = setFirstItem(dispsymbols);
/*-----------------------------------------------------------------*/
int cmdPrintType (char *s, context *cctxt)
{
- symbol *sym ;
- char *bp = s+strlen(s) -1;
+ symbol *sym ;
- while (isspace(*s)) s++;
+ /* trim left and right */
+ s = trim(s);
if (!*s) return 0;
- while (isspace(*bp)) bp--;
- bp++ ;
- *bp = '\0';
if ((sym = symLookup(s,cctxt))) {
- printTypeInfo(sym->type);
- fprintf(stdout,"\n");
+ printTypeInfo(sym->type);
+ fprintf(stdout,"\n");
} else {
- fprintf(stdout,
- "No symbol \"%s\" in current context.\n",
- s);
+ fprintf(stdout,
+ "No symbol \"%s\" in current context.\n",
+ s);
}
return 0;
}
*/
if (!cctxt) {
- fprintf(stdout,"No symbol table is loaded. Use the \"file\" command.\n");
- return 0;
+ fprintf(stdout,"No symbol table is loaded. Use the \"file\" command.\n");
+ return 0;
}
- /* white space skip */
- while (*s && isspace(*s)) s++;
-
- /* null terminate it after stripping trailing blanks*/
- bp = s + strlen(s);
- while (bp != s && isspace(*bp)) bp--;
- *bp = '\0';
+ /* trim left and right */
+ s = trim(s);
/* case a) nothing */
/* if nothing given then current location : we know
the current execution location from the currentContext */
if (! *s ) {
- /* if current context is known */
- if (cctxt->func)
- /* clear the break point @ current location */
- clearUSERbp (cctxt->addr);
- else
- fprintf(stderr,"No default breakpoint address now.\n");
+ /* if current context is known */
+ if (cctxt->func)
+ /* clear the break point @ current location */
+ clearUSERbp (cctxt->addr);
+ else
+ fprintf(stderr,"No default breakpoint address now.\n");
- goto ret ;
+ goto ret ;
}
/* case b) lineno */
/* check if line number */
if (isdigit(*s)) {
- /* get the lineno */
- int line = atoi(s);
-
- /* if current context not present then we must get the module
- which has main & set the break point @ line number provided
- of that module : if current context known then set the bp
- at the line number given for the current module
- */
- if (cctxt->func) {
- if (!cctxt->func->mod) {
- if (!applyToSet(functions,funcWithName,"main"))
- fprintf(stderr,"Function \"main\" not defined.\n");
- else
- clearBPatModLine(func->mod,line);
- } else
- clearBPatModLine(cctxt->func->mod,line);
- }
+ /* get the lineno */
+ int line = atoi(s);
+
+ /* if current context not present then we must get the module
+ which has main & set the break point @ line number provided
+ of that module : if current context known then set the bp
+ at the line number given for the current module
+ */
+ if (cctxt->func) {
+ if (!cctxt->func->mod) {
+ if (!applyToSet(functions,funcWithName,"main"))
+ fprintf(stderr,"Function \"main\" not defined.\n");
+ else
+ clearBPatModLine(func->mod,line);
+ } else
+ clearBPatModLine(cctxt->func->mod,line);
+ }
- goto ret;
+ goto ret;
}
if ((bp = strchr(s,':'))) {
- module *mod = NULL;
- *bp = '\0';
+ module *mod = NULL;
+ *bp = '\0';
- if (!applyToSet(modules,moduleWithCName,s,&mod)) {
- fprintf (stderr,"No source file named %s.\n",s);
- goto ret;
- }
+ if (!applyToSet(modules,moduleWithCName,s,&mod)) {
+ fprintf (stderr,"No source file named %s.\n",s);
+ goto ret;
+ }
- /* case c) filename:lineno */
- if (isdigit(*(bp +1))) {
+ /* case c) filename:lineno */
+ if (isdigit(*(bp +1))) {
- clearBPatModLine (mod,atoi(bp+1));
- goto ret;
+ clearBPatModLine (mod,atoi(bp+1));
+ goto ret;
- }
- /* case d) filename:function */
- if (!applyToSet(functions,funcWithNameModule,bp+1,s,&func))
- fprintf(stderr,"Function \"%s\" not defined.\n",bp+1);
- else
- clearBPatModLine (mod,func->entryline);
+ }
+ /* case d) filename:function */
+ if (!applyToSet(functions,funcWithNameModule,bp+1,s,&func))
+ fprintf(stderr,"Function \"%s\" not defined.\n",bp+1);
+ else
+ clearBPatModLine (mod,func->entryline);
- goto ret;
+ goto ret;
}
/* case e) function */
if (!applyToSet(functions,funcWithName,s,&func))
- fprintf(stderr,"Function \"%s\" not defined.\n",s);
+ fprintf(stderr,"Function \"%s\" not defined.\n",s);
else
- clearBPatModLine(func->mod,func->entryline);
+ clearBPatModLine(func->mod,func->entryline);
ret:
return 0;
!applyToSet(functions,funcWithName,"main",&func))
return;
- discoverContext (func->sym->addr, func);
+ discoverContext (func->sym->addr, func, currCtxt);
}
function *needExtraMainFunction()
int i;
function *func = NULL;
function *lastfunc = NULL;
+ context *ctx, my_context;
+ unsigned int bp, pc;
+ int status;
if ( currentFrame < 0 )
{
fprintf(stdout,"Bottom (i.e., innermost) frame selected; you cannot go down.\n");
return;
}
- STACK_STARTWALK(callStack) ;
- for ( i = 0; i <= currentFrame ; i++ )
+ i = 0;
+ for (status = frameStart(&bp, &pc); status; status = frameNext(&bp, &pc))
{
- func = STACK_WALK(callStack);
- if ( !func )
- {
- currentFrame = i-1;
- fprintf(stdout,"Initial frame selected; you cannot go up.\n");
- return;
- }
+ if (i >= currentFrame)
+ break;
+ i++;
+ }
+ if (i < currentFrame) {
+ currentFrame = i;
+ fprintf(stdout,"Initial frame selected; you cannot go up.\n");
+ return;
+ }
+ ctx = discoverContext(pc, NULL, &my_context);
+ if (ctx && (func = ctx->func)) {
+ fprintf(stdout,"#%d 0x%08x in %s () at %s:%d\n",
+ currentFrame,pc,func->sym->name,func->mod->c_name,func->lline+1);
+ fprintf(stdout,"\032\032%s:%d:1:beg:0x%08x\n",
+ canonname(func->mod->cfullname),func->lline+1,func->laddr);
+ } else {
+ fprintf(stdout,"#%d 0x%08x\n",
+ currentFrame,pc);
}
- fprintf(stdout,"#%d 0x%08x in %s () at %s:%d\n",
- currentFrame,func->laddr,func->sym->name,func->mod->c_name,func->lline+1);
- fprintf(stdout,"\032\032%s:%d:1:beg:0x%08x\n",
- func->mod->cfullname,func->lline+1,func->laddr);
-
- discoverContext (func->laddr, func);
}
/*-----------------------------------------------------------------*/
int cmdUp(char *s, context *cctxt)
{
- while (isspace(*s)) s++;
+ s = trim_left(s);
if ( *s )
currentFrame += strtol(s,0,10);
else
currentFrame++ ;
printFrame();
- return 0;
+ return 0;
}
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
int cmdDown(char *s, context *cctxt)
{
- while (isspace(*s)) s++;
+ s = trim_left(s);
if ( *s )
currentFrame -= strtol(s,0,10);
else
currentFrame-- ;
printFrame();
- return 0;
+ return 0;
}
/*-----------------------------------------------------------------*/
/* cmdFrame - Frame command */
function *func = NULL;
int framenr = 0;
- while (isspace(*s)) s++;
+ s = trim_left(s);
if ( *s )
currentFrame = strtol(s,0,10);
printFrame();
/*-----------------------------------------------------------------*/
int cmdFinish (char *s, context *ctxt)
{
+#if 0
if (STACK_EMPTY(callStack)) {
- fprintf(stdout,"The program is not running.\n");
- return 0;
+ fprintf(stdout,"The program is not running.\n");
+ return 0;
}
+#endif
if (srcMode == SRC_CMODE) {
- setBreakPoint (ctxt->func->sym->eaddr, CODE, STEP,
- stepBpCB, ctxt->func->mod->c_name,
- ctxt->func->exitline);
+ setBreakPoint (ctxt->func->sym->eaddr, CODE, STEP,
+ stepBpCB, ctxt->func->mod->c_name,
+ ctxt->func->exitline);
} else {
- setBreakPoint (ctxt->func->sym->eaddr, CODE, STEP,
- stepBpCB, ctxt->func->mod->asm_name,
- ctxt->func->aexitline);
+ setBreakPoint (ctxt->func->sym->eaddr, CODE, STEP,
+ stepBpCB, ctxt->func->mod->asm_name,
+ ctxt->func->aexitline);
}
simGo(-1);
int cmdShow (char *s, context *cctxt)
{
/* skip white space */
- while (*s && isspace(*s)) s++ ;
+ s = trim_left(s);
if (strcmp(s,"copying") == 0) {
- fputs(copying,stdout);
- return 0;
+ fputs(copying,stdout);
+ return 0;
}
if (strcmp(s,"warranty") == 0) {
- fputs(warranty,stdout);
- return 0;
+ fputs(warranty,stdout);
+ return 0;
}
return 0;