Bump version numbers for 3.13
[maemo-rb.git] / apps / plugins / rockboy / debug.c
blob8dc7320035a8233ea3d73da5ba2cb54609df0238
3 #include <stdio.h>
5 #include "rockmacros.h"
6 #include "defs.h"
7 #include "cpu-gb.h"
8 #include "mem.h"
9 #include "fastmem.h"
10 #include "regs.h"
12 #include "cpuregs.h"
15 static char *mnemonic_table[256] =
17 "NOP",
18 "LD BC,%w",
19 "LD (BC),A",
20 "INC BC",
21 "INC B",
22 "DEC B",
23 "LD B,%b",
24 "RLCA",
25 "LD (%w),SP",
26 "ADD HL,BC",
27 "LD A,(BC)",
28 "DEC BC",
29 "INC C",
30 "DEC C",
31 "LD C,%b",
32 "RRCA",
33 "STOP",
34 "LD DE,%w",
35 "LD (DE),A",
36 "INC DE",
37 "INC D",
38 "DEC D",
39 "LD D,%b",
40 "RLA",
41 "JR %o",
42 "ADD HL,DE",
43 "LD A,(DE)",
44 "DEC DE",
45 "INC E",
46 "DEC E",
47 "LD E,%b",
48 "RRA",
49 "JR NZ,%o",
50 "LD HL,%w",
51 "LD (HLI),A",
52 "INC HL",
53 "INC H",
54 "DEC H",
55 "LD H,%b",
56 "DAA",
57 "JR Z,%o",
58 "ADD HL,HL",
59 "LD A,(HLI)",
60 "DEC HL",
61 "INC L",
62 "DEC L",
63 "LD L,%b",
64 "CPL",
65 "JR NC,%o",
66 "LD SP,%w",
67 "LD (HLD),A",
68 "INC SP",
69 "INC (HL)",
70 "DEC (HL)",
71 "LD (HL),%b",
72 "SCF",
73 "JR C,%o",
74 "ADD HL,SP",
75 "LD A,(HLD)",
76 "DEC SP",
77 "INC A",
78 "DEC A",
79 "LD A,%b",
80 "CCF",
81 "LD B,B",
82 "LD B,C",
83 "LD B,D",
84 "LD B,E",
85 "LD B,H",
86 "LD B,L",
87 "LD B,(HL)",
88 "LD B,A",
89 "LD C,B",
90 "LD C,C",
91 "LD C,D",
92 "LD C,E",
93 "LD C,H",
94 "LD C,L",
95 "LD C,(HL)",
96 "LD C,A",
97 "LD D,B",
98 "LD D,C",
99 "LD D,D",
100 "LD D,E",
101 "LD D,H",
102 "LD D,L",
103 "LD D,(HL)",
104 "LD D,A",
105 "LD E,B",
106 "LD E,C",
107 "LD E,D",
108 "LD E,E",
109 "LD E,H",
110 "LD E,L",
111 "LD E,(HL)",
112 "LD E,A",
113 "LD H,B",
114 "LD H,C",
115 "LD H,D",
116 "LD H,E",
117 "LD H,H",
118 "LD H,L",
119 "LD H,(HL)",
120 "LD H,A",
121 "LD L,B",
122 "LD L,C",
123 "LD L,D",
124 "LD L,E",
125 "LD L,H",
126 "LD L,L",
127 "LD L,(HL)",
128 "LD L,A",
129 "LD (HL),B",
130 "LD (HL),C",
131 "LD (HL),D",
132 "LD (HL),E",
133 "LD (HL),H",
134 "LD (HL),L",
135 "HALT",
136 "LD (HL),A",
137 "LD A,B",
138 "LD A,C",
139 "LD A,D",
140 "LD A,E",
141 "LD A,H",
142 "LD A,L",
143 "LD A,(HL)",
144 "LD A,A",
145 "ADD A,B",
146 "ADD A,C",
147 "ADD A,D",
148 "ADD A,E",
149 "ADD A,H",
150 "ADD A,L",
151 "ADD A,(HL)",
152 "ADD A,A",
153 "ADC A,B",
154 "ADC A,C",
155 "ADC A,D",
156 "ADC A,E",
157 "ADC A,H",
158 "ADC A,L",
159 "ADC A,(HL)",
160 "ADC A",
161 "SUB B",
162 "SUB C",
163 "SUB D",
164 "SUB E",
165 "SUB H",
166 "SUB L",
167 "SUB (HL)",
168 "SUB A",
169 "SBC A,B",
170 "SBC A,C",
171 "SBC A,D",
172 "SBC A,E",
173 "SBC A,H",
174 "SBC A,L",
175 "SBC A,(HL)",
176 "SBC A,A",
177 "AND B",
178 "AND C",
179 "AND D",
180 "AND E",
181 "AND H",
182 "AND L",
183 "AND (HL)",
184 "AND A",
185 "XOR B",
186 "XOR C",
187 "XOR D",
188 "XOR E",
189 "XOR H",
190 "XOR L",
191 "XOR (HL)",
192 "XOR A",
193 "OR B",
194 "OR C",
195 "OR D",
196 "OR E",
197 "OR H",
198 "OR L",
199 "OR (HL)",
200 "OR A",
201 "CP B",
202 "CP C",
203 "CP D",
204 "CP E",
205 "CP H",
206 "CP L",
207 "CP (HL)",
208 "CP A",
209 "RET NZ",
210 "POP BC",
211 "JP NZ,%w",
212 "JP %w",
213 "CALL NZ,%w",
214 "PUSH BC",
215 "ADD A,%b",
216 "RST 0h",
217 "RET Z",
218 "RET",
219 "JP Z,%w",
220 NULL,
221 "CALL Z,%w",
222 "CALL %w",
223 "ADC A,%b",
224 "RST 8h",
225 "RET NC",
226 "POP DE",
227 "JP NC,%w",
228 NULL,
229 "CALL NC,%w",
230 "PUSH DE",
231 "SUB %b",
232 "RST 10h",
233 "RET C",
234 "RETI",
235 "JP C,%w",
236 NULL,
237 "CALL C,%w",
238 NULL,
239 "SBC A,%b",
240 "RST 18h",
241 "LD (FF00+%b),A",
242 "POP HL",
243 "LD (FF00+C),A",
244 NULL,
245 NULL,
246 "PUSH HL",
247 "AND %b",
248 "RST 20h",
249 "ADD SP,%o",
250 "JP HL",
251 "LD (%w),A",
252 NULL,
253 NULL,
254 NULL,
255 "XOR %b",
256 "RST 28h",
257 "LD A,(FF00+%b)",
258 "POP AF",
259 "LD A,(FF00+C)",
260 "DI",
261 NULL,
262 "PUSH AF",
263 "OR %b",
264 "RST 30h",
265 "LD HL,SP%o",
266 "LD SP,HL",
267 "LD A,(%w)",
268 "EI",
269 NULL,
270 NULL,
271 "CP %b",
272 "RST 38h"
275 static char *cb_mnemonic_table[256] =
277 "RLC B",
278 "RLC C",
279 "RLC D",
280 "RLC E",
281 "RLC H",
282 "RLC L",
283 "RLC (HL)",
284 "RLC A",
285 "RRC B",
286 "RRC C",
287 "RRC D",
288 "RRC E",
289 "RRC H",
290 "RRC L",
291 "RRC (HL)",
292 "RRC A",
293 "RL B",
294 "RL C",
295 "RL D",
296 "RL E",
297 "RL H",
298 "RL L",
299 "RL (HL)",
300 "RL A",
301 "RR B",
302 "RR C",
303 "RR D",
304 "RR E",
305 "RR H",
306 "RR L",
307 "RR (HL)",
308 "RR A",
309 "SLA B",
310 "SLA C",
311 "SLA D",
312 "SLA E",
313 "SLA H",
314 "SLA L",
315 "SLA (HL)",
316 "SLA A",
317 "SRA B",
318 "SRA C",
319 "SRA D",
320 "SRA E",
321 "SRA H",
322 "SRA L",
323 "SRA (HL)",
324 "SRA A",
325 "SWAP B",
326 "SWAP C",
327 "SWAP D",
328 "SWAP E",
329 "SWAP H",
330 "SWAP L",
331 "SWAP (HL)",
332 "SWAP A",
333 "SRL B",
334 "SRL C",
335 "SRL D",
336 "SRL E",
337 "SRL H",
338 "SRL L",
339 "SRL (HL)",
340 "SRL A",
341 "BIT 0,B",
342 "BIT 0,C",
343 "BIT 0,D",
344 "BIT 0,E",
345 "BIT 0,H",
346 "BIT 0,L",
347 "BIT 0,(HL)",
348 "BIT 0,A",
349 "BIT 1,B",
350 "BIT 1,C",
351 "BIT 1,D",
352 "BIT 1,E",
353 "BIT 1,H",
354 "BIT 1,L",
355 "BIT 1,(HL)",
356 "BIT 1,A",
357 "BIT 2,B",
358 "BIT 2,C",
359 "BIT 2,D",
360 "BIT 2,E",
361 "BIT 2,H",
362 "BIT 2,L",
363 "BIT 2,(HL)",
364 "BIT 2,A",
365 "BIT 3,B",
366 "BIT 3,C",
367 "BIT 3,D",
368 "BIT 3,E",
369 "BIT 3,H",
370 "BIT 3,L",
371 "BIT 3,(HL)",
372 "BIT 3,A",
373 "BIT 4,B",
374 "BIT 4,C",
375 "BIT 4,D",
376 "BIT 4,E",
377 "BIT 4,H",
378 "BIT 4,L",
379 "BIT 4,(HL)",
380 "BIT 4,A",
381 "BIT 5,B",
382 "BIT 5,C",
383 "BIT 5,D",
384 "BIT 5,E",
385 "BIT 5,H",
386 "BIT 5,L",
387 "BIT 5,(HL)",
388 "BIT 5,A",
389 "BIT 6,B",
390 "BIT 6,C",
391 "BIT 6,D",
392 "BIT 6,E",
393 "BIT 6,H",
394 "BIT 6,L",
395 "BIT 6,(HL)",
396 "BIT 6,A",
397 "BIT 7,B",
398 "BIT 7,C",
399 "BIT 7,D",
400 "BIT 7,E",
401 "BIT 7,H",
402 "BIT 7,L",
403 "BIT 7,(HL)",
404 "BIT 7,A",
405 "RES 0,B",
406 "RES 0,C",
407 "RES 0,D",
408 "RES 0,E",
409 "RES 0,H",
410 "RES 0,L",
411 "RES 0,(HL)",
412 "RES 0,A",
413 "RES 1,B",
414 "RES 1,C",
415 "RES 1,D",
416 "RES 1,E",
417 "RES 1,H",
418 "RES 1,L",
419 "RES 1,(HL)",
420 "RES 1,A",
421 "RES 2,B",
422 "RES 2,C",
423 "RES 2,D",
424 "RES 2,E",
425 "RES 2,H",
426 "RES 2,L",
427 "RES 2,(HL)",
428 "RES 2,A",
429 "RES 3,B",
430 "RES 3,C",
431 "RES 3,D",
432 "RES 3,E",
433 "RES 3,H",
434 "RES 3,L",
435 "RES 3,(HL)",
436 "RES 3,A",
437 "RES 4,B",
438 "RES 4,C",
439 "RES 4,D",
440 "RES 4,E",
441 "RES 4,H",
442 "RES 4,L",
443 "RES 4,(HL)",
444 "RES 4,A",
445 "RES 5,B",
446 "RES 5,C",
447 "RES 5,D",
448 "RES 5,E",
449 "RES 5,H",
450 "RES 5,L",
451 "RES 5,(HL)",
452 "RES 5,A",
453 "RES 6,B",
454 "RES 6,C",
455 "RES 6,D",
456 "RES 6,E",
457 "RES 6,H",
458 "RES 6,L",
459 "RES 6,(HL)",
460 "RES 6,A",
461 "RES 7,B",
462 "RES 7,C",
463 "RES 7,D",
464 "RES 7,E",
465 "RES 7,H",
466 "RES 7,L",
467 "RES 7,(HL)",
468 "RES 7,A",
469 "SET 0,B",
470 "SET 0,C",
471 "SET 0,D",
472 "SET 0,E",
473 "SET 0,H",
474 "SET 0,L",
475 "SET 0,(HL)",
476 "SET 0,A",
477 "SET 1,B",
478 "SET 1,C",
479 "SET 1,D",
480 "SET 1,E",
481 "SET 1,H",
482 "SET 1,L",
483 "SET 1,(HL)",
484 "SET 1,A",
485 "SET 2,B",
486 "SET 2,C",
487 "SET 2,D",
488 "SET 2,E",
489 "SET 2,H",
490 "SET 2,L",
491 "SET 2,(HL)",
492 "SET 2,A",
493 "SET 3,B",
494 "SET 3,C",
495 "SET 3,D",
496 "SET 3,E",
497 "SET 3,H",
498 "SET 3,L",
499 "SET 3,(HL)",
500 "SET 3,A",
501 "SET 4,B",
502 "SET 4,C",
503 "SET 4,D",
504 "SET 4,E",
505 "SET 4,H",
506 "SET 4,L",
507 "SET 4,(HL)",
508 "SET 4,A",
509 "SET 5,B",
510 "SET 5,C",
511 "SET 5,D",
512 "SET 5,E",
513 "SET 5,H",
514 "SET 5,L",
515 "SET 5,(HL)",
516 "SET 5,A",
517 "SET 6,B",
518 "SET 6,C",
519 "SET 6,D",
520 "SET 6,E",
521 "SET 6,H",
522 "SET 6,L",
523 "SET 6,(HL)",
524 "SET 6,A",
525 "SET 7,B",
526 "SET 7,C",
527 "SET 7,D",
528 "SET 7,E",
529 "SET 7,H",
530 "SET 7,L",
531 "SET 7,(HL)",
532 "SET 7,A"
535 static byte operand_count[256] =
537 1, 3, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 2, 1,
538 1, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1,
539 2, 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 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 3, 3, 3, 1, 2, 1, 1, 1, 3, 2, 3, 3, 2, 1,
550 1, 1, 3, 1, 3, 1, 2, 1, 1, 1, 3, 1, 3, 1, 2, 1,
551 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1,
552 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1
556 /* replace with a real interactive debugger eventually... */
558 int debug_trace = 0;
560 rcvar_t debug_exports[] =
562 RCV_BOOL("trace", &debug_trace),
563 RCV_END
566 void debug_disassemble(addr a, int c)
568 static int i, j, k;
569 static byte code;
570 static byte ops[3];
571 static int opaddr;
572 static char mnemonic[256];
573 static char *pattern;
574 char ops_str[300];
575 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 += snprintf(mnemonic + j,255-j, "%02Xh", ops[k++]);
604 break;
605 case 'W':
606 case 'w':
607 ops[k] = readb(a); a++;
608 ops[k+1] = readb(a); a++;
609 j += snprintf(mnemonic + j, 255-j,"%04Xh",
610 ((ops[k+1] << 8) | ops[k]));
611 k += 2;
612 break;
613 case 'O':
614 case 'o':
615 ops[k] = readb(a); a++;
616 j += snprintf(mnemonic + j, 255-j,"%+d", (n8)(ops[k++]));
617 break;
619 i++;
621 else
623 mnemonic[j++] = pattern[i++];
626 mnemonic[j] = 0;
627 switch (operand_count[ops[0]]) {
628 case 1:
629 snprintf(ops_str,sizeof(ops_str),"%02X ", ops[0]);
630 break;
631 case 2:
632 snprintf(ops_str,sizeof(ops_str),"%02X %02X ", ops[0], ops[1]);
633 break;
634 case 3:
635 snprintf(ops_str,sizeof(ops_str),"%02X %02X %02X", ops[0], ops[1], ops[2]);
636 break;
638 rb->lcd_putsxyf(0,0,"%04X %s %-16.16s", opaddr, ops_str, mnemonic);
639 rb->lcd_update();
640 c--;