comparison trace.c @ 28:d34482fd6945

fix ui
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 11 Jul 2018 09:03:54 +0900
parents 7104ad38bed3
children 3c14d647bb51
comparison
equal deleted inserted replaced
27:2d6772a5c076 28:d34482fd6945
74 { 74 {
75 printf( 75 printf(
76 " s [count] one step trace\n" 76 " s [count] one step trace\n"
77 " n step over\n" 77 " n step over\n"
78 " f finish this call (until stack pop)\n" 78 " f finish this call (until stack pop)\n"
79 " b [adr] set break point\n" 79 " b [adr] set break point (on current physical addreaa)\n"
80 " l break point list\n" 80 " l break point list\n"
81 " d [n] delte break point list\n" 81 " d [n] delte break point list\n"
82 " c [count] continue;\n" 82 " c [count] continue;\n"
83 " x [adr] dump\n" 83 " x [adr] [count[ dump\n"
84 #ifdef USE_MMU 84 #ifdef USE_MMU
85 " xp [adr] dump physical memory\n" 85 " xp page [adr] dump physical memory\n"
86 #endif 86 #endif
87 " xi [adr] disassemble\n" 87 " xi [adr] [count[ disassemble\n"
88 " 0 file disk drive 0 image\n" 88 " 0 file disk drive 0 image\n"
89 " 1 file disk drive 1 image\n" 89 " 1 file disk drive 1 image\n"
90 " L file start log to file\n" 90 " L file start log to file\n"
91 " S file set input file\n" 91 " S file set input file\n"
92 " X exit\n" 92 " X exit\n"
102 void setbreak(int adr,int count) ; 102 void setbreak(int adr,int count) ;
103 int nexti(void); 103 int nexti(void);
104 104
105 void do_escape(void) { 105 void do_escape(void) {
106 char s[80]; 106 char s[80];
107 int adr,skip; 107 int adr,page;
108 if (bpskip) { // skip unbreak instruction 108 if (bpskip) { // skip unbreak instruction
109 bpskip--; 109 bpskip--;
110 int ppc = paddr(pcreg,mmu); 110 int ppc = paddr(pcreg,mmu);
111 BPTR *prev = &breakpoint; 111 BPTR *prev = &breakpoint;
112 for(BPTR b = breakpoint; b ; prev=&b->next, b=b->next ) { 112 for(BPTR b = breakpoint; b ; prev=&b->next, b=b->next ) {
141 set_term(escchar); 141 set_term(escchar);
142 return; 142 return;
143 } 143 }
144 restart: 144 restart:
145 printf("v09>"); 145 printf("v09>");
146 fgets(s, 80, stdin); 146 fgets(s, sizeof(s)-1, stdin);
147 if (s[0]) 147 s[strlen(s)-1] = 0; // chop
148 s[strlen(s) - 1] = 0;
149 switch (s[0]) { 148 switch (s[0]) {
149 default:
150 case 'n': // step over 150 case 'n': // step over
151 if (nexti()) { 151 if (nexti()) {
152 bpskip = -1; 152 bpskip = -1;
153 break; 153 break;
154 } 154 }
176 } else { 176 } else {
177 setbreak(pcreg,0); 177 setbreak(pcreg,0);
178 } 178 }
179 bpskip = -1; 179 bpskip = -1;
180 goto restart; 180 goto restart;
181 case 'l': // break point list 181 case 'B': // break point list
182 for(BPTR bp = breakpoint; bp ; bp = bp->next) { 182 for(BPTR bp = breakpoint; bp ; bp = bp->next) {
183 #ifdef USE_MMU 183 #ifdef USE_MMU
184 printf("%x %x %d\n", bp->laddr, bp->address, bp->count); 184 printf("%x %x %d\n", bp->laddr, bp->address, bp->count);
185 #else 185 #else
186 printf("%x %d\n", bp->address, bp->count); 186 printf("%x %d\n", bp->address, bp->count);
207 attention = escape = 1; 207 attention = escape = 1;
208 if (s[1]) { 208 if (s[1]) {
209 bpskip = getarg(s+1,0); 209 bpskip = getarg(s+1,0);
210 } 210 }
211 break; 211 break;
212 case 'x': // dump 212 case 'x': // dump
213 skip = 1; 213 { char *next = s+1;
214 if (s[1]=='i') skip=2; 214 if (s[1]=='i') next=s+2;
215 if (s[1]=='p') skip=2; 215 else if (s[1]=='p') {
216 if (s[skip]) { 216 next = s+2;
217 char *next; 217 if (next[0]) {
218 int adr = getarg(s+skip,&next); 218 page = getarg(next,&next);
219 }
220 }
221 if (next[0]) {
222 int adr = getarg(next,&next);
219 int len = 32; 223 int len = 32;
220 if (next[0]) { 224 if (next[0]) {
221 len = getarg(next,&next); 225 len = getarg(next,&next);
222 } 226 }
223 if (skip==2 && s[1]=='i') { 227 if (s[1]=='i') {
224 Word end = adr + len; 228 Word end = adr + len;
225 while(adr < end) { 229 while(adr < end) {
226 #ifdef USE_MMU 230 #ifdef USE_MMU
227 Byte *phyadr = mem0(phymem,adr,mmu); 231 Byte *phyadr = mem0(phymem,adr,mmu);
228 prog = (char*)phyadr - adr ; 232 prog = (char*)phyadr - adr ;
232 adr = disasm(adr,adr+len); 236 adr = disasm(adr,adr+len);
233 } 237 }
234 } else { 238 } else {
235 #ifdef USE_MMU 239 #ifdef USE_MMU
236 for(int i=0; len > 0 ; i+=16, len-=16) { 240 for(int i=0; len > 0 ; i+=16, len-=16) {
237 if (skip==2 && s[1]=='p') { 241 if (s[1]=='p') {
238 if (adr+i > memsize) goto restart; 242 int phy = page * 0x2000 + adr + i;
239 hexadump(phymem+adr+i,len>16?16:len,adr+i,16); 243 if (phy > rommemsize) goto restart;
244 hexadump(phymem+phy,len>16?16:len,adr+i,16);
240 } else { 245 } else {
241 Byte *phyadr = mem0(phymem,adr+i,mmu); 246 Byte *phyadr = mem0(phymem,adr+i,mmu);
242 if (phyadr > phymem+memsize) goto restart; 247 if (phyadr > phymem+rommemsize) goto restart;
243 hexadump(phyadr,len>16?16:len,adr+i,16); 248 hexadump(phyadr,len>16?16:len,adr+i,16);
244 } 249 }
245 } 250 }
246 #else 251 #else
247 for(int i=0; len > 0 ; i+=16, len-=16) { 252 for(int i=0; len > 0 ; i+=16, len-=16) {
250 #endif 255 #endif
251 } 256 }
252 } else 257 } else
253 disasm(pcreg,pcreg+32); 258 disasm(pcreg,pcreg+32);
254 goto restart; 259 goto restart;
260 }
255 case 'L': 261 case 'L':
256 if (logfile) 262 if (logfile)
257 fclose(logfile); 263 fclose(logfile);
258 logfile = 0; 264 logfile = 0;
259 if (s[1]) { 265 if (s[1]) {
335 case 'R': 341 case 'R':
336 pcreg = (mem[0xfffe] << 8) + mem[0xffff]; 342 pcreg = (mem[0xfffe] << 8) + mem[0xffff];
337 bpskip = 0; 343 bpskip = 0;
338 #ifdef USE_MMU 344 #ifdef USE_MMU
339 mmu = &mem[0xffa0]; 345 mmu = &mem[0xffa0];
346 mem[0xffa7]=0x3f;
340 #endif 347 #endif
341 attention = escape = 1; 348 attention = escape = 1;
342 break; 349 break;
343 } 350 }
344 if (tracing||breakpoint||trskip||bpskip||stkskip) { attention = escape = 1; } 351 if (tracing||breakpoint||trskip||bpskip||stkskip) { attention = escape = 1; }