Mercurial > hg > Members > kono > os9 > sbc09
changeset 64:41f14f365b34
add trace command
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 26 Jul 2018 19:55:29 +0900 |
parents | 1887f7098f15 |
children | 9779a34e1a92 |
files | src/trace.c src/v09.c |
diffstat | 2 files changed, 96 insertions(+), 48 deletions(-) [+] |
line wrap: on
line diff
--- a/src/trace.c Wed Jul 25 22:46:39 2018 +0900 +++ b/src/trace.c Thu Jul 26 19:55:29 2018 +0900 @@ -68,21 +68,42 @@ int trskip = 0; int stkskip = 0; +int getterm(char *buf, char** next) { + int value = 0; + while (*buf==' ') buf++; + if (*buf=='x') { value = xreg; buf++; *next = buf ; + } else if (*buf=='y') { value = yreg; buf++; *next = buf; + } else if (*buf=='u') { value = ureg; buf++; *next = buf; + } else if (*buf=='s') { value = sreg; buf++; *next = buf; + } else if (*buf=='p') { value = pcreg; buf++; *next = buf; + } else if (*buf=='d') { value = (*areg<<8)+*breg; buf++; *next = buf; + } else if (*buf=='a') { value = *areg; buf++; *next = buf; + } else if (*buf=='b') { value = *breg; buf++; *next = buf; + } else value = strtol(buf,next,0); + return value; +} + int getarg(char *buf, char** next) { - int value = strtol(buf,next,0); - for(;next;) { + int value = 0; + char *b = buf; + if (next==0) next = &b; + value=getterm(*next,next); + for(;**next;) { if ( **next == '+' ) { - value += strtol(*next+1,next,0); + value += getterm(*next+1,next); } else if ( **next == '*' ) { - value *= strtol(*next+1,next,0); + value *= getterm(*next+1,next); } else if ( **next == '/' ) { - value /= strtol(*next+1,next,0); + value /= getterm(*next+1,next); } else if ( **next == '-' ) { - value -= strtol(*next+1,next,0); + value -= getterm(*next+1,next); } else if ( **next == '&' ) { - value &= strtol(*next+1,next,0); + value &= getterm(*next+1,next); } else if ( **next == '|' ) { - value |= strtol(*next+1,next,0); + value |= getterm(*next+1,next); + } else if ( **next == '(' ) { + value = getarg(*next+1,next); + if(**next==')') *next=*next+1; } else break; } return value; @@ -91,6 +112,7 @@ void printhelp(void) { printf( + "use 0x for hex inputs\n" " s [count] one step trace\n" " n step over\n" " f finish this call (until stack pop)\n" @@ -98,11 +120,13 @@ " B break point list\n" " d [n] delte break point list\n" " c [count] continue;\n" + " p data print\n" " x [adr] [count] dump\n" + " xi [adr] [count] disassemble\n" #ifdef USE_MMU - " xp page [adr] dump physical memory\n" + " x [p page] [offset] [count] dump physical memory\n" + " xi [p page] [offset] [count] disassemble\n" #endif - " xi [adr] [count] disassemble\n" " 0 file disk drive 0 image\n" " 1 file disk drive 1 image\n" " L file start log to file\n" @@ -178,6 +202,11 @@ fgets(s, sizeof(s)-1, stdin); s[strlen(s)-1] = 0; // chop switch (s[0]) { + case 'p': { + int d = getarg(s+1,0); + printf("0x%x %d '%c'\n",d,d,(d<' '||d>0x7f)?' ':d); + goto restart; + } case 'n': // step over if (nexti()) { bpskip = -1; @@ -244,52 +273,51 @@ * we should have disassembler for a mmu page */ case 'x': // dump - { char *next = s+1; - if (s[1]=='i') next=s+2; - else if (s[1]=='p') { - next = s+2; + { char d = 0; + char p = 0; + char *next = s+1; + int len = 32; + int adr = pcreg; + if (*next=='i') { next++; d='i'; + } + if (*next=='p') { + p = 'p'; + next++; if (next[0]) { page = getarg(next,&next); } } if (next[0]) { - int adr = getarg(next,&next); - int len = 32; - if (next[0]) { - len = getarg(next,&next); - } - if (s[1]=='i') { - Word end = adr + len; - while(adr < end) { + adr = getarg(next,&next); #ifdef USE_MMU - Byte *phyadr = mem0(phymem,adr,mmu); - prog = (char*)phyadr - adr ; - if (phyadr > phymem+memsize) goto restart; + adr -= adr &0xf; + if (p=='p') adr -= adr&0x1fff; #endif - int len = adr+16<end? 16 : end-adr -1 ; - adr = disasm(adr,adr+len); - } - } else { + if (next[0]) { + len = getarg(next,&next); + } + } + for(; len > 0 ; len-=16,adr+=16) { + Byte *phyadr = 0; #ifdef USE_MMU - for(int i=0; len > 0 ; i+=16, len-=16) { - if (s[1]=='p') { - int phy = page * 0x2000 + adr + i; - if (phy > rommemsize) goto restart; - hexadump(phymem+phy,len>16?16:len,adr+i,16); - } else { - Byte *phyadr = mem0(phymem,adr+i,mmu); - if (phyadr > phymem+rommemsize) goto restart; - hexadump(phyadr,len>16?16:len,adr+i,16); - } - } + if (p=='p') { + phyadr = phymem + (page * 0x2000 + adr); + prog = (char*)phyadr - adr ; + } else { + phyadr = mem0(phymem,adr,mmu); + prog = (char*)phyadr - adr ; + } + if (phyadr > phymem+memsize) goto restart; #else - for(int i=0; len > 0 ; i+=16, len-=16) { - hexadump(mem+adr+i,len>16?16:len,adr+i,16); - } + phyadr = mem+adr; + if (phyadr > mem+0xffff) goto restart; #endif - } - } else - disasm(pcreg,pcreg+32); + if (d=='i') { + adr = disasm(adr,adr+(len>16?16:len)); + } else { + hexadump(phyadr,len>16?16:len,adr,16); + } + } goto restart; } case 'L': @@ -300,6 +328,7 @@ int i=1; while(s[i]==' ') i++; logfile = fopen(s + i, "w"); } + goto restart; break; case 'S': if (infile) @@ -309,6 +338,7 @@ int i=1; while(s[i]==' ') i++; infile = fopen(s + i, "r"); } + goto restart; break; case 'h': case '?': @@ -323,6 +353,7 @@ fclose(xfile); xfile = 0; } + goto restart; break; case '0': case '1': @@ -336,6 +367,7 @@ if ( *drv == 0 ) { printf("can't open %s\n", &s[i]); } } } + goto restart; break; case 'U': if (xfile) @@ -354,6 +386,7 @@ acknak = 21; rcvdnak = EOF; blocknum = 1; + goto restart; break; case 'D': if (xfile) @@ -371,6 +404,7 @@ xidx = 0; acknak = 21; blocknum = 1; + goto restart; break; case 'R': pcreg = (mem[0xfffe] << 8) + mem[0xffff]; @@ -382,6 +416,7 @@ attention = escape = 1; // we have to reload romfile // readimage(); + goto restart; break; default: // one step trace trskip = 1; @@ -412,9 +447,9 @@ } /* - * length call instruction + * length of call instruction * - * if call instruction, put temporary break on next instruction + * if next instruction is call or swi, put temporary break after the call instruction * (ignoring page boundary, sorry) */ int nexti(void) {
--- a/src/v09.c Wed Jul 25 22:46:39 2018 +0900 +++ b/src/v09.c Thu Jul 26 19:55:29 2018 +0900 @@ -44,6 +44,10 @@ extern void disasm(int,int); extern void do_mmu(Word,Byte); extern void init_term(void) ; +#ifdef USE_VDISK +extern int setVdisk(int drv,char *name) ; +#endif + void do_trace(FILE *tracefile) @@ -131,6 +135,10 @@ void usage(void) { fprintf(stderr,"Usage: v09 [-rom rom-image] [-l romstart] [-t tracefile [-tl addr] [-nt]" + "[-[01] disk-image ] " +#ifdef USE_VDISK + "[v vdisk-base-dir ] " +#endif "[-th addr] ]\n[-e escchar] \n"); exit(1); } @@ -168,6 +176,11 @@ } else if (strcmp(argv[i],"-1")==0) { i++; disk[1] = fopen(argv[i],"r+"); +#ifdef USE_VDISK + } else if (strcmp(argv[i],"-v")==0) { + i++; + setVdisk(0,argv[i]); +#endif } else if (strcmp(argv[i],"-tl")==0) { i++; tracelo=strtol(argv[i],(char**)0,0);