2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
12 #include "../..//emu.h"
15 #include "../qt/gui/csp_logger.h"
16 extern DLL_PREFIX_I 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;
28 memset(this_device_name, 0x00, sizeof(this_device_name));
29 strncpy(this_device_name, "Base Device", 128 - 1);
30 prev_device = vm->last_device;
32 if(vm->first_device == NULL) {
33 // this is the first device
34 vm->first_device = this;
37 // this is not the first device
38 vm->last_device->next_device = this;
39 this_device_id = vm->last_device->this_device_id + 1;
41 vm->last_device = this;
43 // primary event manager
47 //DEVICE::~DEVICE(void)
52 void DEVICE::release()
56 uint32_t DEVICE::read_io8(uint32_t addr)
58 #ifdef IOBUS_RETURN_ADDR
59 return (addr & 1 ? addr >> 8 : addr) & 0xff;
66 // Sound input functions
68 void DEVICE::clear_sound_in_source(int bank)
70 if(event_manager == NULL) {
71 event_manager = vm->first_device->next_device;
73 event_manager->clear_sound_in_source(bank);
76 // this function may be before (or after) initialize().
77 int DEVICE::add_sound_in_source(int rate, int samples, int channels)
79 if(event_manager == NULL) return -1;
80 return event_manager->add_sound_in_source(rate, samples, channels);
83 // this function may be before (or after) initialize().
84 int DEVICE::release_sound_in_source(int bank)
86 if(event_manager == NULL) return -1;
87 return event_manager->release_sound_in_source(bank);
90 bool DEVICE::is_sound_in_source_exists(int bank)
92 if(event_manager == NULL) {
93 event_manager = vm->first_device->next_device;
95 return event_manager->is_sound_in_source_exists(bank);
98 int DEVICE::increment_sound_in_passed_data(int bank, double passed_usec)
100 if(event_manager == NULL) {
103 return event_manager->increment_sound_in_passed_data(bank, passed_usec);
106 int DEVICE::get_sound_in_buffers_count()
108 if(event_manager == NULL) {
109 event_manager = vm->first_device->next_device;
111 return event_manager->get_sound_in_buffers_count();
114 int DEVICE::get_sound_in_samples(int bank)
116 if(event_manager == NULL) {
117 event_manager = vm->first_device->next_device;
119 return event_manager->get_sound_in_samples(bank);
122 int DEVICE::get_sound_in_rate(int bank)
124 if(event_manager == NULL) {
125 event_manager = vm->first_device->next_device;
127 return event_manager->get_sound_in_rate(bank);
130 int DEVICE::get_sound_in_channels(int bank)
132 if(event_manager == NULL) {
133 event_manager = vm->first_device->next_device;
135 return event_manager->get_sound_in_channels(bank);
138 // this function may be before (or after) initialize().
139 int16_t* DEVICE::get_sound_in_buf_ptr(int bank)
141 if(event_manager == NULL) return NULL;
142 return event_manager->get_sound_in_buf_ptr(bank);
145 int DEVICE::write_sound_in_buffer(int bank, int32_t* src, int samples)
147 if(event_manager == NULL) {
148 event_manager = vm->first_device->next_device;
150 return event_manager->write_sound_in_buffer(bank, src, samples);
153 // Add sampled values to sample buffer;value may be -32768 to +32767.
154 // this function may be before (or after) initialize().
155 int DEVICE::get_sound_in_latest_data(int bank, int32_t* dst, int expect_channels)
157 if(event_manager == NULL) return 0;
158 return event_manager->get_sound_in_latest_data(bank, dst, expect_channels);
161 int DEVICE::get_sound_in_data(int bank, int32_t* dst, int expect_samples, int expect_rate, int expect_channels)
163 if(event_manager == NULL) return -1;
164 return event_manager->get_sound_in_data(bank, dst, expect_samples, expect_rate, expect_channels);
167 int DEVICE::get_event_manager_id()
169 if(event_manager == NULL) {
170 event_manager = vm->first_device->next_device;
172 return event_manager->this_device_id;
174 bool DEVICE::is_primary_cpu(DEVICE* device)
176 if(event_manager == NULL) {
177 event_manager = vm->first_device->next_device;
179 return event_manager->is_primary_cpu(device);
181 void DEVICE::update_extra_event(int clock)
183 if(event_manager == NULL) {
184 event_manager = vm->first_device->next_device;
186 event_manager->update_extra_event(clock);
188 void DEVICE::register_event(DEVICE* device, int event_id, double usec, bool loop, int* register_id)
190 if(event_manager == NULL) {
191 event_manager = vm->first_device->next_device;
193 event_manager->register_event(device, event_id, usec, loop, register_id);
196 void DEVICE::register_event_by_clock(DEVICE* device, int event_id, uint64_t clock, bool loop, int* register_id)
198 if(event_manager == NULL) {
199 event_manager = vm->first_device->next_device;
201 event_manager->register_event_by_clock(device, event_id, clock, loop, register_id);
204 void DEVICE::cancel_event(DEVICE* device, int register_id)
206 if(event_manager == NULL) {
207 event_manager = vm->first_device->next_device;
209 event_manager->cancel_event(device, register_id);
211 void DEVICE::register_frame_event(DEVICE* device)
213 if(event_manager == NULL) {
214 event_manager = vm->first_device->next_device;
216 event_manager->register_frame_event(device);
218 void DEVICE::register_vline_event(DEVICE* device)
220 if(event_manager == NULL) {
221 event_manager = vm->first_device->next_device;
223 event_manager->register_vline_event(device);
225 uint32_t DEVICE::get_event_remaining_clock(int register_id)
227 if(event_manager == NULL) {
228 event_manager = vm->first_device->next_device;
230 return event_manager->get_event_remaining_clock(register_id);
233 double DEVICE::get_event_remaining_usec(int register_id)
235 if(event_manager == NULL) {
236 event_manager = vm->first_device->next_device;
238 return event_manager->get_event_remaining_usec(register_id);
241 uint32_t DEVICE::get_current_clock()
243 if(event_manager == NULL) {
244 event_manager = vm->first_device->next_device;
246 return event_manager->get_current_clock();
249 uint32_t DEVICE::get_passed_clock(uint32_t prev)
251 if(event_manager == NULL) {
252 event_manager = vm->first_device->next_device;
254 return event_manager->get_passed_clock(prev);
257 double DEVICE::get_passed_usec(uint32_t prev)
259 if(event_manager == NULL) {
260 event_manager = vm->first_device->next_device;
262 return event_manager->get_passed_usec(prev);
265 uint32_t DEVICE::get_passed_clock_since_vline()
267 if(event_manager == NULL) {
268 event_manager = vm->first_device->next_device;
270 return event_manager->get_passed_clock_since_vline();
273 double DEVICE::get_passed_usec_since_vline()
275 if(event_manager == NULL) {
276 event_manager = vm->first_device->next_device;
278 return event_manager->get_passed_usec_since_vline();
281 int DEVICE::get_cur_vline()
283 if(event_manager == NULL) {
284 event_manager = vm->first_device->next_device;
286 return event_manager->get_cur_vline();
289 int DEVICE::get_cur_vline_clocks()
291 if(event_manager == NULL) {
292 event_manager = vm->first_device->next_device;
294 return event_manager->get_cur_vline_clocks();
297 uint32_t DEVICE::get_cpu_pc(int index)
299 if(event_manager == NULL) {
300 event_manager = vm->first_device->next_device;
302 return event_manager->get_cpu_pc(index);
305 void DEVICE::request_skip_frames()
307 if(event_manager == NULL) {
308 event_manager = vm->first_device->next_device;
310 event_manager->request_skip_frames();
313 void DEVICE::set_frames_per_sec(double frames)
315 if(event_manager == NULL) {
316 event_manager = vm->first_device->next_device;
318 event_manager->set_frames_per_sec(frames);
321 void DEVICE::set_lines_per_frame(int lines)
323 if(event_manager == NULL) {
324 event_manager = vm->first_device->next_device;
326 event_manager->set_lines_per_frame(lines);
329 int DEVICE::get_lines_per_frame()
331 if(event_manager == NULL) {
332 event_manager = vm->first_device->next_device;
334 return event_manager->get_lines_per_frame();
337 // Force render sound immediately when device's status has changed.
338 // You must call this after you changing registers (or anything).
339 // If has problems, try set_realtime_render.
340 // See mb8877.cpp and ym2203.cpp.
342 void DEVICE::touch_sound(void)
344 if(event_manager == NULL) {
345 event_manager = vm->first_device->next_device;
347 event_manager->touch_sound();
349 // Force render per 1 sample automatically.
352 void DEVICE::set_realtime_render(DEVICE *device, bool flag)
354 if(event_manager == NULL) {
355 event_manager = vm->first_device->next_device;
357 if(device != event_manager) event_manager->set_realtime_render(device, flag);
360 void DEVICE::set_device_name(const _TCHAR *format, ...)
366 va_start(ap, format);
367 my_vstprintf_s(buffer, 1024, format, ap);
370 my_tcscpy_s(this_device_name, 128, buffer);
372 emu->get_osd()->set_vm_node(this_device_id, buffer);
377 void DEVICE::out_debug_log(const char *fmt, ...)
380 if(p_logger == NULL) return;
385 vsnprintf(strbuf, 4095, fmt, ap);
386 p_logger->debug_log(CSP_LOG_DEBUG, this_device_id + CSP_LOG_TYPE_VM_DEVICE_0, "%s", strbuf);
393 vsnprintf(strbuf, 4095, fmt, ap);
394 emu->out_debug_log("%s", strbuf);
399 void DEVICE::force_out_debug_log(const char *fmt, ...)
405 vsnprintf(strbuf, 4095, fmt, ap);
406 emu->force_out_debug_log("%s", strbuf);
411 bool DEVICE::is_cpu()
415 bool DEVICE::is_debugger()
419 bool DEVICE::is_debugger_available()
423 void *DEVICE::get_debugger()
427 uint32_t DEVICE::get_debug_prog_addr_mask()
432 uint32_t DEVICE::get_debug_data_addr_mask()
437 uint64_t DEVICE::get_debug_data_addr_space()
439 // override this function when memory space is not (2 << n)
440 return (uint64_t)get_debug_data_addr_mask() + 1;
442 void DEVICE::write_debug_data8(uint32_t addr, uint32_t data)
444 // write_data8(addr, data);
446 uint32_t DEVICE::read_debug_data8(uint32_t addr)
448 // return read_data8(addr);
451 void DEVICE::write_debug_data16(uint32_t addr, uint32_t data)
453 write_debug_data8(addr, data & 0xff);
454 write_debug_data8(addr + 1, (data >> 8) & 0xff);
456 uint32_t DEVICE::read_debug_data16(uint32_t addr)
458 uint32_t val = read_debug_data8(addr);
459 val |= read_debug_data8(addr + 1) << 8;
462 void DEVICE::write_debug_data32(uint32_t addr, uint32_t data)
464 write_debug_data16(addr, data & 0xffff);
465 write_debug_data16(addr + 2, (data >> 16) & 0xffff);
467 uint32_t DEVICE::read_debug_data32(uint32_t addr)
469 uint32_t val = read_debug_data16(addr);
470 val |= read_debug_data16(addr + 2) << 16;
473 void DEVICE::write_debug_io8(uint32_t addr, uint32_t data)
475 // write_io8(addr, data);
477 uint32_t DEVICE::read_debug_io8(uint32_t addr)
479 // return read_io8(addr);
482 void DEVICE::write_debug_io16(uint32_t addr, uint32_t data)
484 write_debug_io8(addr, data & 0xff);
485 write_debug_io8(addr + 1, (data >> 8) & 0xff);
487 uint32_t DEVICE::read_debug_io16(uint32_t addr)
489 uint32_t val = read_debug_io8(addr);
490 val |= read_debug_io8(addr + 1) << 8;
493 void DEVICE::write_debug_io32(uint32_t addr, uint32_t data)
495 write_debug_io16(addr, data & 0xffff);
496 write_debug_io16(addr + 2, (data >> 16) & 0xffff);
498 uint32_t DEVICE::read_debug_io32(uint32_t addr)
500 uint32_t val = read_debug_io16(addr);
501 val |= read_debug_io16(addr + 2) << 16;
504 bool DEVICE::write_debug_reg(const _TCHAR *reg, uint32_t data)
508 uint32_t DEVICE::read_debug_reg(const _TCHAR *reg)
512 bool DEVICE::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
516 int DEVICE::debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
521 These functions are used for debugging non-cpu device
522 Insert debugger between standard read/write functions and these functions for checking breakpoints
524 void DEVICE::write_data8(uint32_t addr, uint32_t data)
526 if(debugger != NULL && debugger->now_device_debugging) {
527 // debugger->mem = this;
528 // debugger->mem->write_via_debugger_data8(addr, data)
529 debugger->write_via_debugger_data8(addr, data);
531 this->write_via_debugger_data8(addr, data);
534 void DEVICE::write_via_debugger_data8(uint32_t addr, uint32_t data)
540 void DEVICE::write_via_debugger_data8(uint32_t addr, uint32_t data)
543 uint32_t DEVICE::read_via_debugger_data8(uint32_t addr)
547 void DEVICE::write_via_debugger_data16(uint32_t addr, uint32_t data)
550 uint32_t DEVICE::read_via_debugger_data16(uint32_t addr)
554 void DEVICE::write_via_debugger_data32(uint32_t addr, uint32_t data)
557 uint32_t DEVICE::read_via_debugger_data32(uint32_t addr)
561 void DEVICE::write_via_debugger_data8w(uint32_t addr, uint32_t data, int* wait)
564 uint32_t DEVICE::read_via_debugger_data8w(uint32_t addr, int* wait)
568 void DEVICE::write_via_debugger_data16w(uint32_t addr, uint32_t data, int* wait)
571 uint32_t DEVICE::read_via_debugger_data16w(uint32_t addr, int* wait)
575 void DEVICE::write_via_debugger_data32w(uint32_t addr, uint32_t data, int* wait)
578 uint32_t DEVICE::read_via_debugger_data32w(uint32_t addr, int* wait)
582 void DEVICE::write_via_debugger_io8(uint32_t addr, uint32_t data)
585 uint32_t DEVICE::read_via_debugger_io8(uint32_t addr)
589 void DEVICE::write_via_debugger_io16(uint32_t addr, uint32_t data)
592 uint32_t DEVICE::read_via_debugger_io16(uint32_t addr)
596 void DEVICE::write_via_debugger_io32(uint32_t addr, uint32_t data)
599 uint32_t DEVICE::read_via_debugger_io32(uint32_t addr)
603 void DEVICE::write_via_debugger_io8w(uint32_t addr, uint32_t data, int* wait)
606 uint32_t DEVICE::read_via_debugger_io8w(uint32_t addr, int* wait)
610 void DEVICE::write_via_debugger_io16w(uint32_t addr, uint32_t data, int* wait)
613 uint32_t DEVICE::read_via_debugger_io16w(uint32_t addr, int* wait)
617 void DEVICE::write_via_debugger_io32w(uint32_t addr, uint32_t data, int* wait)
620 uint32_t DEVICE::read_via_debugger_io32w(uint32_t addr, int* wait)
626 const _TCHAR *DEVICE::get_lib_common_vm_version(void)
628 #if defined(__LIBRARY_NAME)
629 return (const _TCHAR *)__LIBRARY_NAME;
631 return (const _TCHAR *)"\0";