|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Debugger
5: *
6: * (c) 1995 Bernd Schmidt
7: *
8: */
9:
10: #include <ctype.h>
11: #include <stdio.h>
12: #include <stdlib.h>
13: #include <signal.h>
14:
15: #include "config.h"
16: #include "amiga.h"
17: #include "options.h"
18: #include "debug.h"
19: #include "memory.h"
20: #include "custom.h"
21: #include "newcpu.h"
22: #include "cia.h"
23: #include "xwin.h"
24:
25: #ifdef __cplusplus
26: static void sigbrkhandler(...)
27: #else
28: static void sigbrkhandler(int foo)
29: #endif
30: {
31: broken_in = true;
32: specialflags |= SPCFLAG_BRK;
33: signal(SIGINT, sigbrkhandler);
34: }
35:
36: static void ignore_ws(char **c)
37: {
38: while (**c && isspace(**c)) (*c)++;
39: }
40:
41: static ULONG readhex(char **c)
42: {
43: ULONG val = 0;
44: char nc;
45:
46: ignore_ws(c);
47:
48: while (isxdigit(nc = **c)){
49: (*c)++;
50: val *= 16;
51: nc = toupper(nc);
52: if (isdigit(nc)) {
53: val += nc - '0';
54: } else {
55: val += nc - 'A' + 10;
56: }
57: }
58: return val;
59: }
60:
61: static char next_char(char **c)
62: {
63: ignore_ws(c);
64: return *(*c)++;
65: }
66:
67: static bool more_params(char **c)
68: {
69: ignore_ws(c);
70: return (**c) != 0;
71: }
72:
73: static void dumpmem(CPTR addr, CPTR *nxmem, int lines)
74: {
75: broken_in = false;
76: for (;lines-- && !broken_in;){
77: int i;
78: printf("%08lx ", addr);
79: for(i=0; i< 16; i++) {
80: printf("%04x ", get_word(addr)); addr += 2;
81: }
82: printf("\n");
83: }
84: *nxmem = addr;
85: }
86:
87: void debug(void)
88: {
89: char input[80],c;
90: CPTR nextpc,nxdis,nxmem;
91:
92: if (debuggable())
93: signal(SIGINT, sigbrkhandler);
94:
95: if (!debuggable() || !use_debugger) {
96: MC68000_run();
97: if (!debuggable()) {
98: dumpcustom();
99: return;
100: }
101: }
102: printf("debugging...\n");
103: MC68000_dumpstate(&nextpc);
104: nxdis = nextpc; nxmem = 0;
105: for(;;){
106: char cmd,*inptr;
107:
108: bogusframe = true;
109: printf(">");
110: fgets(input, 80, stdin);
111: inptr = input;
112: cmd = next_char(&inptr);
113: switch(cmd){
114: case 'q':
115: return;
116: case 'c':
117: dumpcia(); dumpcustom();
118: break;
119: case 'r':
120: MC68000_dumpstate(&nextpc);
121: break;
122: case 'd':
123: {
124: ULONG daddr;
125: int count;
126:
127: if (more_params(&inptr))
128: daddr = readhex(&inptr);
129: else
130: daddr = nxdis;
131: if (more_params(&inptr))
132: count = readhex(&inptr);
133: else
134: count = 10;
135: MC68000_disasm(daddr, &nxdis, count);
136: }
137: break;
138: case 't':
139: MC68000_step();
140: MC68000_dumpstate(&nextpc);
141: break;
142: case 'z':
143: MC68000_skip(nextpc);
144: MC68000_dumpstate(&nextpc);
145: nxdis = nextpc;
146: break;
147: case 'f':
148: MC68000_skip(readhex(&inptr));
149: MC68000_dumpstate(&nextpc);
150: break;
151: case 'g':
152: if (more_params (&inptr))
153: m68k_setpc (readhex (&inptr));
154: MC68000_run();
155: MC68000_dumpstate(&nextpc);
156: break;
157: case 'm':
158: {
159: ULONG maddr; int lines;
160: if (more_params(&inptr))
161: maddr = readhex(&inptr);
162: else
163: maddr = nxmem;
164: if (more_params(&inptr))
165: lines = readhex(&inptr);
166: else
167: lines = 16;
168: dumpmem(maddr, &nxmem, lines);
169: }
170: break;
171: }
172: }
173: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.