2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
12 #include "../..//emu.h"
15 #include "../qt/gui/csp_logger.h"
16 extern CSP_Logger *csp_logger;
19 DEVICE::DEVICE(VM_TEMPLATE* parent_vm, EMU* parent_emu) : vm(parent_vm), emu(parent_emu)
26 p_logger = csp_logger;
29 memset(this_device_name, 0x00, sizeof(this_device_name));
30 strncpy(this_device_name, "Base Device", 128 - 1);
31 prev_device = vm->last_device;
33 if(vm->first_device == NULL) {
34 // this is the first device
35 vm->first_device = this;
38 // this is not the first device
39 vm->last_device->next_device = this;
40 this_device_id = vm->last_device->this_device_id + 1;
42 vm->last_device = this;
44 // primary event manager
48 //DEVICE::~DEVICE(void)
53 void DEVICE::release()
55 if(state_entry != NULL) delete state_entry;
59 uint32_t DEVICE::read_io8(uint32_t addr)
61 #ifdef IOBUS_RETURN_ADDR
62 return (addr & 1 ? addr >> 8 : addr) & 0xff;
68 int DEVICE::get_event_manager_id()
70 if(event_manager == NULL) {
71 event_manager = vm->first_device->next_device;
73 return event_manager->this_device_id;
75 void DEVICE::register_event(DEVICE* device, int event_id, double usec, bool loop, int* register_id)
77 if(event_manager == NULL) {
78 event_manager = vm->first_device->next_device;
80 event_manager->register_event(device, event_id, usec, loop, register_id);
83 void DEVICE::register_event_by_clock(DEVICE* device, int event_id, uint64_t clock, bool loop, int* register_id)
85 if(event_manager == NULL) {
86 event_manager = vm->first_device->next_device;
88 event_manager->register_event_by_clock(device, event_id, clock, loop, register_id);
91 void DEVICE::cancel_event(DEVICE* device, int register_id)
93 if(event_manager == NULL) {
94 event_manager = vm->first_device->next_device;
96 event_manager->cancel_event(device, register_id);
98 void DEVICE::register_frame_event(DEVICE* device)
100 if(event_manager == NULL) {
101 event_manager = vm->first_device->next_device;
103 event_manager->register_frame_event(device);
105 void DEVICE::register_vline_event(DEVICE* device)
107 if(event_manager == NULL) {
108 event_manager = vm->first_device->next_device;
110 event_manager->register_vline_event(device);
112 uint32_t DEVICE::get_event_remaining_clock(int register_id)
114 if(event_manager == NULL) {
115 event_manager = vm->first_device->next_device;
117 return event_manager->get_event_remaining_clock(register_id);
120 double DEVICE::get_event_remaining_usec(int register_id)
122 if(event_manager == NULL) {
123 event_manager = vm->first_device->next_device;
125 return event_manager->get_event_remaining_usec(register_id);
128 uint32_t DEVICE::get_current_clock()
130 if(event_manager == NULL) {
131 event_manager = vm->first_device->next_device;
133 return event_manager->get_current_clock();
136 uint32_t DEVICE::get_passed_clock(uint32_t prev)
138 if(event_manager == NULL) {
139 event_manager = vm->first_device->next_device;
141 return event_manager->get_passed_clock(prev);
144 double DEVICE::get_passed_usec(uint32_t prev)
146 if(event_manager == NULL) {
147 event_manager = vm->first_device->next_device;
149 return event_manager->get_passed_usec(prev);
152 uint32_t DEVICE::get_passed_clock_since_vline()
154 if(event_manager == NULL) {
155 event_manager = vm->first_device->next_device;
157 return event_manager->get_passed_clock_since_vline();
160 double DEVICE::get_passed_usec_since_vline()
162 if(event_manager == NULL) {
163 event_manager = vm->first_device->next_device;
165 return event_manager->get_passed_usec_since_vline();
168 int DEVICE::get_cur_vline()
170 if(event_manager == NULL) {
171 event_manager = vm->first_device->next_device;
173 return event_manager->get_cur_vline();
176 int DEVICE::get_cur_vline_clocks()
178 if(event_manager == NULL) {
179 event_manager = vm->first_device->next_device;
181 return event_manager->get_cur_vline_clocks();
184 uint32_t DEVICE::get_cpu_pc(int index)
186 if(event_manager == NULL) {
187 event_manager = vm->first_device->next_device;
189 return event_manager->get_cpu_pc(index);
192 void DEVICE::request_skip_frames()
194 if(event_manager == NULL) {
195 event_manager = vm->first_device->next_device;
197 event_manager->request_skip_frames();
200 void DEVICE::set_frames_per_sec(double frames)
202 if(event_manager == NULL) {
203 event_manager = vm->first_device->next_device;
205 event_manager->set_frames_per_sec(frames);
208 void DEVICE::set_lines_per_frame(int lines)
210 if(event_manager == NULL) {
211 event_manager = vm->first_device->next_device;
213 event_manager->set_lines_per_frame(lines);
216 int DEVICE::get_lines_per_frame()
218 if(event_manager == NULL) {
219 event_manager = vm->first_device->next_device;
221 return event_manager->get_lines_per_frame();
224 #include "../../statesub.h"
226 void DEVICE::decl_state()
228 state_entry = new csp_state_utils(1, this_device_id, (const _TCHAR *)this_device_name, p_logger);
231 void DEVICE::enter_decl_state(int version)
233 state_entry = new csp_state_utils(version, this_device_id, (const _TCHAR *)this_device_name, p_logger);
236 void DEVICE::enter_decl_state(int version, _TCHAR *name)
238 state_entry = new csp_state_utils(version, this_device_id, (const _TCHAR *)name, p_logger);
241 void DEVICE::leave_decl_state()
244 // Force render sound immediately when device's status has changed.
245 // You must call this after you changing registers (or anything).
246 // If has problems, try set_realtime_render.
247 // See mb8877.cpp and ym2203.cpp.
249 void DEVICE::touch_sound(void)
251 if(event_manager == NULL) {
252 event_manager = vm->first_device->next_device;
254 event_manager->touch_sound();
256 // Force render per 1 sample automatically.
259 void DEVICE::set_realtime_render(DEVICE *device, bool flag)
261 if(event_manager == NULL) {
262 event_manager = vm->first_device->next_device;
264 if(device != event_manager) event_manager->set_realtime_render(device, flag);
267 void DEVICE::set_device_name(const _TCHAR *format, ...)
273 va_start(ap, format);
274 my_vstprintf_s(buffer, 1024, format, ap);
277 my_tcscpy_s(this_device_name, 128, buffer);
279 emu->get_osd()->set_vm_node(this_device_id, buffer);
284 void DEVICE::out_debug_log(const char *fmt, ...)
287 if(p_logger == NULL) return;
292 vsnprintf(strbuf, 4095, fmt, ap);
293 p_logger->debug_log(CSP_LOG_DEBUG, this_device_id + CSP_LOG_TYPE_VM_DEVICE_0, "%s", strbuf);
300 vsnprintf(strbuf, 4095, fmt, ap);
301 emu->out_debug_log("%s", strbuf);
306 void DEVICE::force_out_debug_log(const char *fmt, ...)
312 vsnprintf(strbuf, 4095, fmt, ap);
313 emu->force_out_debug_log("%s", strbuf);
318 void *DEVICE::get_debugger()
322 uint32_t DEVICE::get_debug_prog_addr_mask()
327 uint32_t DEVICE::get_debug_data_addr_mask()
332 void DEVICE::write_debug_data8(uint32_t addr, uint32_t data)
336 uint32_t DEVICE::read_debug_data8(uint32_t addr)
341 void DEVICE::write_debug_data16(uint32_t addr, uint32_t data)
343 write_debug_data8(addr, data & 0xff);
344 write_debug_data8(addr + 1, (data >> 8) & 0xff);
347 uint32_t DEVICE::read_debug_data16(uint32_t addr)
349 uint32_t val = read_debug_data8(addr);
350 val |= read_debug_data8(addr + 1) << 8;
354 void DEVICE::write_debug_data32(uint32_t addr, uint32_t data)
356 write_debug_data16(addr, data & 0xffff);
357 write_debug_data16(addr + 2, (data >> 16) & 0xffff);
360 uint32_t DEVICE::read_debug_data32(uint32_t addr)
362 uint32_t val = read_debug_data16(addr);
363 val |= read_debug_data16(addr + 2) << 16;
367 void DEVICE::write_debug_io8(uint32_t addr, uint32_t data)
371 uint32_t DEVICE::read_debug_io8(uint32_t addr)
375 void DEVICE::write_debug_io16(uint32_t addr, uint32_t data)
377 write_debug_io8(addr, data & 0xff);
378 write_debug_io8(addr + 1, (data >> 8) & 0xff);
381 uint32_t DEVICE::read_debug_io16(uint32_t addr)
383 uint32_t val = read_debug_io8(addr);
384 val |= read_debug_io8(addr + 1) << 8;
388 void DEVICE::write_debug_io32(uint32_t addr, uint32_t data)
390 write_debug_io16(addr, data & 0xffff);
391 write_debug_io16(addr + 2, (data >> 16) & 0xffff);
394 uint32_t DEVICE::read_debug_io32(uint32_t addr)
396 uint32_t val = read_debug_io16(addr);
397 val |= read_debug_io16(addr + 2) << 16;
401 bool DEVICE::write_debug_reg(const _TCHAR *reg, uint32_t data)
406 void DEVICE::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
410 int DEVICE::debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)