fix crash when specifying --source on command line
[rofl0r-gnuboy.git] / debug.c
blobf1092b2ecb160fff1175fc29945c946da4421b36
3 #include <stdlib.h>
4 #include <stdio.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"
13 #include "cpuregs.h"
16 static char *mnemonic_table[256] =
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"
276 static char *cb_mnemonic_table[256] =
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"
536 static byte operand_count[256] =
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
557 /* replace with a real interactive debugger eventually... */
559 int debug_trace = 0;
561 rcvar_t debug_exports[] =
563 RCV_BOOL("trace", &debug_trace, "print debug trace for each CPU insn"),
564 RCV_END
567 void debug_disassemble(addr a, int c)
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;
576 if (!debug_trace) return;
577 while (c > 0)
579 k = 0;
580 opaddr = a;
581 code = ops[k++] = readb(a); a++;
582 if (code != 0xCB)
584 pattern = mnemonic_table[code];
585 if (!pattern)
586 pattern = "***INVALID***";
588 else
590 code = ops[k++] = readb(a); a++;
591 pattern = cb_mnemonic_table[code];
593 i = j = 0;
594 while (pattern[i])
596 if (pattern[i] == '%')
598 switch (pattern[++i])
600 case 'B':
601 case 'b':
602 ops[k] = readb(a); a++;
603 j += sprintf(mnemonic + j,
604 "%02Xh", ops[k++]);
605 break;
606 case 'W':
607 case 'w':
608 ops[k] = readb(a); a++;
609 ops[k+1] = readb(a); a++;
610 j += sprintf(mnemonic + j, "%04Xh",
611 ((ops[k+1] << 8) | ops[k]));
612 k += 2;
613 break;
614 case 'O':
615 case 'o':
616 ops[k] = readb(a); a++;
617 j += sprintf(mnemonic + j, "%+d",
618 (n8)(ops[k++]));
619 break;
621 i++;
623 else
625 mnemonic[j++] = pattern[i++];
628 mnemonic[j] = 0;
629 printf("%04X ", opaddr);
630 switch (operand_count[ops[0]]) {
631 case 1:
632 printf("%02X ", ops[0]);
633 break;
634 case 2:
635 printf("%02X %02X ", ops[0], ops[1]);
636 break;
637 case 3:
638 printf("%02X %02X %02X ", ops[0], ops[1], ops[2]);
639 break;
641 printf("%-16.16s", mnemonic);
642 printf(
643 " SP=%04X.%04X BC=%04X.%02X.%02X DE=%04X.%02X "
644 "HL=%04X.%02X A=%02X F=%02X %c%c%c%c%c",
645 SP, readw(SP),
646 BC, readb(BC), readb(0xFF00 | C),
647 DE, readb(DE),
648 HL, readb(HL), A,
649 F, (IME ? 'I' : '-'),
650 ((F & 0x80) ? 'Z' : '-'),
651 ((F & 0x40) ? 'N' : '-'),
652 ((F & 0x20) ? 'H' : '-'),
653 ((F & 0x10) ? 'C' : '-')
655 printf(
656 " IE=%02X IF=%02X LCDC=%02X STAT=%02X LY=%02X LYC=%02X",
657 R_IE, R_IF, R_LCDC, R_STAT, R_LY, R_LYC
659 printf("\n");
660 fflush(stdout);
661 c--;