2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
19 #define MAX_BREAK_POINTS 8
24 int status; // 0 = none, 1 = enabled, other = disabled
25 } table[MAX_BREAK_POINTS], stored[MAX_BREAK_POINTS];
30 class DEBUGGER : public DEVICE
35 void check_mem_break_points(break_point_t *bp, uint32_t addr, int length)
37 for(int i = 0; i < MAX_BREAK_POINTS; i++) {
38 if(bp->table[i].status == 1) {
39 if(addr >= bp->table[i].addr && addr < bp->table[i].addr + length) {
40 bp->hit = now_suspended = true;
41 bp->hit_addr = bp->table[i].addr;
47 void check_io_break_points(break_point_t *bp, uint32_t addr)
49 for(int i = 0; i < MAX_BREAK_POINTS; i++) {
50 if(bp->table[i].status == 1) {
51 if((addr & bp->table[i].mask) == (bp->table[i].addr & bp->table[i].mask)) {
52 bp->hit = now_suspended = true;
60 DEBUGGER(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
62 memset(&bp, 0, sizeof(bp));
63 memset(&rbp, 0, sizeof(rbp));
64 memset(&wbp, 0, sizeof(wbp));
65 memset(&ibp, 0, sizeof(ibp));
66 memset(&obp, 0, sizeof(obp));
67 my_tcscpy_s(file_path, _MAX_PATH, _T("debug.bin"));
68 now_debugging = now_going = now_suspended = false;
69 set_device_name(_T("Debugger"));
74 void write_data8(uint32_t addr, uint32_t data)
76 check_mem_break_points(&wbp, addr, 1);
77 d_mem->write_data8(addr, data);
79 uint32_t read_data8(uint32_t addr)
81 check_mem_break_points(&rbp, addr, 1);
82 return d_mem->read_data8(addr);
84 void write_data16(uint32_t addr, uint32_t data)
86 check_mem_break_points(&wbp, addr, 2);
87 d_mem->write_data16(addr, data);
89 uint32_t read_data16(uint32_t addr)
91 check_mem_break_points(&rbp, addr, 2);
92 return d_mem->read_data16(addr);
94 void write_data32(uint32_t addr, uint32_t data)
96 check_mem_break_points(&wbp, addr, 4);
97 d_mem->write_data32(addr, data);
99 uint32_t read_data32(uint32_t addr)
101 check_mem_break_points(&rbp, addr, 4);
102 return d_mem->read_data32(addr);
104 void write_data8w(uint32_t addr, uint32_t data, int* wait)
106 check_mem_break_points(&wbp, addr, 1);
107 d_mem->write_data8w(addr, data, wait);
109 uint32_t read_data8w(uint32_t addr, int* wait)
111 check_mem_break_points(&rbp, addr, 1);
112 return d_mem->read_data8w(addr, wait);
114 void write_data16w(uint32_t addr, uint32_t data, int* wait)
116 check_mem_break_points(&wbp, addr, 2);
117 d_mem->write_data16w(addr, data, wait);
119 uint32_t read_data16w(uint32_t addr, int* wait)
121 check_mem_break_points(&rbp, addr, 2);
122 return d_mem->read_data16w(addr, wait);
124 void write_data32w(uint32_t addr, uint32_t data, int* wait)
126 check_mem_break_points(&wbp, addr, 4);
127 d_mem->write_data32w(addr, data, wait);
129 uint32_t read_data32w(uint32_t addr, int* wait)
131 check_mem_break_points(&rbp, addr, 4);
132 return d_mem->read_data32w(addr, wait);
134 uint32_t fetch_op(uint32_t addr, int *wait)
136 check_mem_break_points(&rbp, addr, 1);
137 return d_mem->fetch_op(addr, wait);
139 void write_io8(uint32_t addr, uint32_t data)
141 check_io_break_points(&obp, addr);
142 d_io->write_io8(addr, data);
144 uint32_t read_io8(uint32_t addr)
146 check_io_break_points(&ibp, addr);
147 return d_io->read_io8(addr);
149 void write_io16(uint32_t addr, uint32_t data)
151 check_io_break_points(&obp, addr);
152 d_io->write_io16(addr, data);
154 uint32_t read_io16(uint32_t addr)
156 check_io_break_points(&ibp, addr);
157 return d_io->read_io16(addr);
159 void write_io32(uint32_t addr, uint32_t data)
161 check_io_break_points(&obp, addr);
162 d_io->write_io32(addr, data);
164 uint32_t read_io32(uint32_t addr)
166 check_io_break_points(&ibp, addr);
167 return d_io->read_io32(addr);
169 void write_io8w(uint32_t addr, uint32_t data, int* wait)
171 check_io_break_points(&obp, addr);
172 d_io->write_io8w(addr, data, wait);
174 uint32_t read_io8w(uint32_t addr, int* wait)
176 check_io_break_points(&ibp, addr);
177 return d_io->read_io8w(addr, wait);
179 void write_io16w(uint32_t addr, uint32_t data, int* wait)
181 check_io_break_points(&obp, addr);
182 d_io->write_io16w(addr, data, wait);
184 uint32_t read_io16w(uint32_t addr, int* wait)
186 check_io_break_points(&ibp, addr);
187 return d_io->read_io16w(addr, wait);
189 void write_io32w(uint32_t addr, uint32_t data, int* wait)
191 check_io_break_points(&obp, addr);
192 d_io->write_io32w(addr, data, wait);
194 uint32_t read_io32w(uint32_t addr, int* wait)
196 check_io_break_points(&ibp, addr);
197 return d_io->read_io32w(addr, wait);
201 void set_context_mem(DEVICE* device)
205 void set_context_io(DEVICE* device)
209 void check_break_points(uint32_t addr)
211 check_mem_break_points(&bp, addr, 1);
213 void store_break_points()
215 memcpy( bp.stored, bp.table, sizeof( bp.table));
216 memcpy(rbp.stored, rbp.table, sizeof(rbp.table));
217 memcpy(wbp.stored, wbp.table, sizeof(wbp.table));
218 memcpy(ibp.stored, ibp.table, sizeof(ibp.table));
219 memcpy(obp.stored, obp.table, sizeof(obp.table));
220 memset( bp.table, 0, sizeof( bp.table));
221 memset(rbp.table, 0, sizeof(rbp.table));
222 memset(wbp.table, 0, sizeof(wbp.table));
223 memset(ibp.table, 0, sizeof(ibp.table));
224 memset(obp.table, 0, sizeof(obp.table));
226 void restore_break_points()
228 memcpy( bp.table, bp.stored, sizeof( bp.table));
229 memcpy(rbp.table, rbp.stored, sizeof(rbp.table));
230 memcpy(wbp.table, wbp.stored, sizeof(wbp.table));
231 memcpy(ibp.table, ibp.stored, sizeof(ibp.table));
232 memcpy(obp.table, obp.stored, sizeof(obp.table));
236 return (bp.hit || rbp.hit || wbp.hit || ibp.hit || obp.hit);
238 break_point_t bp, rbp, wbp, ibp, obp;
239 _TCHAR file_path[_MAX_PATH];
240 bool now_debugging, now_going, now_suspended;