X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=debugger%2Fmcs51%2Fcmd.c;h=cd038fffea32bcf9665469ffdfa2ba1671a79186;hb=HEAD;hp=6bfe2b11e9bbe40ead804d5566e773338cff6d40;hpb=1034ff9e3b1d4b61d28de3d7b797b5c663a069f2;p=fw%2Fsdcc diff --git a/debugger/mcs51/cmd.c b/debugger/mcs51/cmd.c index 6bfe2b11..cd038fff 100644 --- a/debugger/mcs51/cmd.c +++ b/debugger/mcs51/cmd.c @@ -1,7 +1,6 @@ /*------------------------------------------------------------------------- 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 @@ -38,8 +37,6 @@ static int listlines = LISTLINES; 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"}; @@ -329,13 +326,13 @@ static char *warranty= #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 */ @@ -347,11 +344,11 @@ DEFSETFUNC(funcWithName) 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; @@ -407,27 +404,27 @@ static void setBPatModLine (module *mod, int line, char bpType ) 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; } @@ -440,29 +437,29 @@ static void clearBPatModLine (module *mod, int line) /* 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; @@ -519,9 +516,9 @@ DEFSETFUNC(funcWithNameModule) 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; @@ -537,14 +534,14 @@ DEFSETFUNC(funcInAddr) 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; @@ -559,11 +556,11 @@ DEFSETFUNC(setStepBp) 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; @@ -579,7 +576,7 @@ DEFSETFUNC(setStepEPBp) V_ARG(char *,mname); setBreakPoint (ep->addr, CODE, bptype, - stepBpCB, mname, ep->line); + stepBpCB, mname, ep->line); return 1; } @@ -593,7 +590,7 @@ DEFSETFUNC(setNextEPBp) V_ARG(char *,mname); setBreakPoint (ep->addr, CODE, bptype, - nextBpCB, mname, ep->line); + nextBpCB, mname, ep->line); return 1; } @@ -610,12 +607,12 @@ DEFSETFUNC(lineAtAddr) /* 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; @@ -635,12 +632,12 @@ DEFSETFUNC(lineNearAddr) /* 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; @@ -650,7 +647,7 @@ DEFSETFUNC(lineNearAddr) /*-----------------------------------------------------------------*/ /* 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; @@ -663,38 +660,609 @@ context *discoverContext (unsigned addr, function *func) 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 void +do_indent(int indent); + +#if 1 +#define DPC(x) +#else +#define DPC(x) do { do_indent(indent); printf x; } while (0); +#endif + +static int pc_change(unsigned addr, unsigned addrs[2], int indent) +{ + 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))); + DPC(("0x%04x LJMP 0x%04x\n", addr, addrs[0])); + return 1; + } + + /* AJMP */ + if ((insn & 0x1f) == 0x01) { + unsigned char direct = simGetValue(addr+1,'C', 1); + + addrs[0] = ((addr + 2) & 0xf800) | ((insn & 0xe0) << 3) | direct; + DPC(("0x%04x AJMP 0x%04x\n", addr, addrs[0])); + 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 || (addr + len) == new_addr) { + addrs[0] = new_addr; + DPC(("0x%04x SJMP 0x%04x\n", addr, addrs[0])); + return 1; + } + addrs[0] = (addr + len) & 0xffff; + addrs[1] = new_addr & 0xffff; + + DPC(("0x%04x SJMP 0x%04x 0x%04x\n", addr, addrs[0], addrs[1])); + return 2; +} + +#define SEARCH_LOOP 0x8000 +#define SEARCH_EXPIRED 0x8001 + +#define MAX_STACK_BRANCH_TRACE 8192 +static unsigned stack_branch_trace[MAX_STACK_BRANCH_TRACE]; + +static int +been_here(unsigned pc, int ntrace) +{ + int t; + + for (t = 0; t < ntrace; t++) + if (stack_branch_trace[t] == pc) + return 1; + return 0; +} + +#define MAX_SEARCH 100 + +#define indent (MAX_SEARCH - search) + +static int +stack_depth(unsigned pc, int search, int ntrace) +{ + unsigned new_pc[2]; + int d[2]; + int n; + int s; + int change; + + change = 0; + for (;;) { + change += stack_change(pc); + n = pc_change(pc, new_pc, MAX_SEARCH - search); + if (n == 0) + return change; + if (n != 1) + break; + if (new_pc[0] <= pc) { + if (been_here(pc, ntrace)) { + DPC(("0x%04x loop 1\n", pc)); + return SEARCH_LOOP; + } + stack_branch_trace[ntrace++] = pc; + } + pc = new_pc[0]; + } + + if (search == 0) { + DPC(("0x%04x max depth\n", pc)); + return SEARCH_EXPIRED; + } + + if (been_here(pc, ntrace)) + { + DPC(("0x%04x loop 2\n", pc)); + return SEARCH_LOOP; + } + stack_branch_trace[ntrace++] = pc; + + for (s = 0; s < search - 1; s++) { + int i, j, d; + + i = 0; + while (i < n) { + d = stack_depth(new_pc[i], search-1, ntrace); + if (d == SEARCH_LOOP) { + for (j = i; j < n-1; j++) + new_pc[j] = new_pc[j+1]; + n--; + continue; + } + if (d != SEARCH_EXPIRED) { + DPC(("success %d\n", d + change)); + return d + change; + } + i++; + } + if (n == 0) { + DPC(("0x%04x loop 3\n", pc)); + return SEARCH_LOOP; + } + } + DPC(("search expired\n")); + return SEARCH_EXPIRED; +} + +#undef indent + +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; + + pc = simGetPC(); + sp = simGetValue(0x81,'I',1); + depth = stack_depth(pc, MAX_SEARCH, 0); + if (depth == SEARCH_LOOP || depth == SEARCH_EXPIRED) + bp = 0; + else + bp = sp + depth; + *bpp = bp; + *pcp = pc; + return 1; +} - return currCtxt ; +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); + if (pc == 0xffff) + return 0; + depth = stack_depth(pc, MAX_SEARCH, 0); + if (depth == SEARCH_LOOP || depth == SEARCH_EXPIRED) + bp = 0; + else + 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 */ @@ -711,19 +1279,21 @@ void simGo (unsigned int gaddr) 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); @@ -734,9 +1304,9 @@ void simGo (unsigned int gaddr) 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 ; } @@ -748,20 +1318,17 @@ void simGo (unsigned int gaddr) /*-----------------------------------------------------------------*/ 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 */ @@ -782,7 +1349,11 @@ static char *preparePrint(char *s, context *cctxt, int *fmt, symbol **sym) 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; @@ -792,6 +1363,8 @@ static char *preparePrint(char *s, context *cctxt, int *fmt, symbol **sym) 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); @@ -858,14 +1431,14 @@ static int cmdDisasm (char *s, context *cctxt, int args) 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); @@ -908,7 +1481,7 @@ static int cmdDisasm (char *s, context *cctxt, int args) 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 ) { @@ -978,38 +1551,33 @@ static int commonSetUserBp(char *s, context *cctxt, char bpType) */ 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))) @@ -1021,17 +1589,17 @@ static int commonSetUserBp(char *s, context *cctxt, char bpType) 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, @@ -1040,89 +1608,89 @@ static int commonSetUserBp(char *s, context *cctxt, char bpType) 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; @@ -1149,21 +1717,17 @@ int cmdSetUserBp (char *s, context *cctxt) /*-----------------------------------------------------------------*/ 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"); @@ -1189,7 +1753,7 @@ int cmdJump (char *s, context *cctxt) 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 && @@ -1200,7 +1764,7 @@ int cmdJump (char *s, context *cctxt) } 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); @@ -1225,7 +1789,7 @@ int cmdJump (char *s, context *cctxt) 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 || @@ -1263,15 +1827,15 @@ int cmdListAsm (char *s, context *cctxt) /*-----------------------------------------------------------------*/ 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) @@ -1300,7 +1864,7 @@ int cmdSetOption (char *s, context *cctxt) 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'); @@ -1321,9 +1885,9 @@ int cmdSetOption (char *s, context *cctxt) /*-----------------------------------------------------------------*/ 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"); @@ -1338,14 +1902,14 @@ int cmdContinue (char *s, context *cctxt) 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."); @@ -1362,14 +1926,14 @@ int cmdIgnore (char *s, context *cctxt) 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 @@ -1385,7 +1949,7 @@ int cmdCommands (char *s, context *cctxt) { int bpnum ; char *cmds,*line; - while (isspace(*s)) s++; + s = trim_left(s); if (!*s ) bpnum = getLastBreakptNumber(); @@ -1395,7 +1959,7 @@ int cmdCommands (char *s, context *cctxt) cmds = NULL; while ((line = getNextCmdLine())) { - while (isspace(*line)) line++; + line = trim_left(line); if (!strncmp(line,"end",3)) break; if (! cmds ) @@ -1418,23 +1982,23 @@ int cmdCommands (char *s, context *cctxt) 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; } @@ -1445,18 +2009,138 @@ int cmdDelUserBp (char *s, context *cctxt) 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 */ /*-----------------------------------------------------------------*/ @@ -1464,79 +2148,10 @@ int cmdStep (char *s, context *cctxt) { 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; } @@ -1545,12 +2160,12 @@ int cmdStep (char *s, context *cctxt) /*-----------------------------------------------------------------*/ 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; } @@ -1566,67 +2181,10 @@ int cmdNext (char *s, context *cctxt) /* 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; } @@ -1636,30 +2194,32 @@ int cmdNext (char *s, context *cctxt) 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; } @@ -1723,9 +2283,7 @@ int cmdListFunctions (char *s, context *cctxt) printf("[functions]\n"); f = setFirstItem(functions); i = 0; - for (;;) { - if (f == NULL) - break; + while (f != NULL) { if (our_verbose) { printf(" %d) sym:%p, fname:%s, modName:%s, mod:%p\n", i, f->sym, f->sym->name, f->modName, f->mod); @@ -1735,7 +2293,7 @@ int cmdListFunctions (char *s, context *cctxt) f->cfpoints, f->afpoints, f->laddr, f->lline); } else { - printf("<%s>", f->modName); + printf("<%s>", f->sym->name); } ++i; f = setNextItem(functions); @@ -1745,7 +2303,7 @@ int cmdListFunctions (char *s, context *cctxt) } /*----------------------------------------------------------------- - cmdListModules - list functions. + cmdListModules - list modules. |-----------------------------------------------------------------*/ int cmdListModules (char *s, context *cctxt) { @@ -1943,17 +2501,17 @@ static void infoRegisters( int all, context *ctxt) 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 ) @@ -1972,7 +2530,7 @@ static void infoRegisters( int all, context *ctxt) 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++ ) @@ -1999,14 +2557,22 @@ static void infoStack(context *ctxt) { 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"); @@ -2017,8 +2583,8 @@ static void infoStack(context *ctxt) /*-----------------------------------------------------------------*/ int cmdWhere(char *s, context *cctxt) { - infoStack(cctxt); - return 0; + infoStack(cctxt); + return 0; } @@ -2028,24 +2594,25 @@ static int infomode = 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) { @@ -2076,7 +2643,7 @@ int cmdInfo (char *s, context *cctxt) } return 0; } - if (strncmp(s,"functions",7) == 0) + if (strcmp(s,"functions") == 0) { function *f; module *m = NULL; @@ -2094,15 +2661,15 @@ int cmdInfo (char *s, context *cctxt) } /* 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 */ @@ -2138,7 +2705,7 @@ int cmdInfo (char *s, context *cctxt) int cmdQuit (char *s, context *cctxt) { if (simactive) - closeSimulator(); + closeSimulator(); return 1; } @@ -2154,7 +2721,7 @@ int cmdListSrc (char *s, context *cctxt) 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 @@ -2165,16 +2732,16 @@ int cmdListSrc (char *s, context *cctxt) 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,','))) { @@ -2185,29 +2752,29 @@ int cmdListSrc (char *s, context *cctxt) 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 */ @@ -2217,24 +2784,24 @@ int cmdListSrc (char *s, context *cctxt) 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' */ @@ -2245,38 +2812,38 @@ int cmdListSrc (char *s, context *cctxt) } } - 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) { @@ -2289,12 +2856,12 @@ int cmdListSrc (char *s, context *cctxt) 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 : "?", @@ -2315,24 +2882,24 @@ int cmdListSrc (char *s, context *cctxt) 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; @@ -2356,11 +2923,11 @@ static unsigned long getValBasic(symbol *sym, link *type, char *val) 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 ) @@ -2389,7 +2956,7 @@ static unsigned long getValBasic(symbol *sym, link *type, char *val) v.i.lo = strtol(val,NULL,0); else v.val = strtol(val,NULL,0); - } + } else v.val = strtol(val,NULL,0); } @@ -2410,9 +2977,9 @@ static void printFmtInteger(char *deffmt,int fmt, long val, }; 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 ) @@ -2427,16 +2994,16 @@ static void printFmtInteger(char *deffmt,int fmt, long val, 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 ) { @@ -2466,9 +3033,9 @@ static void printFmtInteger(char *deffmt,int fmt, long val, buf[--charPos] = '0'; break; } - if (negative) { - buf[--charPos] = '-'; - } + if (negative) { + buf[--charPos] = '-'; + } fputs(&buf[charPos],stdout); } @@ -2492,11 +3059,11 @@ static void printValBasic(symbol *sym, link *type, 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; @@ -2531,11 +3098,11 @@ static void printValBasic(symbol *sym, link *type, 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); } /*-----------------------------------------------------------------*/ @@ -2546,69 +3113,92 @@ static void printValFunc (symbol *sym, int fmt) 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; + } } /*-----------------------------------------------------------------*/ @@ -2620,12 +3210,13 @@ static int printOrSetSymValue (symbol *sym, context *cctxt, { 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) @@ -2665,7 +3256,7 @@ static int printOrSetSymValue (symbol *sym, context *cctxt, while ( *rs ) { - if ( *rs == '[' && IS_ARRAY(type)) + if ( *rs == '[' && (IS_ARRAY(type) || IS_PTR(type))) { s = rs+1; while ( *rs && *rs != ']' ) rs++ ; @@ -2697,17 +3288,19 @@ static int printOrSetSymValue (symbol *sym, context *cctxt, { 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 */ @@ -2730,33 +3323,51 @@ static int printOrSetSymValue (symbol *sym, context *cctxt, 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); @@ -2792,7 +3403,7 @@ static int printOrSetSymValue (symbol *sym, context *cctxt, printValBasic(sym,type,sym->addrspace,addr,size,fmt); } if ( flg > 0 ) fprintf(stdout,"\n"); - return 0; + return 0; } /*-----------------------------------------------------------------*/ @@ -2804,16 +3415,16 @@ static void printStructInfo (structdef *sdef) 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"); @@ -2826,72 +3437,72 @@ static void printStructInfo (structdef *sdef) 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; + } } } @@ -2924,7 +3535,7 @@ int conditionIsTrue( char *s, context *cctxt) } s++ ; } - while (isspace(*s)) *s++ = '\0'; + s = trim_left(s); fmt = printOrSetSymValue(sym,cctxt,0,0,0,rs,s,cmp_char); } Safe_free(dup); @@ -3037,7 +3648,7 @@ int cmdUnDisplay (char *s, context *cctxt) dsymbol *dsym; int dnum; - while (isspace(*s)) s++; + s = trim_left(s); if (!*s) { for (dsym = setFirstItem(dispsymbols); @@ -3072,22 +3683,19 @@ int cmdUnDisplay (char *s, context *cctxt) /*-----------------------------------------------------------------*/ 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; } @@ -3110,88 +3718,83 @@ int cmdClrUserBp (char *s, context *cctxt) */ 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; @@ -3224,7 +3827,7 @@ void setMainContext() !applyToSet(functions,funcWithName,"main",&func)) return; - discoverContext (func->sym->addr, func); + discoverContext (func->sym->addr, func, currCtxt); } function *needExtraMainFunction() @@ -3245,6 +3848,9 @@ static void printFrame() int i; function *func = NULL; function *lastfunc = NULL; + context *ctx, my_context; + unsigned int bp, pc; + int status; if ( currentFrame < 0 ) { @@ -3252,23 +3858,28 @@ static void printFrame() 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); } @@ -3277,14 +3888,14 @@ static void printFrame() /*-----------------------------------------------------------------*/ 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; } /*-----------------------------------------------------------------*/ @@ -3292,14 +3903,14 @@ int cmdUp(char *s, context *cctxt) /*-----------------------------------------------------------------*/ 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 */ @@ -3309,7 +3920,7 @@ int cmdFrame (char *s, context *cctxt) function *func = NULL; int framenr = 0; - while (isspace(*s)) s++; + s = trim_left(s); if ( *s ) currentFrame = strtol(s,0,10); printFrame(); @@ -3321,19 +3932,21 @@ int cmdFrame (char *s, context *cctxt) /*-----------------------------------------------------------------*/ 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); @@ -3349,16 +3962,16 @@ int cmdFinish (char *s, context *ctxt) 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;