2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
19 #define Sleep(n) SDL_Delay(n)
24 #define MAX_BREAK_POINTS 8
29 int status; // 0 = none, 1 = enabled, other = disabled
30 } table[MAX_BREAK_POINTS], stored[MAX_BREAK_POINTS];
35 class DEBUGGER : public DEVICE
40 void check_mem_break_points(break_point_t *bp, uint32 addr, int length)
42 for(int i = 0; i < MAX_BREAK_POINTS; i++) {
43 if(bp->table[i].status == 1) {
44 if(addr >= bp->table[i].addr && addr < bp->table[i].addr + length) {
45 bp->hit = now_suspended = true;
46 bp->hit_addr = bp->table[i].addr;
52 void check_io_break_points(break_point_t *bp, uint32 addr)
54 for(int i = 0; i < MAX_BREAK_POINTS; i++) {
55 if(bp->table[i].status == 1) {
56 if((addr & bp->table[i].mask) == (bp->table[i].addr & bp->table[i].mask)) {
57 bp->hit = now_suspended = true;
65 DEBUGGER(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
67 memset(&bp, 0, sizeof(bp));
68 memset(&rbp, 0, sizeof(rbp));
69 memset(&wbp, 0, sizeof(wbp));
70 memset(&ibp, 0, sizeof(ibp));
71 memset(&obp, 0, sizeof(obp));
72 _tcscpy_s(file_path, _MAX_PATH, _T("debug.bin"));
73 _tcscpy_s(text_path, _MAX_PATH, _T("disasm.txt"));
74 now_debugging = now_going = now_suspended = false;
79 void write_data8(uint32 addr, uint32 data)
81 check_mem_break_points(&wbp, addr, 1);
82 d_mem->write_data8(addr, data);
84 uint32 read_data8(uint32 addr)
86 check_mem_break_points(&rbp, addr, 1);
87 return d_mem->read_data8(addr);
89 void write_data16(uint32 addr, uint32 data)
91 check_mem_break_points(&wbp, addr, 2);
92 d_mem->write_data16(addr, data);
94 uint32 read_data16(uint32 addr)
96 check_mem_break_points(&rbp, addr, 2);
97 return d_mem->read_data16(addr);
99 void write_data32(uint32 addr, uint32 data)
101 check_mem_break_points(&wbp, addr, 4);
102 d_mem->write_data32(addr, data);
104 uint32 read_data32(uint32 addr)
106 check_mem_break_points(&rbp, addr, 4);
107 return d_mem->read_data32(addr);
109 void write_data8w(uint32 addr, uint32 data, int* wait)
111 check_mem_break_points(&wbp, addr, 1);
112 d_mem->write_data8w(addr, data, wait);
114 uint32 read_data8w(uint32 addr, int* wait)
116 check_mem_break_points(&rbp, addr, 1);
117 return d_mem->read_data8w(addr, wait);
119 void write_data16w(uint32 addr, uint32 data, int* wait)
121 check_mem_break_points(&wbp, addr, 2);
122 d_mem->write_data16w(addr, data, wait);
124 uint32 read_data16w(uint32 addr, int* wait)
126 check_mem_break_points(&rbp, addr, 2);
127 return d_mem->read_data16w(addr, wait);
129 void write_data32w(uint32 addr, uint32 data, int* wait)
131 check_mem_break_points(&wbp, addr, 4);
132 d_mem->write_data32w(addr, data, wait);
134 uint32 read_data32w(uint32 addr, int* wait)
136 check_mem_break_points(&rbp, addr, 4);
137 return d_mem->read_data32w(addr, wait);
139 uint32 fetch_op(uint32 addr, int *wait)
141 check_mem_break_points(&rbp, addr, 1);
142 return d_mem->fetch_op(addr, wait);
144 void write_io8(uint32 addr, uint32 data)
146 check_io_break_points(&obp, addr);
147 d_io->write_io8(addr, data);
149 uint32 read_io8(uint32 addr)
151 check_io_break_points(&ibp, addr);
152 return d_io->read_io8(addr);
154 void write_io16(uint32 addr, uint32 data)
156 check_io_break_points(&obp, addr);
157 d_io->write_io16(addr, data);
159 uint32 read_io16(uint32 addr)
161 check_io_break_points(&ibp, addr);
162 return d_io->read_io16(addr);
164 void write_io32(uint32 addr, uint32 data)
166 check_io_break_points(&obp, addr);
167 d_io->write_io32(addr, data);
169 uint32 read_io32(uint32 addr)
171 check_io_break_points(&ibp, addr);
172 return d_io->read_io32(addr);
174 void write_io8w(uint32 addr, uint32 data, int* wait)
176 check_io_break_points(&obp, addr);
177 d_io->write_io8w(addr, data, wait);
179 uint32 read_io8w(uint32 addr, int* wait)
181 check_io_break_points(&ibp, addr);
182 return d_io->read_io8w(addr, wait);
184 void write_io16w(uint32 addr, uint32 data, int* wait)
186 check_io_break_points(&obp, addr);
187 d_io->write_io16w(addr, data, wait);
189 uint32 read_io16w(uint32 addr, int* wait)
191 check_io_break_points(&ibp, addr);
192 return d_io->read_io16w(addr, wait);
194 void write_io32w(uint32 addr, uint32 data, int* wait)
196 check_io_break_points(&obp, addr);
197 d_io->write_io32w(addr, data, wait);
199 uint32 read_io32w(uint32 addr, int* wait)
201 check_io_break_points(&ibp, addr);
202 return d_io->read_io32w(addr, wait);
206 void set_context_mem(DEVICE* device)
210 void set_context_io(DEVICE* device)
214 void check_break_points(uint32 addr)
216 check_mem_break_points(&bp, addr, 1);
218 void store_break_points()
220 memcpy( bp.stored, bp.table, sizeof( bp.table));
221 memcpy(rbp.stored, rbp.table, sizeof(rbp.table));
222 memcpy(wbp.stored, wbp.table, sizeof(wbp.table));
223 memcpy(ibp.stored, ibp.table, sizeof(ibp.table));
224 memcpy(obp.stored, obp.table, sizeof(obp.table));
225 memset( bp.table, 0, sizeof( bp.table));
226 memset(rbp.table, 0, sizeof(rbp.table));
227 memset(wbp.table, 0, sizeof(wbp.table));
228 memset(ibp.table, 0, sizeof(ibp.table));
229 memset(obp.table, 0, sizeof(obp.table));
231 void restore_break_points()
233 memcpy( bp.table, bp.stored, sizeof( bp.table));
234 memcpy(rbp.table, rbp.stored, sizeof(rbp.table));
235 memcpy(wbp.table, wbp.stored, sizeof(wbp.table));
236 memcpy(ibp.table, ibp.stored, sizeof(ibp.table));
237 memcpy(obp.table, obp.stored, sizeof(obp.table));
241 return (bp.hit || rbp.hit || wbp.hit || ibp.hit || obp.hit);
243 break_point_t bp, rbp, wbp, ibp, obp;
244 _TCHAR file_path[_MAX_PATH];
245 _TCHAR text_path[_MAX_PATH];
246 bool now_debugging, now_going, now_suspended;