summaryrefslogtreecommitdiff
path: root/apps/plugins/rockboy/debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/rockboy/debug.c')
-rw-r--r--apps/plugins/rockboy/debug.c699
1 files changed, 699 insertions, 0 deletions
diff --git a/apps/plugins/rockboy/debug.c b/apps/plugins/rockboy/debug.c
new file mode 100644
index 0000000000..d0e106ba94
--- /dev/null
+++ b/apps/plugins/rockboy/debug.c
@@ -0,0 +1,699 @@
1
2
3#include <stdio.h>
4
5#include "rockmacros.h"
6#include "defs.h"
7#include "cpu.h"
8#include "mem.h"
9#include "fastmem.h"
10#include "regs.h"
11#include "rc.h"
12
13#include "cpuregs.h"
14
15
16static char *mnemonic_table[256] =
17{
18 "NOP",
19 "LD BC,%w",
20 "LD (BC),A",
21 "INC BC",
22 "INC B",
23 "DEC B",
24 "LD B,%b",
25 "RLCA",
26 "LD (%w),SP",
27 "ADD HL,BC",
28 "LD A,(BC)",
29 "DEC BC",
30 "INC C",
31 "DEC C",
32 "LD C,%b",
33 "RRCA",
34 "STOP",
35 "LD DE,%w",
36 "LD (DE),A",
37 "INC DE",
38 "INC D",
39 "DEC D",
40 "LD D,%b",
41 "RLA",
42 "JR %o",
43 "ADD HL,DE",
44 "LD A,(DE)",
45 "DEC DE",
46 "INC E",
47 "DEC E",
48 "LD E,%b",
49 "RRA",
50 "JR NZ,%o",
51 "LD HL,%w",
52 "LD (HLI),A",
53 "INC HL",
54 "INC H",
55 "DEC H",
56 "LD H,%b",
57 "DAA",
58 "JR Z,%o",
59 "ADD HL,HL",
60 "LD A,(HLI)",
61 "DEC HL",
62 "INC L",
63 "DEC L",
64 "LD L,%b",
65 "CPL",
66 "JR NC,%o",
67 "LD SP,%w",
68 "LD (HLD),A",
69 "INC SP",
70 "INC (HL)",
71 "DEC (HL)",
72 "LD (HL),%b",
73 "SCF",
74 "JR C,%o",
75 "ADD HL,SP",
76 "LD A,(HLD)",
77 "DEC SP",
78 "INC A",
79 "DEC A",
80 "LD A,%b",
81 "CCF",
82 "LD B,B",
83 "LD B,C",
84 "LD B,D",
85 "LD B,E",
86 "LD B,H",
87 "LD B,L",
88 "LD B,(HL)",
89 "LD B,A",
90 "LD C,B",
91 "LD C,C",
92 "LD C,D",
93 "LD C,E",
94 "LD C,H",
95 "LD C,L",
96 "LD C,(HL)",
97 "LD C,A",
98 "LD D,B",
99 "LD D,C",
100 "LD D,D",
101 "LD D,E",
102 "LD D,H",
103 "LD D,L",
104 "LD D,(HL)",
105 "LD D,A",
106 "LD E,B",
107 "LD E,C",
108 "LD E,D",
109 "LD E,E",
110 "LD E,H",
111 "LD E,L",
112 "LD E,(HL)",
113 "LD E,A",
114 "LD H,B",
115 "LD H,C",
116 "LD H,D",
117 "LD H,E",
118 "LD H,H",
119 "LD H,L",
120 "LD H,(HL)",
121 "LD H,A",
122 "LD L,B",
123 "LD L,C",
124 "LD L,D",
125 "LD L,E",
126 "LD L,H",
127 "LD L,L",
128 "LD L,(HL)",
129 "LD L,A",
130 "LD (HL),B",
131 "LD (HL),C",
132 "LD (HL),D",
133 "LD (HL),E",
134 "LD (HL),H",
135 "LD (HL),L",
136 "HALT",
137 "LD (HL),A",
138 "LD A,B",
139 "LD A,C",
140 "LD A,D",
141 "LD A,E",
142 "LD A,H",
143 "LD A,L",
144 "LD A,(HL)",
145 "LD A,A",
146 "ADD A,B",
147 "ADD A,C",
148 "ADD A,D",
149 "ADD A,E",
150 "ADD A,H",
151 "ADD A,L",
152 "ADD A,(HL)",
153 "ADD A,A",
154 "ADC A,B",
155 "ADC A,C",
156 "ADC A,D",
157 "ADC A,E",
158 "ADC A,H",
159 "ADC A,L",
160 "ADC A,(HL)",
161 "ADC A",
162 "SUB B",
163 "SUB C",
164 "SUB D",
165 "SUB E",
166 "SUB H",
167 "SUB L",
168 "SUB (HL)",
169 "SUB A",
170 "SBC A,B",
171 "SBC A,C",
172 "SBC A,D",
173 "SBC A,E",
174 "SBC A,H",
175 "SBC A,L",
176 "SBC A,(HL)",
177 "SBC A,A",
178 "AND B",
179 "AND C",
180 "AND D",
181 "AND E",
182 "AND H",
183 "AND L",
184 "AND (HL)",
185 "AND A",
186 "XOR B",
187 "XOR C",
188 "XOR D",
189 "XOR E",
190 "XOR H",
191 "XOR L",
192 "XOR (HL)",
193 "XOR A",
194 "OR B",
195 "OR C",
196 "OR D",
197 "OR E",
198 "OR H",
199 "OR L",
200 "OR (HL)",
201 "OR A",
202 "CP B",
203 "CP C",
204 "CP D",
205 "CP E",
206 "CP H",
207 "CP L",
208 "CP (HL)",
209 "CP A",
210 "RET NZ",
211 "POP BC",
212 "JP NZ,%w",
213 "JP %w",
214 "CALL NZ,%w",
215 "PUSH BC",
216 "ADD A,%b",
217 "RST 0h",
218 "RET Z",
219 "RET",
220 "JP Z,%w",
221 NULL,
222 "CALL Z,%w",
223 "CALL %w",
224 "ADC A,%b",
225 "RST 8h",
226 "RET NC",
227 "POP DE",
228 "JP NC,%w",
229 NULL,
230 "CALL NC,%w",
231 "PUSH DE",
232 "SUB %b",
233 "RST 10h",
234 "RET C",
235 "RETI",
236 "JP C,%w",
237 NULL,
238 "CALL C,%w",
239 NULL,
240 "SBC A,%b",
241 "RST 18h",
242 "LD (FF00+%b),A",
243 "POP HL",
244 "LD (FF00+C),A",
245 NULL,
246 NULL,
247 "PUSH HL",
248 "AND %b",
249 "RST 20h",
250 "ADD SP,%o",
251 "JP HL",
252 "LD (%w),A",
253 NULL,
254 NULL,
255 NULL,
256 "XOR %b",
257 "RST 28h",
258 "LD A,(FF00+%b)",
259 "POP AF",
260 "LD A,(FF00+C)",
261 "DI",
262 NULL,
263 "PUSH AF",
264 "OR %b",
265 "RST 30h",
266 "LD HL,SP%o",
267 "LD SP,HL",
268 "LD A,(%w)",
269 "EI",
270 NULL,
271 NULL,
272 "CP %b",
273 "RST 38h"
274};
275
276static char *cb_mnemonic_table[256] =
277{
278 "RLC B",
279 "RLC C",
280 "RLC D",
281 "RLC E",
282 "RLC H",
283 "RLC L",
284 "RLC (HL)",
285 "RLC A",
286 "RRC B",
287 "RRC C",
288 "RRC D",
289 "RRC E",
290 "RRC H",
291 "RRC L",
292 "RRC (HL)",
293 "RRC A",
294 "RL B",
295 "RL C",
296 "RL D",
297 "RL E",
298 "RL H",
299 "RL L",
300 "RL (HL)",
301 "RL A",
302 "RR B",
303 "RR C",
304 "RR D",
305 "RR E",
306 "RR H",
307 "RR L",
308 "RR (HL)",
309 "RR A",
310 "SLA B",
311 "SLA C",
312 "SLA D",
313 "SLA E",
314 "SLA H",
315 "SLA L",
316 "SLA (HL)",
317 "SLA A",
318 "SRA B",
319 "SRA C",
320 "SRA D",
321 "SRA E",
322 "SRA H",
323 "SRA L",
324 "SRA (HL)",
325 "SRA A",
326 "SWAP B",
327 "SWAP C",
328 "SWAP D",
329 "SWAP E",
330 "SWAP H",
331 "SWAP L",
332 "SWAP (HL)",
333 "SWAP A",
334 "SRL B",
335 "SRL C",
336 "SRL D",
337 "SRL E",
338 "SRL H",
339 "SRL L",
340 "SRL (HL)",
341 "SRL A",
342 "BIT 0,B",
343 "BIT 0,C",
344 "BIT 0,D",
345 "BIT 0,E",
346 "BIT 0,H",
347 "BIT 0,L",
348 "BIT 0,(HL)",
349 "BIT 0,A",
350 "BIT 1,B",
351 "BIT 1,C",
352 "BIT 1,D",
353 "BIT 1,E",
354 "BIT 1,H",
355 "BIT 1,L",
356 "BIT 1,(HL)",
357 "BIT 1,A",
358 "BIT 2,B",
359 "BIT 2,C",
360 "BIT 2,D",
361 "BIT 2,E",
362 "BIT 2,H",
363 "BIT 2,L",
364 "BIT 2,(HL)",
365 "BIT 2,A",
366 "BIT 3,B",
367 "BIT 3,C",
368 "BIT 3,D",
369 "BIT 3,E",
370 "BIT 3,H",
371 "BIT 3,L",
372 "BIT 3,(HL)",
373 "BIT 3,A",
374 "BIT 4,B",
375 "BIT 4,C",
376 "BIT 4,D",
377 "BIT 4,E",
378 "BIT 4,H",
379 "BIT 4,L",
380 "BIT 4,(HL)",
381 "BIT 4,A",
382 "BIT 5,B",
383 "BIT 5,C",
384 "BIT 5,D",
385 "BIT 5,E",
386 "BIT 5,H",
387 "BIT 5,L",
388 "BIT 5,(HL)",
389 "BIT 5,A",
390 "BIT 6,B",
391 "BIT 6,C",
392 "BIT 6,D",
393 "BIT 6,E",
394 "BIT 6,H",
395 "BIT 6,L",
396 "BIT 6,(HL)",
397 "BIT 6,A",
398 "BIT 7,B",
399 "BIT 7,C",
400 "BIT 7,D",
401 "BIT 7,E",
402 "BIT 7,H",
403 "BIT 7,L",
404 "BIT 7,(HL)",
405 "BIT 7,A",
406 "RES 0,B",
407 "RES 0,C",
408 "RES 0,D",
409 "RES 0,E",
410 "RES 0,H",
411 "RES 0,L",
412 "RES 0,(HL)",
413 "RES 0,A",
414 "RES 1,B",
415 "RES 1,C",
416 "RES 1,D",
417 "RES 1,E",
418 "RES 1,H",
419 "RES 1,L",
420 "RES 1,(HL)",
421 "RES 1,A",
422 "RES 2,B",
423 "RES 2,C",
424 "RES 2,D",
425 "RES 2,E",
426 "RES 2,H",
427 "RES 2,L",
428 "RES 2,(HL)",
429 "RES 2,A",
430 "RES 3,B",
431 "RES 3,C",
432 "RES 3,D",
433 "RES 3,E",
434 "RES 3,H",
435 "RES 3,L",
436 "RES 3,(HL)",
437 "RES 3,A",
438 "RES 4,B",
439 "RES 4,C",
440 "RES 4,D",
441 "RES 4,E",
442 "RES 4,H",
443 "RES 4,L",
444 "RES 4,(HL)",
445 "RES 4,A",
446 "RES 5,B",
447 "RES 5,C",
448 "RES 5,D",
449 "RES 5,E",
450 "RES 5,H",
451 "RES 5,L",
452 "RES 5,(HL)",
453 "RES 5,A",
454 "RES 6,B",
455 "RES 6,C",
456 "RES 6,D",
457 "RES 6,E",
458 "RES 6,H",
459 "RES 6,L",
460 "RES 6,(HL)",
461 "RES 6,A",
462 "RES 7,B",
463 "RES 7,C",
464 "RES 7,D",
465 "RES 7,E",
466 "RES 7,H",
467 "RES 7,L",
468 "RES 7,(HL)",
469 "RES 7,A",
470 "SET 0,B",
471 "SET 0,C",
472 "SET 0,D",
473 "SET 0,E",
474 "SET 0,H",
475 "SET 0,L",
476 "SET 0,(HL)",
477 "SET 0,A",
478 "SET 1,B",
479 "SET 1,C",
480 "SET 1,D",
481 "SET 1,E",
482 "SET 1,H",
483 "SET 1,L",
484 "SET 1,(HL)",
485 "SET 1,A",
486 "SET 2,B",
487 "SET 2,C",
488 "SET 2,D",
489 "SET 2,E",
490 "SET 2,H",
491 "SET 2,L",
492 "SET 2,(HL)",
493 "SET 2,A",
494 "SET 3,B",
495 "SET 3,C",
496 "SET 3,D",
497 "SET 3,E",
498 "SET 3,H",
499 "SET 3,L",
500 "SET 3,(HL)",
501 "SET 3,A",
502 "SET 4,B",
503 "SET 4,C",
504 "SET 4,D",
505 "SET 4,E",
506 "SET 4,H",
507 "SET 4,L",
508 "SET 4,(HL)",
509 "SET 4,A",
510 "SET 5,B",
511 "SET 5,C",
512 "SET 5,D",
513 "SET 5,E",
514 "SET 5,H",
515 "SET 5,L",
516 "SET 5,(HL)",
517 "SET 5,A",
518 "SET 6,B",
519 "SET 6,C",
520 "SET 6,D",
521 "SET 6,E",
522 "SET 6,H",
523 "SET 6,L",
524 "SET 6,(HL)",
525 "SET 6,A",
526 "SET 7,B",
527 "SET 7,C",
528 "SET 7,D",
529 "SET 7,E",
530 "SET 7,H",
531 "SET 7,L",
532 "SET 7,(HL)",
533 "SET 7,A"
534};
535
536static byte operand_count[256] =
537{
538 1, 3, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 2, 1,
539 1, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1,
540 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1,
541 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1,
542 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
543 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
544 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
545 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
546 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
547 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
548 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
549 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
550 1, 1, 3, 3, 3, 1, 2, 1, 1, 1, 3, 2, 3, 3, 2, 1,
551 1, 1, 3, 1, 3, 1, 2, 1, 1, 1, 3, 1, 3, 1, 2, 1,
552 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1,
553 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1
554};
555
556
557/* replace with a real interactive debugger eventually... */
558
559int debug_trace = 0;
560
561rcvar_t debug_exports[] =
562{
563 RCV_BOOL("trace", &debug_trace),
564 RCV_END
565};
566
567void debug_disassemble(addr a, int c)
568{
569 static int i, j, k;
570 static byte code;
571 static byte ops[3];
572 static int opaddr;
573 static char mnemonic[256];
574 static char *pattern;
575 char meow[500],buf[300];
576// int fd;
577 if(!debug_trace) return;
578// fd=open("/rockboy.trace",O_WRONLY|O_APPEND);
579// if(fd<0)
580// return;
581
582 while (c > 0)
583 {
584 k = 0;
585 opaddr = a;
586 code = ops[k++] = readb(a); a++;
587 if (code != 0xCB)
588 {
589 pattern = mnemonic_table[code];
590 if (!pattern)
591 pattern = "***INVALID***";
592 }
593 else
594 {
595 code = ops[k++] = readb(a); a++;
596 pattern = cb_mnemonic_table[code];
597 }
598 i = j = 0;
599 while (pattern[i])
600 {
601 if (pattern[i] == '%')
602 {
603 switch (pattern[++i])
604 {
605 case 'B':
606 case 'b':
607 ops[k] = readb(a); a++;
608 j += snprintf(mnemonic + j,255-j,
609 "%02Xh", ops[k++]);
610 break;
611 case 'W':
612 case 'w':
613 ops[k] = readb(a); a++;
614 ops[k+1] = readb(a); a++;
615 j += snprintf(mnemonic + j, 255-j,"%04Xh",
616 ((ops[k+1] << 8) | ops[k]));
617 k += 2;
618 break;
619 case 'O':
620 case 'o':
621 ops[k] = readb(a); a++;
622 j += snprintf(mnemonic + j, 255-j,"%+d",
623 (n8)(ops[k++]));
624 break;
625 }
626 i++;
627 }
628 else
629 {
630 mnemonic[j++] = pattern[i++];
631 }
632 }
633 mnemonic[j] = 0;
634 snprintf(buf,299,"%04X ", opaddr);
635 strcpy(meow,buf);
636 switch (operand_count[ops[0]]) {
637 case 1:
638 snprintf(buf,299,"%02X ", ops[0]);
639 strcat(meow,buf);
640 break;
641 case 2:
642 snprintf(buf,299,"%02X %02X ", ops[0], ops[1]);
643 strcat(meow,buf);
644 break;
645 case 3:
646 snprintf(buf,299,"%02X %02X %02X ", ops[0], ops[1], ops[2]);
647 strcat(meow,buf);
648 break;
649 }
650 snprintf(buf,"%-16.16s", mnemonic);
651 strcat(meow,buf);
652 rb->lcd_putsxy(0,0,meow);
653 rb->lcd_update();
654/* fprintf(fd,
655 " SP=%04X.%04X BC=%04X.%02X.%02X DE=%04X.%02X "
656 "HL=%04X.%02X A=%02X F=%02X %c%c%c%c%c",
657 SP, readw(SP),
658 BC, readb(BC), readb(0xFF00 | C),
659 DE, readb(DE),
660 HL, readb(HL), A,
661 F, (IME ? 'I' : '-'),
662 ((F & 0x80) ? 'Z' : '-'),
663 ((F & 0x40) ? 'N' : '-'),
664 ((F & 0x20) ? 'H' : '-'),
665 ((F & 0x10) ? 'C' : '-')
666 );
667 fprintf(fd,
668 " IE=%02X IF=%02X LCDC=%02X STAT=%02X LY=%02X LYC=%02X",
669 R_IE, R_IF, R_LCDC, R_STAT, R_LY, R_LYC
670 );*/
671 c--;
672 }
673}
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699