Mercurial > hg > Members > kono > os9 > sbc09
comparison trace.c @ 21:1925cfa982fe
fixing trace
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 09 Jul 2018 11:25:28 +0900 |
parents | 49fac9474858 |
children | 10e33568b38a |
comparison
equal
deleted
inserted
replaced
20:49fac9474858 | 21:1925cfa982fe |
---|---|
41 extern void restore_term(void) ; | 41 extern void restore_term(void) ; |
42 | 42 |
43 #ifdef USE_MMU | 43 #ifdef USE_MMU |
44 extern char *prog ; // for disass | 44 extern char *prog ; // for disass |
45 extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ; | 45 extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ; |
46 extern int paddr(Word adr, Byte *immu) ; | |
47 #else | |
48 #define paddr(a,m) (a) | |
46 #endif | 49 #endif |
47 | 50 |
48 void do_exit(void) { | 51 void do_exit(void) { |
49 restore_term(); | 52 restore_term(); |
50 exit(0); | 53 exit(0); |
51 } | 54 } |
52 | 55 |
53 | 56 |
54 typedef struct bp { | 57 typedef struct bp { |
55 int address; | 58 int address; // physical address |
59 int laddr; | |
56 int count; | 60 int count; |
57 struct bp *next; | 61 struct bp *next; |
58 } BP, *BPTR; | 62 } BP, *BPTR; |
59 | 63 |
60 BPTR breakpoint = 0; | 64 BPTR breakpoint = 0; |
92 " R do reset\n" | 96 " R do reset\n" |
93 " h,? print this\n" | 97 " h,? print this\n" |
94 ); | 98 ); |
95 } | 99 } |
96 | 100 |
101 | |
102 void setbreak(int adr,int count) ; | |
103 void nexti(void); | |
104 | |
97 void do_escape(void) { | 105 void do_escape(void) { |
98 char s[80]; | 106 char s[80]; |
99 int adr,skip; | 107 int adr,skip; |
100 if (bpskip) { // skip unbreak instruction | 108 if (bpskip) { // skip unbreak instruction |
101 bpskip--; | 109 bpskip--; |
102 for(BPTR b = breakpoint; b ; b=b->next) { | 110 int lpc = paddr(pcreg,mmu); |
103 if (pcreg==b->address) { | 111 BPTR *prev = &breakpoint; |
112 for(BPTR b = breakpoint; b ; b=b->next, prev=prev->next) { | |
113 if (lpc==b->address) { | |
114 if (b->count==-1) { // temporaly break point | |
115 BPTR next = b->next; | |
116 free(b); | |
117 prev->next = next; | |
118 goto restart0; | |
119 } | |
104 if (b->count) b->count--; | 120 if (b->count) b->count--; |
105 if (b->count==0) { | 121 if (b->count==0) { |
106 goto restart0; | 122 goto restart0; |
107 } | 123 } |
108 } | 124 } |
129 printf("v09>"); | 145 printf("v09>"); |
130 fgets(s, 80, stdin); | 146 fgets(s, 80, stdin); |
131 if (s[0]) | 147 if (s[0]) |
132 s[strlen(s) - 1] = 0; | 148 s[strlen(s) - 1] = 0; |
133 switch (s[0]) { | 149 switch (s[0]) { |
150 case 'n': // step over | |
151 if (nexti()) { | |
152 bpskip = -1; | |
153 break; | |
154 } | |
134 case 's': // one step trace | 155 case 's': // one step trace |
135 trskip = 1; | 156 trskip = 1; |
136 if (s[1]) { | 157 if (s[1]) { |
137 trskip = getarg(s+1,0); | 158 trskip = getarg(s+1,0); |
138 } | 159 } |
139 bpskip = 0; | 160 bpskip = 0; |
140 attention = escape = 1; | |
141 break; | |
142 case 'n': // step over | |
143 stkskip = sreg; | |
144 attention = escape = 1; | 161 attention = escape = 1; |
145 break; | 162 break; |
146 case 'f': // finish this call (until stack pop) | 163 case 'f': // finish this call (until stack pop) |
147 stkskip = sreg + 2; | 164 stkskip = sreg + 2; |
148 attention = escape = 1; | 165 attention = escape = 1; |
149 break; | 166 break; |
150 case 'b': // set break point | 167 case 'b': // set break point |
151 { | 168 if (s[1]) { |
152 BPTR bp = calloc(1,sizeof(BP)); | 169 char *next; |
153 bp->next = breakpoint; | 170 int count = 0; |
154 breakpoint = bp; | 171 int adr = getarg(s+0,&next); |
155 bp->count = 1; | 172 if (next[0]) { |
156 if (s[1]) { | 173 count = getarg(next,&next); |
157 char *next; | 174 } |
158 bp->address = getarg(s+1,&next); | 175 setbreak(adr,count); |
159 if (next[0]) { | 176 } else { |
160 bp->count = getarg(next,&next); | 177 setbreak(pcreg,0); |
161 } | |
162 } else { | |
163 bp->address = pcreg; | |
164 } | |
165 } | 178 } |
166 bpskip = -1; | 179 bpskip = -1; |
167 goto restart; | 180 goto restart; |
168 case 'l': // break point list | 181 case 'l': // break point list |
169 for(BPTR bp = breakpoint; bp ; bp = bp->next) { | 182 for(BPTR bp = breakpoint; bp ; bp = bp->next) { |
170 printf("%x %i\n", bp->address, bp->count); | 183 #ifdef USE_MMU |
184 printf("%x %x %d\n", bp->laddr, bp->address, bp->count); | |
185 #else | |
186 printf("%x %d\n", bp->address, bp->count); | |
187 #endif | |
171 } | 188 } |
172 goto restart; | 189 goto restart; |
173 case 'd': // delte break point list | 190 case 'd': // delte break point list |
174 if (s[1]) { | 191 if (s[1]) { |
175 int trskip = getarg(s+1,0); | 192 int trskip = getarg(s+1,0); |
176 BPTR *prev = &breakpoint; | 193 BPTR *prev = &breakpoint; |
177 for(BPTR bp = breakpoint; bp ; bp = bp->next) { | 194 for(BPTR bp = breakpoint; bp ; bp = bp->next) { |
178 if (trskip-- == 0) { | 195 if (trskip-- == 0) { |
179 if (bp) { | 196 BPTR next = b->next; |
180 *prev = bp->next; | 197 free(bp); |
181 } | 198 prev->next = next; |
182 break; | 199 break; |
183 } | 200 } |
184 prev = &bp->next; | 201 prev = &bp->next; |
185 } | 202 } |
186 } | 203 } |
324 if (tracing||breakpoint||trskip||bpskip||stkskip) { attention = escape = 1; } | 341 if (tracing||breakpoint||trskip||bpskip||stkskip) { attention = escape = 1; } |
325 else attention = 0; | 342 else attention = 0; |
326 set_term(escchar); | 343 set_term(escchar); |
327 } | 344 } |
328 | 345 |
346 void setbreak(int adr, int count) { | |
347 BPTR bp = calloc(1,sizeof(BP)); | |
348 bp->next = breakpoint; | |
349 breakpoint = bp; | |
350 bp->count = count; | |
351 if (s[1]) { | |
352 char *next; | |
353 bp->laddr = getarg(s+0,&next); | |
354 bp->address = paddr((bp->laddr,&next),mmu); | |
355 if (next[0]) { | |
356 bp->count = getarg(next,&next); | |
357 } | |
358 } else { | |
359 bp->laddr = pcreg; | |
360 bp->address = paddr(pcreg,mmu); | |
361 } | |
362 } | |
363 | |
364 int nexti(void) { | |
365 int op1 = phymem[mem1(pcreg)]; | |
366 int ofs = 0; | |
367 switch(op1) { | |
368 case 0x17: // LBSR | |
369 case 0xbd: // JSR extended | |
370 ofs=3; beak; | |
371 case 0x10: // page2 | |
372 { | |
373 int op2 = phymem[mem1(pcreg+1)]; | |
374 if (op2==0x3f) { // os9 system call | |
375 ofs=3; beak; | |
376 } | |
377 } | |
378 case 0x11: // page3 | |
379 { | |
380 int op2 = phymem[mem1(pcreg+1)]; | |
381 if (op2==0x3f) { // SWI3 | |
382 ofs=2; beak; | |
383 } | |
384 } | |
385 case 0x3f: // SWI | |
386 ofs=1; beak; | |
387 case 0x3c: // CWAI | |
388 case 0x8d: // BSR | |
389 case 0x9d: // JSR direct | |
390 ofs=2; beak; | |
391 case 0xad: // JSR index | |
392 { | |
393 int op2 = phymem[mem1(pcreg+1)]; | |
394 if (op2<0x80) ofs = 2; // 5bit ofs | |
395 else switch (op2&0xf) { | |
396 case 8: case 0xc: | |
397 ofs = 3; break; | |
398 case 9: case 0xd: case 0xf: | |
399 ofs = 4; break; | |
400 default: | |
401 ofs = 2; break; | |
402 } | |
403 } | |
404 break; | |
405 } | |
406 if (ofs) setbreak(pc+ofs,-1); | |
407 retrun ofs; | |
408 } | |
409 | |
410 | |
411 | |
412 | |
413 | |
414 | |
415 | |
416 |