Mercurial > hg > Members > kono > os9 > sbc09
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; } |