fix FS#8187 - charging breaks sleep timer. Now if the timer goes off and the player...
[Rockbox.git] / apps / plugins / rockboy / debug.c
bloba829b9879938b4ecd94e5c7405d7236005be53f5
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 meow[500],buf[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,
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 += snprintf(mnemonic + j, 255-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 += snprintf(mnemonic + j, 255-j,"%+d",
618 (n8)(ops[k++]));
619 break;
621 i++;
623 else
625 mnemonic[j++] = pattern[i++];
628 mnemonic[j] = 0;
629 snprintf(buf,299,"%04X ", opaddr);
630 strcpy(meow,buf);
631 switch (operand_count[ops[0]]) {
632 case 1:
633 snprintf(buf,299,"%02X ", ops[0]);
634 strcat(meow,buf);
635 break;
636 case 2:
637 snprintf(buf,299,"%02X %02X ", ops[0], ops[1]);
638 strcat(meow,buf);
639 break;
640 case 3:
641 snprintf(buf,299,"%02X %02X %02X ", ops[0], ops[1], ops[2]);
642 strcat(meow,buf);
643 break;
645 snprintf(buf,"%-16.16s", mnemonic);
646 strcat(meow,buf);
647 rb->lcd_putsxy(0,0,meow);
648 rb->lcd_update();
649 c--;