|
|
1.1.1.3 root 1: /*
1.1 root 2: * UAE - The Un*x Amiga Emulator
1.1.1.3 root 3: *
1.1 root 4: * Debugger
1.1.1.3 root 5: *
1.1 root 6: * (c) 1995 Bernd Schmidt
1.1.1.3 root 7: *
1.1 root 8: */
9:
10: #include "sysconfig.h"
11: #include "sysdeps.h"
12:
13: #include <ctype.h>
14: #include <signal.h>
15:
16: #include "config.h"
17: #include "options.h"
1.1.1.10! root 18: #include "threaddep/thread.h"
1.1.1.3 root 19: #include "uae.h"
1.1 root 20: #include "memory.h"
21: #include "custom.h"
22: #include "newcpu.h"
23: #include "debug.h"
24: #include "cia.h"
25: #include "xwin.h"
26: #include "gui.h"
1.1.1.9 root 27: #include "identify.h"
1.1 root 28:
29: static int debugger_active = 0;
1.1.1.3 root 30: static uaecptr skipaddr;
1.1 root 31: static int do_skip;
32: int debugging = 0;
33:
1.1.1.7 root 34: static FILE *logfile;
35:
1.1.1.4 root 36: void activate_debugger (void)
1.1 root 37: {
1.1.1.7 root 38: if (logfile)
39: fclose (logfile);
40: logfile = 0;
1.1 root 41: do_skip = 0;
42: if (debugger_active)
43: return;
44: debugger_active = 1;
1.1.1.8 root 45: set_special (SPCFLAG_BRK);
1.1 root 46: debugging = 1;
1.1.1.5 root 47: /* use_debugger = 1; */
1.1 root 48: }
49:
50: int firsthist = 0;
51: int lasthist = 0;
52: #ifdef NEED_TO_DEBUG_BADLY
53: struct regstruct history[MAX_HIST];
54: union flagu historyf[MAX_HIST];
55: #else
1.1.1.3 root 56: uaecptr history[MAX_HIST];
1.1 root 57: #endif
58:
1.1.1.4 root 59: static void ignore_ws (char **c)
1.1 root 60: {
61: while (**c && isspace(**c)) (*c)++;
62: }
63:
1.1.1.4 root 64: static uae_u32 readhex (char **c)
1.1 root 65: {
1.1.1.3 root 66: uae_u32 val = 0;
1.1 root 67: char nc;
68:
1.1.1.4 root 69: ignore_ws (c);
1.1.1.3 root 70:
1.1.1.4 root 71: while (isxdigit(nc = **c)) {
1.1 root 72: (*c)++;
73: val *= 16;
74: nc = toupper(nc);
75: if (isdigit(nc)) {
76: val += nc - '0';
77: } else {
78: val += nc - 'A' + 10;
79: }
80: }
81: return val;
82: }
83:
1.1.1.9 root 84: static uae_u32 readint (char **c)
85: {
86: uae_u32 val = 0;
87: char nc;
88: int negative = 0;
89:
90: ignore_ws (c);
91:
92: if (**c == '-')
93: negative = 1, (*c)++;
94: while (isdigit(nc = **c)) {
95: (*c)++;
96: val *= 10;
97: val += nc - '0';
98: }
99: return val * (negative ? -1 : 1);
100: }
101:
1.1.1.4 root 102: static char next_char( char **c)
1.1 root 103: {
1.1.1.4 root 104: ignore_ws (c);
1.1 root 105: return *(*c)++;
106: }
107:
1.1.1.4 root 108: static int more_params (char **c)
1.1 root 109: {
1.1.1.4 root 110: ignore_ws (c);
1.1 root 111: return (**c) != 0;
112: }
113:
1.1.1.4 root 114: static void dumpmem (uaecptr addr, uaecptr *nxmem, int lines)
1.1 root 115: {
116: broken_in = 0;
1.1.1.4 root 117: for (;lines-- && !broken_in;) {
1.1 root 118: int i;
1.1.1.4 root 119: printf ("%08lx ", addr);
120: for (i = 0; i < 16; i++) {
121: printf ("%04x ", get_word(addr)); addr += 2;
1.1 root 122: }
1.1.1.4 root 123: printf ("\n");
1.1 root 124: }
125: *nxmem = addr;
126: }
127:
1.1.1.3 root 128: static void foundmod (uae_u32 ptr, char *type)
1.1.1.2 root 129: {
1.1.1.3 root 130: char name[21];
131: uae_u8 *ptr2 = chipmemory + ptr;
132: int i,length;
133:
134: printf ("Found possible %s module at 0x%lx.\n", type, ptr);
135: memcpy (name, ptr2, 20);
136: name[20] = '\0';
137:
138: /* Browse playlist */
139: length = 0;
140: for (i = 0x3b8; i < 0x438; i++)
141: if (ptr2[i] > length)
142: length = ptr2[i];
143:
144: length = (length+1)*1024 + 0x43c;
145:
146: /* Add sample lengths */
147: ptr2 += 0x2A;
1.1.1.4 root 148: for (i = 0; i < 31; i++, ptr2 += 30)
1.1.1.3 root 149: length += 2*((ptr2[0]<<8)+ptr2[1]);
1.1.1.2 root 150:
1.1.1.4 root 151: printf ("Name \"%s\", Length 0x%lx bytes.\n", name, length);
1.1.1.3 root 152: }
153:
1.1.1.4 root 154: static void modulesearch (void)
1.1.1.3 root 155: {
156: uae_u8 *p = get_real_address (0);
157: uae_u32 ptr;
158:
1.1.1.4 root 159: for (ptr = 0; ptr < allocated_chipmem - 40; ptr += 2, p += 2) {
1.1.1.2 root 160: /* Check for Mahoney & Kaktus */
161: /* Anyone got the format of old 15 Sample (SoundTracker)modules? */
1.1.1.3 root 162: if (ptr >= 0x438 && p[0] == 'M' && p[1] == '.' && p[2] == 'K' && p[3] == '.')
163: foundmod (ptr - 0x438, "ProTracker (31 samples)");
164:
165: if (ptr >= 0x438 && p[0] == 'F' && p[1] == 'L' && p[2] == 'T' && p[3] == '4')
166: foundmod (ptr - 0x438, "Startrekker");
167:
168: if (strncmp ((char *)p, "SMOD", 4) == 0) {
169: printf ("Found possible FutureComposer 1.3 module at 0x%lx, length unknown.\n", ptr);
170: }
171: if (strncmp ((char *)p, "FC14", 4) == 0) {
172: printf ("Found possible FutureComposer 1.4 module at 0x%lx, length unknown.\n", ptr);
173: }
174: if (p[0] == 0x48 && p[1] == 0xe7 && p[4] == 0x61 && p[5] == 0
175: && p[8] == 0x4c && p[9] == 0xdf && p[12] == 0x4e && p[13] == 0x75
176: && p[14] == 0x48 && p[15] == 0xe7 && p[18] == 0x61 && p[19] == 0
177: && p[22] == 0x4c && p[23] == 0xdf && p[26] == 0x4e && p[27] == 0x75) {
178: printf ("Found possible Whittaker module at 0x%lx, length unknown.\n", ptr);
179: }
180: if (p[4] == 0x41 && p[5] == 0xFA) {
181: int i;
182:
183: for (i = 0; i < 0x240; i += 2)
184: if (p[i] == 0xE7 && p[i + 1] == 0x42 && p[i + 2] == 0x41 && p[i + 3] == 0xFA)
185: break;
186: if (i < 0x240) {
187: uae_u8 *p2 = p + i + 4;
188: for (i = 0; i < 0x30; i += 2)
189: if (p2[i] == 0xD1 && p2[i + 1] == 0xFA) {
190: printf ("Found possible MarkII module at %lx, length unknown.\n", ptr);
191: }
192: }
1.1.1.2 root 193: }
194: }
195: }
196:
1.1.1.9 root 197: static void dump_traps (void)
198: {
199: int i;
200: for (i = 0; trap_labels[i].name; i++) {
201: printf("$%02x: %s\t $%08x\n", trap_labels[i].adr,
202: trap_labels[i].name, get_long (trap_labels[i].adr));
203: }
204: }
205:
206: static void dump_ints (void)
207: {
208: int i;
209: for (i = 0; int_labels[i].name; i++) {
210: printf ("$%02x: %s\t $%08x\n", int_labels[i].adr,
211: int_labels[i].name, get_long (int_labels[i].adr));
212: }
213: }
214:
215: static void disassemble_wait (FILE *file, unsigned long insn)
216: {
217: uae_u8 vp,hp,ve,he,bfd,v_mask,h_mask;
218:
219: vp = (insn & 0xff000000) >> 24;
220: hp = (insn & 0x00fe0000) >> 16;
221: ve = (insn & 0x00007f00) >> 8;
222: he = (insn & 0x000000fe);
223: bfd = insn & 0x00008000 >> 15;
224:
225: /* bit15 can never be masked out*/
226: v_mask = vp & (ve | 0x80);
227: h_mask = hp & he;
228: if (v_mask > 0) {
229: fprintf (file, "vpos ");
230: if (ve != 0x7f) {
231: fprintf (file, "& 0x%02x ", ve);
232: }
233: fprintf (file, ">= 0x%02x", v_mask);
234: }
235: if (he > 0) {
236: if (v_mask > 0) {
237: fprintf (file," and");
238: }
239: fprintf (file, " hpos ");
240: if (he != 0xfe) {
241: fprintf (file, "& 0x%02x ", he);
242: }
243: fprintf (file, ">= 0x%02x", h_mask);
244: } else {
245: fprintf (file, ", ignore horizontal");
246: }
247:
248: fprintf (file, ".\n \t; VP %02x, VE %02x; HP %02x, HE %02x; BFD %d\n",
249: vp, ve, hp, he, bfd);
250: }
251:
252: /* simple decode copper by Mark Cox */
253: static void decode_copper_insn (FILE* file, unsigned long insn, unsigned long addr)
254: {
255: uae_u32 insn_type = insn & 0x00010001;
256: int hpos, vpos;
257: char record[] = " ";
258: if (find_copper_record (addr, &hpos, &vpos)) {
259: sprintf (record, " [%03x %03x]", vpos, hpos);
260: }
261:
262: fprintf (file, "%08lx: %04lx %04lx%s\t; ", addr, insn >> 16, insn & 0xFFFF, record);
263:
264: switch (insn_type) {
265: case 0x00010000: /* WAIT insn */
266: fprintf (file, "Wait for ");
267: disassemble_wait (file, insn);
268:
269: if (insn == 0xfffffffe)
270: fprintf (file, " \t; End of Copperlist\n");
271:
272: break;
273:
274: case 0x00010001: /* SKIP insn */
275: fprintf (file, "Skip if ");
276: disassemble_wait (file, insn);
277: break;
278:
279: case 0x00000000:
280: case 0x00000001: /* MOVE insn */
281: fprintf (file, "%s := 0x%04lx\n",
282: custd[(insn & 0x01fe0000) >> 17].name,
283: insn & 0x0000ffff);
284:
285: if ((insn & 0xfe000000) != 0) {
286: fprintf (file, " \t;OCS Compatibility warning: bits 15-9 should be 0 for compatibility with OCS\n");
287: }
288: /* 01fe0000 register destination address
289: fe000000 should be 0 for compatibility (at least in ocs
290: 0000ffff data to be put in register destination */
291: break;
292:
293: default:
294: abort ();
295: }
296:
297: }
298:
299:
300: static uaecptr decode_copperlist (FILE* file, uaecptr address, int nolines)
301: {
302: uae_u32 insn;
303: while (nolines-- > 0) {
304: insn = get_long (address);
305: decode_copper_insn (file, insn, address);
306: address += 4;
307: }
308: return address;
309: /* You may wonder why I don't stop this at the end of the copperlist?
310: * Well, often nice things are hidden at the end and it is debatable the actual
311: * values that mean the end of the copperlist */
312: }
313:
314:
1.1.1.4 root 315: /* cheat-search by Holger Jakob */
316: static void cheatsearch (char **c)
317: {
318: uae_u8 *p = get_real_address (0);
319: static uae_u32 *vlist = NULL;
320: uae_u32 ptr;
321: uae_u32 val = 0;
322: uae_u32 type = 0; /* not yet */
323: uae_u32 count = 0;
324: uae_u32 fcount = 0;
325: uae_u32 full = 0;
326: char nc;
327:
328: ignore_ws (c);
329:
330: while (isxdigit (nc = **c)) {
331: (*c)++;
332: val *= 10;
333: nc = toupper (nc);
334: if (isdigit (nc)) {
335: val += nc - '0';
336: }
337: }
338: if (vlist == NULL) {
339: vlist = malloc (256*4);
340: if (vlist != 0) {
341: for (count = 0; count<255; count++)
342: vlist[count] = 0;
343: count = 0;
344: for (ptr = 0; ptr < allocated_chipmem - 40; ptr += 2, p += 2) {
345: if (ptr >= 0x438 && p[3] == (val & 0xff)
346: && p[2] == (val >> 8 & 0xff)
347: && p[1] == (val >> 16 & 0xff)
348: && p[0] == (val >> 24 & 0xff))
349: {
350: if (count < 255) {
351: vlist[count++]=ptr;
352: printf ("%08x: %x%x%x%x\n",ptr,p[0],p[1],p[2],p[3]);
353: } else
354: full = 1;
355: }
356: }
357: printf ("Found %d possible addresses with %d\n",count,val);
358: printf ("Now continue with 'g' and use 'C' with a different value\n");
359: }
360: } else {
361: for (count = 0; count<255; count++) {
362: if (p[vlist[count]+3] == (val & 0xff)
363: && p[vlist[count]+2] == (val>>8 & 0xff)
364: && p[vlist[count]+1] == (val>>16 & 0xff)
365: && p[vlist[count]] == (val>>24 & 0xff))
366: {
367: fcount++;
368: printf ("%08x: %x%x%x%x\n", vlist[count], p[vlist[count]],
369: p[vlist[count]+1], p[vlist[count]+2], p[vlist[count]+3]);
370: }
371: }
372: printf ("%d hits of %d found\n",fcount,val);
373: free (vlist);
374: vlist = NULL;
375: }
376: }
377:
378: static void writeintomem (char **c)
379: {
380: uae_u8 *p = get_real_address (0);
381: uae_u32 addr = 0;
382: uae_u32 val = 0;
383: char nc;
384:
385: ignore_ws(c);
386: while (isxdigit(nc = **c)) {
387: (*c)++;
388: addr *= 16;
389: nc = toupper(nc);
390: if (isdigit(nc)) {
391: addr += nc - '0';
392: } else {
393: addr += nc - 'A' + 10;
394: }
395: }
396: ignore_ws(c);
397: while (isxdigit(nc = **c)) {
398: (*c)++;
399: val *= 10;
400: nc = toupper(nc);
401: if (isdigit(nc)) {
402: val += nc - '0';
403: }
404: }
405:
406: if (addr < allocated_chipmem) {
407: p[addr] = val>>24 & 0xff;
408: p[addr+1] = val>>16 & 0xff;
409: p[addr+2] = val>>8 & 0xff;
410: p[addr+3] = val & 0xff;
1.1.1.9 root 411: printf ("Wrote %d at %08x\n",val,addr);
1.1.1.4 root 412: } else
1.1.1.9 root 413: printf ("Invalid address %08x\n",addr);
414: }
415:
416: static void show_exec_tasks (void)
417: {
418: uaecptr execbase = get_long (4);
419: uaecptr taskready = get_long (execbase + 406);
420: uaecptr taskwait = get_long (execbase + 420);
421: uaecptr node, end;
422: printf ("execbase at 0x%08lx\n", (unsigned long) execbase);
423: printf ("Current:\n");
424: node = get_long (execbase + 276);
425: printf ("%08lx: %08lx %s\n", node, 0, get_real_address (get_long (node + 10)));
426: printf ("Ready:\n");
427: node = get_long (taskready);
428: end = get_long (taskready + 4);
429: while (node) {
430: printf ("%08lx: %08lx %s\n", node, 0, get_real_address (get_long (node + 10)));
431: node = get_long (node);
432: }
433: printf ("Waiting:\n");
434: node = get_long (taskwait);
435: end = get_long (taskwait + 4);
436: while (node) {
437: printf ("%08lx: %08lx %s\n", node, 0, get_real_address (get_long (node + 10)));
438: node = get_long (node);
439: }
1.1.1.4 root 440: }
1.1.1.7 root 441:
1.1.1.8 root 442: static int trace_same_insn_count;
443: static uae_u8 trace_insn_copy[10];
444: static struct regstruct trace_prev_regs;
1.1.1.4 root 445: void debug (void)
1.1 root 446: {
1.1.1.4 root 447: char input[80];
1.1.1.9 root 448: uaecptr nextpc,nxdis,nxmem,nxcopper;
1.1 root 449:
450: bogusframe = 1;
1.1.1.3 root 451:
1.1.1.7 root 452: if (do_skip && skipaddr == 0xC0DEDBAD) {
1.1.1.8 root 453: #if 0
454: if (trace_same_insn_count > 0) {
455: if (memcmp (trace_insn_copy, regs.pc_p, 10) == 0
456: && memcmp (trace_prev_regs.regs, regs.regs, sizeof regs.regs) == 0)
457: {
458: trace_same_insn_count++;
459: return;
460: }
461: }
462: if (trace_same_insn_count > 1)
463: fprintf (logfile, "[ repeated %d times ]\n", trace_same_insn_count);
464: #endif
1.1.1.7 root 465: m68k_dumpstate (logfile, &nextpc);
1.1.1.8 root 466: trace_same_insn_count = 1;
467: memcpy (trace_insn_copy, regs.pc_p, 10);
468: memcpy (&trace_prev_regs, ®s, sizeof regs);
1.1.1.7 root 469: }
470:
1.1 root 471: if (do_skip && (m68k_getpc() != skipaddr/* || regs.a[0] != 0x1e558*/)) {
1.1.1.8 root 472: set_special (SPCFLAG_BRK);
1.1 root 473: return;
474: }
475: do_skip = 0;
476:
477: #ifdef NEED_TO_DEBUG_BADLY
478: history[lasthist] = regs;
479: historyf[lasthist] = regflags;
480: #else
481: history[lasthist] = m68k_getpc();
482: #endif
483: if (++lasthist == MAX_HIST) lasthist = 0;
484: if (lasthist == firsthist) {
485: if (++firsthist == MAX_HIST) firsthist = 0;
486: }
487:
1.1.1.7 root 488: m68k_dumpstate (stdout, &nextpc);
1.1.1.9 root 489: nxdis = nextpc; nxmem = nxcopper = 0;
1.1 root 490:
1.1.1.4 root 491: for (;;) {
492: char cmd, *inptr;
1.1.1.3 root 493:
1.1.1.4 root 494: printf (">");
1.1.1.2 root 495: fflush (stdout);
1.1.1.4 root 496: if (fgets (input, 80, stdin) == 0)
1.1.1.2 root 497: return;
1.1 root 498: inptr = input;
1.1.1.4 root 499: cmd = next_char (&inptr);
500: switch (cmd) {
1.1.1.9 root 501: case 'c': dumpcia (); dumpdisk (); dumpcustom (); break;
502: case 'i': dump_ints (); break;
503: case 'e': dump_traps (); break;
504: case 'r': m68k_dumpstate (stdout, &nextpc); break;
505: case 'M': modulesearch (); break;
506: case 'C': cheatsearch (&inptr); break;
507: case 'W': writeintomem (&inptr); break;
508: case 'S':
509: {
510: uae_u8 *memp;
511: uae_u32 src, len;
512: char *name;
513: FILE *fp;
514:
515: if (!more_params (&inptr))
516: goto S_argh;
1.1.1.3 root 517:
1.1.1.9 root 518: name = inptr;
519: while (*inptr != '\0' && !isspace (*inptr))
1.1.1.3 root 520: inptr++;
1.1.1.9 root 521: if (!isspace (*inptr))
522: goto S_argh;
1.1.1.3 root 523:
1.1.1.9 root 524: *inptr = '\0';
525: inptr++;
526: if (!more_params (&inptr))
527: goto S_argh;
528: src = readhex (&inptr);
529: if (!more_params (&inptr))
530: goto S_argh;
531: len = readhex (&inptr);
532: if (! valid_address (src, len)) {
533: printf ("Invalid memory block\n");
1.1.1.3 root 534: break;
535: }
1.1.1.9 root 536: memp = get_real_address (src);
537: fp = fopen (name, "w");
538: if (fp == NULL) {
539: printf ("Couldn't open file\n");
540: break;
1.1 root 541: }
1.1.1.9 root 542: if (fwrite (memp, 1, len, fp) != len) {
543: printf ("Error writing file\n");
544: }
545: fclose (fp);
546: break;
547:
548: S_argh:
549: printf ("S command needs more arguments!\n");
1.1 root 550: break;
1.1.1.9 root 551: }
552: case 'd':
553: {
554: uae_u32 daddr;
555: int count;
556:
557: if (more_params(&inptr))
558: daddr = readhex(&inptr);
559: else
560: daddr = nxdis;
561: if (more_params(&inptr))
562: count = readhex(&inptr);
563: else
564: count = 10;
565: m68k_disasm (stdout, daddr, &nxdis, count);
566: }
567: break;
568: case 'T': show_exec_tasks (); break;
569: case 't': set_special (SPCFLAG_BRK); return;
570: case 'z':
1.1 root 571: skipaddr = nextpc;
572: do_skip = 1;
1.1.1.8 root 573: set_special (SPCFLAG_BRK);
1.1 root 574: return;
575:
1.1.1.9 root 576: case 'f':
1.1.1.7 root 577: skipaddr = readhex (&inptr);
1.1 root 578: do_skip = 1;
1.1.1.8 root 579: set_special (SPCFLAG_BRK);
580: if (skipaddr == 0xC0DEDBAD) {
581: trace_same_insn_count = 0;
1.1.1.7 root 582: logfile = fopen ("uae.trace", "w");
1.1.1.8 root 583: memcpy (trace_insn_copy, regs.pc_p, 10);
584: memcpy (&trace_prev_regs, ®s, sizeof regs);
585: }
1.1 root 586: return;
587:
1.1.1.9 root 588: case 'q': uae_quit();
1.1.1.3 root 589: debugger_active = 0;
590: debugging = 0;
591: return;
592:
1.1.1.9 root 593: case 'g':
1.1 root 594: if (more_params (&inptr))
595: m68k_setpc (readhex (&inptr));
1.1.1.3 root 596: fill_prefetch_0 ();
1.1 root 597: debugger_active = 0;
598: debugging = 0;
599: return;
600:
1.1.1.9 root 601: case 'H':
602: {
603: int count;
604: int temp;
1.1 root 605: #ifdef NEED_TO_DEBUG_BADLY
1.1.1.9 root 606: struct regstruct save_regs = regs;
607: union flagu save_flags = regflags;
1.1 root 608: #endif
609:
1.1.1.9 root 610: if (more_params(&inptr))
611: count = readhex(&inptr);
612: else
613: count = 10;
614: if (count < 0)
615: break;
616: temp = lasthist;
617: while (count-- > 0 && temp != firsthist) {
618: if (temp == 0) temp = MAX_HIST-1; else temp--;
619: }
620: while (temp != lasthist) {
1.1 root 621: #ifdef NEED_TO_DEBUG_BADLY
1.1.1.9 root 622: regs = history[temp];
623: regflags = historyf[temp];
624: m68k_dumpstate (NULL);
1.1 root 625: #else
1.1.1.9 root 626: m68k_disasm (stdout, history[temp], NULL, 1);
1.1 root 627: #endif
1.1.1.9 root 628: if (++temp == MAX_HIST) temp = 0;
629: }
1.1 root 630: #ifdef NEED_TO_DEBUG_BADLY
1.1.1.9 root 631: regs = save_regs;
632: regflags = save_flags;
1.1 root 633: #endif
1.1.1.9 root 634: }
635: break;
636: case 'm':
637: {
638: uae_u32 maddr; int lines;
639: if (more_params(&inptr))
640: maddr = readhex(&inptr);
641: else
642: maddr = nxmem;
643: if (more_params(&inptr))
644: lines = readhex(&inptr);
645: else
646: lines = 16;
647: dumpmem(maddr, &nxmem, lines);
648: }
649: break;
650: case 'o':
651: {
652: uae_u32 maddr;
653: int lines;
654:
655: if (more_params(&inptr)) {
656: maddr = readhex(&inptr);
657: if (maddr == 1 || maddr == 2)
658: maddr = get_copper_address (maddr);
1.1 root 659: }
1.1.1.9 root 660: else
661: maddr = nxcopper;
662:
663: if (more_params (&inptr))
664: lines = readhex (&inptr);
665: else
666: lines = 10;
667:
668: nxcopper = decode_copperlist (stdout, maddr, lines);
1.1 root 669: break;
1.1.1.9 root 670: }
671: case 'O':
672: if (more_params (&inptr)) {
673: int plane = readint (&inptr);
674: int offs = readint (&inptr);
675: if (plane >= 0 && plane < 8)
1.1.1.10! root 676: bpl_off[plane] = offs;
1.1.1.9 root 677: } else {
678: int i;
679: for (i = 0; i < 8; i++)
1.1.1.10! root 680: printf ("Plane %d offset %d\n", i, bpl_off[i]);
1.1.1.3 root 681: }
682: break;
1.1.1.9 root 683: case 'h':
684: case '?':
685: {
686: printf (" HELP for UAE Debugger\n");
687: printf (" -----------------------\n\n");
688: printf (" g: <address> Start execution at the current address or <address>\n");
689: printf (" c: Dump state of the CIA and custom chips\n");
690: printf (" r: Dump state of the CPU\n");
691: printf (" m <address> <lines>: Memory dump starting at <address>\n");
692: printf (" d <address> <lines>: Disassembly starting at <address>\n");
693: printf (" t: Step one instruction\n");
694: printf (" z: Step through one instruction - useful for JSR, DBRA etc\n");
695: printf (" f <address>: Step forward until PC == <address>\n");
696: printf (" i: Dump contents of interrupt registers\n");
697: printf (" e: Dump contents of trap vectors\n");
698: printf (" o <1|2|addr> <lines>: View memory as Copper Instructions\n");
699: printf (" O: Display bitplane offsets\n");
700: printf (" O <plane> <offset>: Offset a bitplane\n");
701: printf (" H <count>: Show PC history <count> instructions\n");
702: printf (" M: Search for *Tracker sound modules\n");
703: printf (" C <value>: Search for values like energy or lifes in games\n");
704: printf (" W <address> <value>: Write into Amiga memory\n");
705: printf (" S <file> <addr> <n>: Save a block of Amiga memory\n");
706: printf (" T: Show exec tasks and their PCs\n");
707: printf (" h,?: Show this help page\n");
708: printf (" q: Quit the emulator. You don't want to use this command.\n\n");
709: }
710: break;
1.1 root 711: }
712: }
713: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.