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