2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
10 #include "../common.h"
14 #include "../../emu.h"
21 DEVICE::DEVICE(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : vm(parent_vm), emu(parent_emu)
23 __IOBUS_RETURN_ADDR = false;
26 p_logger = osd->get_logger();
31 memset(this_device_name, 0x00, sizeof(this_device_name));
32 strncpy(this_device_name, "Base Device", 128 - 1);
33 prev_device = vm->last_device;
35 if(vm->first_device == NULL) {
36 // this is the first device
37 vm->first_device = this;
40 // this is not the first device
41 vm->last_device->next_device = this;
42 this_device_id = vm->last_device->this_device_id + 1;
44 vm->last_device = this;
45 // primary event manager
53 void DEVICE::initialize()
57 #if defined(IOBUS_RETURN_ADDR)
58 __IOBUS_RETURN_ADDR = true;
61 __IOBUS_RETURN_ADDR = osd->check_feature(_T("IOBUS_RETURN_ADDR"));
63 #elif defined(IOBUS_RETURN_ADDR)
64 __IOBUS_RETURN_ADDR = true;
66 /* Initializing VM must be after initializing OSD. */
69 void DEVICE::release()
77 void DEVICE::special_reset(int num)
83 uint32_t DEVICE::translate_address(int segment, uint32_t offset)
88 void DEVICE::write_data8(uint32_t addr, uint32_t data)
92 uint32_t DEVICE::read_data8(uint32_t addr)
97 void DEVICE::write_data16(uint32_t addr, uint32_t data)
99 write_data8(addr, (data ) & 0xff);
100 write_data8(addr + 1, (data >> 8) & 0xff);
103 uint32_t DEVICE::read_data16(uint32_t addr)
106 val = read_data8(addr );
107 val |= read_data8(addr + 1) << 8;
111 void DEVICE::write_data32(uint32_t addr, uint32_t data)
113 __LIKELY_IF(!(addr & 1)) {
114 write_data16(addr, (data ) & 0xffff);
115 write_data16(addr + 2, (data >> 16) & 0xffff);
117 write_data8 (addr, (data ) & 0x00ff);
118 write_data16(addr + 1, (data >> 8) & 0xffff);
119 write_data8 (addr + 3, (data >> 24) & 0x00ff);
123 uint32_t DEVICE::read_data32(uint32_t addr)
125 __LIKELY_IF(!(addr & 1)) {
127 val = read_data16(addr );
128 val |= read_data16(addr + 2) << 16;
132 val = read_data8 (addr );
133 val |= read_data16(addr + 1) << 8;
134 val |= read_data8 (addr + 3) << 24;
139 void DEVICE::write_data8w(uint32_t addr, uint32_t data, int* wait)
142 write_data8(addr, data);
145 uint32_t DEVICE::read_data8w(uint32_t addr, int* wait)
148 return read_data8(addr);
150 void DEVICE::write_data16w(uint32_t addr, uint32_t data, int* wait)
153 write_data8w(addr, (data ) & 0xff, &wait_0);
154 write_data8w(addr + 1, (data >> 8) & 0xff, &wait_1);
155 *wait = wait_0 + wait_1;
158 uint32_t DEVICE::read_data16w(uint32_t addr, int* wait)
162 val = read_data8w(addr, &wait_0);
163 val |= read_data8w(addr + 1, &wait_1) << 8;
164 *wait = wait_0 + wait_1;
168 void DEVICE::write_data32w(uint32_t addr, uint32_t data, int* wait)
170 __LIKELY_IF(!(addr & 1)) {
172 write_data16w(addr, (data ) & 0xffff, &wait_0);
173 write_data16w(addr + 2, (data >> 16) & 0xffff, &wait_1);
174 *wait = wait_0 + wait_1;
176 int wait_0, wait_1, wait_2;
177 write_data8w (addr, (data ) & 0x00ff, &wait_0);
178 write_data16w(addr + 1, (data >> 8) & 0xffff, &wait_1);
179 write_data8w (addr + 3, (data >> 24) & 0x00ff, &wait_2);
180 *wait = wait_0 + wait_1 + wait_2;
184 uint32_t DEVICE::read_data32w(uint32_t addr, int* wait)
186 __LIKELY_IF(!(addr & 1)) {
189 val = read_data16w(addr, &wait_0);
190 val |= read_data16w(addr + 2, &wait_1) << 16;
191 *wait = wait_0 + wait_1;
194 int wait_0, wait_1, wait_2;
196 val = read_data8w (addr, &wait_0);
197 val |= read_data16w(addr + 1, &wait_1) << 8;
198 val |= read_data8w (addr + 3, &wait_2) << 24;
199 *wait = wait_0 + wait_1 + wait_2;
204 uint32_t DEVICE::fetch_op(uint32_t addr, int *wait)
206 return read_data8w(addr, wait);
209 void DEVICE::write_dma_data8(uint32_t addr, uint32_t data)
211 write_data8(addr, data);
214 uint32_t DEVICE::read_dma_data8(uint32_t addr)
216 return read_data8(addr);
219 void DEVICE::write_dma_data16(uint32_t addr, uint32_t data)
221 write_data16(addr, data);
224 uint32_t DEVICE::read_dma_data16(uint32_t addr)
226 return read_data16(addr);
228 void DEVICE::write_dma_data32(uint32_t addr, uint32_t data)
230 write_data32(addr, data);
233 uint32_t DEVICE::read_dma_data32(uint32_t addr)
235 return read_data32(addr);
239 void DEVICE::write_dma_data8w(uint32_t addr, uint32_t data, int* wait)
241 write_data8w(addr, data, wait);
244 uint32_t DEVICE::read_dma_data8w(uint32_t addr, int* wait)
246 return read_data8w(addr, wait);
249 void DEVICE::write_dma_data16w(uint32_t addr, uint32_t data, int* wait)
251 write_data16w(addr, data, wait);
254 uint32_t DEVICE::read_dma_data16w(uint32_t addr, int* wait)
256 return read_data16w(addr, wait);
259 void DEVICE::write_dma_data32w(uint32_t addr, uint32_t data, int* wait)
261 write_data32w(addr, data, wait);
264 uint32_t DEVICE::read_dma_data32w(uint32_t addr, int* wait)
266 return read_data32w(addr, wait);
271 void DEVICE::write_io8(uint32_t addr, uint32_t data)
275 uint32_t DEVICE::read_io8(uint32_t addr)
277 __UNLIKELY_IF(__IOBUS_RETURN_ADDR) {
278 return (addr & 1 ? addr >> 8 : addr) & 0xff;
284 void DEVICE::write_io16(uint32_t addr, uint32_t data)
286 write_io8(addr , (data ) & 0xff);
287 write_io8(addr + 1, (data >> 8) & 0xff);
290 uint32_t DEVICE::read_io16(uint32_t addr)
293 val = read_io8(addr );
294 val |= read_io8(addr + 1) << 8;
298 void DEVICE::write_io32(uint32_t addr, uint32_t data)
300 __LIKELY_IF(!(addr & 1)) {
301 write_io16(addr, (data ) & 0xffff);
302 write_io16(addr + 2, (data >> 16) & 0xffff);
304 write_io8 (addr, (data ) & 0x00ff);
305 write_io16(addr + 1, (data >> 8) & 0xffff);
306 write_io8 (addr + 3, (data >> 24) & 0x00ff);
310 uint32_t DEVICE::read_io32(uint32_t addr)
312 __LIKELY_IF(!(addr & 1)) {
314 val = read_io16(addr );
315 val |= read_io16(addr + 2) << 16;
319 val = read_io8 (addr );
320 val |= read_io16(addr + 1) << 8;
321 val |= read_io8 (addr + 3) << 24;
326 void DEVICE::write_io8w(uint32_t addr, uint32_t data, int* wait)
329 write_io8(addr, data);
332 uint32_t DEVICE::read_io8w(uint32_t addr, int* wait)
335 return read_io8(addr);
338 void DEVICE::write_io16w(uint32_t addr, uint32_t data, int* wait)
341 write_io8w(addr, (data ) & 0xff, &wait_0);
342 write_io8w(addr + 1, (data >> 8) & 0xff, &wait_1);
343 *wait = wait_0 + wait_1;
346 uint32_t DEVICE::read_io16w(uint32_t addr, int* wait)
350 val = read_io8w(addr, &wait_0);
351 val |= read_io8w(addr + 1, &wait_1) << 8;
352 *wait = wait_0 + wait_1;
356 void DEVICE::write_io32w(uint32_t addr, uint32_t data, int* wait)
358 __LIKELY_IF(!(addr & 1)) {
360 write_io16w(addr, (data ) & 0xffff, &wait_0);
361 write_io16w(addr + 2, (data >> 16) & 0xffff, &wait_1);
362 *wait = wait_0 + wait_1;
364 int wait_0, wait_1, wait_2;
365 write_io8w (addr, (data ) & 0x00ff, &wait_0);
366 write_io16w(addr + 1, (data >> 8) & 0xffff, &wait_1);
367 write_io8w (addr + 3, (data >> 24) & 0x00ff, &wait_2);
368 *wait = wait_0 + wait_1 + wait_2;
372 uint32_t DEVICE::read_io32w(uint32_t addr, int* wait)
374 __LIKELY_IF(!(addr & 1)) {
377 val = read_io16w(addr, &wait_0);
378 val |= read_io16w(addr + 2, &wait_1) << 16;
379 *wait = wait_0 + wait_1;
382 int wait_0, wait_1, wait_2;
384 val = read_io8w (addr, &wait_0);
385 val |= read_io16w(addr + 1, &wait_1) << 8;
386 val |= read_io8w (addr + 3, &wait_2) << 24;
387 *wait = wait_0 + wait_1 + wait_2;
392 void DEVICE::write_dma_io8(uint32_t addr, uint32_t data)
394 write_io8(addr, data);
397 uint32_t DEVICE::read_dma_io8(uint32_t addr)
399 return read_io8(addr);
402 void DEVICE::write_dma_io16(uint32_t addr, uint32_t data)
404 write_io16(addr, data);
407 uint32_t DEVICE::read_dma_io16(uint32_t addr)
409 return read_io16(addr);
412 void DEVICE::write_dma_io32(uint32_t addr, uint32_t data)
414 write_io32(addr, data);
417 uint32_t DEVICE::read_dma_io32(uint32_t addr)
419 return read_io32(addr);
422 void DEVICE::write_dma_io8w(uint32_t addr, uint32_t data, int* wait)
424 write_io8w(addr, data, wait);
427 uint32_t DEVICE::read_dma_io8w(uint32_t addr, int* wait)
429 return read_io8w(addr, wait);
432 void DEVICE::write_dma_io16w(uint32_t addr, uint32_t data, int* wait)
434 write_io16w(addr, data, wait);
437 uint32_t DEVICE::read_dma_io16w(uint32_t addr, int* wait)
439 return read_io16w(addr, wait);
442 void DEVICE::write_dma_io32w(uint32_t addr, uint32_t data, int* wait)
444 write_io32w(addr, data, wait);
447 uint32_t DEVICE::read_dma_io32w(uint32_t addr, int* wait)
449 return read_io32w(addr, wait);
453 void DEVICE::write_memory_mapped_io8(uint32_t addr, uint32_t data)
455 write_io8(addr, data);
458 uint32_t DEVICE::read_memory_mapped_io8(uint32_t addr)
460 return read_io8(addr);
463 void DEVICE::write_memory_mapped_io16(uint32_t addr, uint32_t data)
465 write_memory_mapped_io8(addr, (data ) & 0xff);
466 write_memory_mapped_io8(addr + 1, (data >> 8) & 0xff);
469 uint32_t DEVICE::read_memory_mapped_io16(uint32_t addr)
472 val = read_memory_mapped_io8(addr );
473 val |= read_memory_mapped_io8(addr + 1) << 8;
477 void DEVICE::write_memory_mapped_io32(uint32_t addr, uint32_t data)
479 __LIKELY_IF(!(addr & 1)) {
480 write_memory_mapped_io16(addr, (data ) & 0xffff);
481 write_memory_mapped_io16(addr + 2, (data >> 16) & 0xffff);
483 write_memory_mapped_io8 (addr, (data ) & 0x00ff);
484 write_memory_mapped_io16(addr + 1, (data >> 8) & 0xffff);
485 write_memory_mapped_io8 (addr + 3, (data >> 24) & 0x00ff);
489 uint32_t DEVICE::read_memory_mapped_io32(uint32_t addr)
491 __LIKELY_IF(!(addr & 1)) {
493 val = read_memory_mapped_io16(addr );
494 val |= read_memory_mapped_io16(addr + 2) << 16;
498 val = read_memory_mapped_io8 (addr );
499 val |= read_memory_mapped_io16(addr + 1) << 8;
500 val |= read_memory_mapped_io8 (addr + 3) << 24;
505 void DEVICE::write_memory_mapped_io8w(uint32_t addr, uint32_t data, int* wait)
508 write_memory_mapped_io8(addr, data);
511 uint32_t DEVICE::read_memory_mapped_io8w(uint32_t addr, int* wait)
514 return read_memory_mapped_io8(addr);
517 void DEVICE::write_memory_mapped_io16w(uint32_t addr, uint32_t data, int* wait)
520 write_memory_mapped_io8w(addr, (data ) & 0xff, &wait_0);
521 write_memory_mapped_io8w(addr + 1, (data >> 8) & 0xff, &wait_1);
522 *wait = wait_0 + wait_1;
525 uint32_t DEVICE::read_memory_mapped_io16w(uint32_t addr, int* wait)
529 val = read_memory_mapped_io8w(addr, &wait_0);
530 val |= read_memory_mapped_io8w(addr + 1, &wait_1) << 8;
531 *wait = wait_0 + wait_1;
535 void DEVICE::write_memory_mapped_io32w(uint32_t addr, uint32_t data, int* wait)
537 __LIKELY_IF(!(addr & 1)) {
539 write_memory_mapped_io16w(addr, (data ) & 0xffff, &wait_0);
540 write_memory_mapped_io16w(addr + 2, (data >> 16) & 0xffff, &wait_1);
541 *wait = wait_0 + wait_1;
543 int wait_0, wait_1, wait_2;
544 write_memory_mapped_io8w (addr, (data ) & 0x00ff, &wait_0);
545 write_memory_mapped_io16w(addr + 1, (data >> 8) & 0xffff, &wait_1);
546 write_memory_mapped_io8w (addr + 3, (data >> 24) & 0x00ff, &wait_2);
547 *wait = wait_0 + wait_1 + wait_2;
551 uint32_t DEVICE::read_memory_mapped_io32w(uint32_t addr, int* wait)
553 __LIKELY_IF(!(addr & 1)) {
556 val = read_memory_mapped_io16w(addr, &wait_0);
557 val |= read_memory_mapped_io16w(addr + 2, &wait_1) << 16;
558 *wait = wait_0 + wait_1;
561 int wait_0, wait_1, wait_2;
563 val = read_memory_mapped_io8w (addr, &wait_0);
564 val |= read_memory_mapped_io16w(addr + 1, &wait_1) << 8;
565 val |= read_memory_mapped_io8w (addr + 3, &wait_2) << 24;
566 *wait = wait_0 + wait_1 + wait_2;
571 //<! device to device
572 void DEVICE::initialize_output_signals(outputs_t *items)
577 void DEVICE::register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask, int shift)
579 int c = items->count++;
580 items->item[c].device = device;
581 items->item[c].id = id;
582 items->item[c].mask = mask;
583 items->item[c].shift = shift;
586 void DEVICE::register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask)
588 int c = items->count++;
589 items->item[c].device = device;
590 items->item[c].id = id;
591 items->item[c].mask = mask;
592 items->item[c].shift = 0;
596 void DEVICE::write_signals(outputs_t *items, uint32_t data)
598 for(int i = 0; i < items->count; i++) {
599 output_t *item = &items->item[i];
600 int shift = item->shift;
601 uint32_t val = (shift < 0) ? (data >> (-shift)) : (data << shift);
602 uint32_t mask = (shift < 0) ? (item->mask >> (-shift)) : (item->mask << shift);
603 item->device->write_signal(item->id, val, mask);
607 void DEVICE::update_signal_mask(outputs_t *items, DEVICE *device, uint32_t mask)
609 if(items == NULL) return;
610 int c = items->count;
612 if(c >= MAX_OUTPUT) c = MAX_OUTPUT - 1;
613 // if (ARG:device == NULL) apply to all devices.
614 for(int i = 0; i < c; i++) {
615 if((device == NULL) || (device == items->item[i].device)) {
616 items->item[i].mask = mask;
621 void DEVICE::write_signal(int id, uint32_t data, uint32_t mask)
625 uint32_t DEVICE::read_signal(int ch)
631 void DEVICE::set_context_intr(DEVICE* device, uint32_t bit)
635 void DEVICE::set_context_child(DEVICE* device)
639 DEVICE *DEVICE::get_context_child()
644 void DEVICE::set_intr_iei(bool val)
648 void DEVICE::set_intr_line(bool line, bool pending, uint32_t bit)
652 // interrupt cpu to device
653 uint32_t DEVICE::get_intr_ack()
658 void DEVICE::update_intr()
663 void DEVICE::notify_intr_reti()
667 void DEVICE::notify_intr_ei()
671 void DEVICE::do_dma()
676 int DEVICE::run(int clock)
678 // when clock == -1, run one opecode
679 return (clock == -1 ? 1 : clock);
682 void DEVICE::set_extra_clock(int clock)
686 int DEVICE::get_extra_clock()
691 uint32_t DEVICE::get_pc()
696 uint32_t DEVICE::get_next_pc()
702 bool DEVICE::bios_call_far_i86(uint32_t PC, uint16_t regs[], const uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag, int* cycles, uint64_t* total_cycles)
706 bool DEVICE::bios_int_i86(int intnum, uint16_t regs[], const uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag, int* cycles, uint64_t* total_cycles)
710 bool DEVICE::bios_call_far_ia32(uint32_t PC, uint32_t regs[], const uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag, int* cycles, uint64_t* total_cycles)
714 bool DEVICE::bios_int_ia32(int intnum, uint32_t regs[], const uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag, int* cycles, uint64_t* total_cycles)
718 bool DEVICE::bios_ret_z80(uint16_t PC, pair32_t* af, pair32_t* bc, pair32_t* de, pair32_t* hl, pair32_t* ix, pair32_t* iy, uint8_t* iff1)
725 // Sound input functions
727 void DEVICE::clear_sound_in_source(int bank)
729 if(event_manager == NULL) {
730 event_manager = vm->first_device->next_device;
732 event_manager->clear_sound_in_source(bank);
737 // this function may be before (or after) initialize().
738 int DEVICE::add_sound_in_source(int rate, int samples, int channels)
740 if(event_manager == NULL) return -1;
741 return event_manager->add_sound_in_source(rate, samples, channels);
744 // this function may be before (or after) initialize().
745 int DEVICE::release_sound_in_source(int bank)
747 if(event_manager == NULL) return -1;
748 return event_manager->release_sound_in_source(bank);
751 bool DEVICE::is_sound_in_source_exists(int bank)
753 if(event_manager == NULL) {
754 event_manager = vm->first_device->next_device;
756 return event_manager->is_sound_in_source_exists(bank);
759 int DEVICE::increment_sound_in_passed_data(int bank, double passed_usec)
761 if(event_manager == NULL) {
764 return event_manager->increment_sound_in_passed_data(bank, passed_usec);
767 int DEVICE::get_sound_in_buffers_count()
769 if(event_manager == NULL) {
770 event_manager = vm->first_device->next_device;
772 return event_manager->get_sound_in_buffers_count();
775 int DEVICE::get_sound_in_samples(int bank)
777 if(event_manager == NULL) {
778 event_manager = vm->first_device->next_device;
780 return event_manager->get_sound_in_samples(bank);
783 int DEVICE::get_sound_in_rate(int bank)
785 if(event_manager == NULL) {
786 event_manager = vm->first_device->next_device;
788 return event_manager->get_sound_in_rate(bank);
791 int DEVICE::get_sound_in_channels(int bank)
793 if(event_manager == NULL) {
794 event_manager = vm->first_device->next_device;
796 return event_manager->get_sound_in_channels(bank);
799 // this function may be before (or after) initialize().
800 int16_t* DEVICE::get_sound_in_buf_ptr(int bank)
802 if(event_manager == NULL) return NULL;
803 return event_manager->get_sound_in_buf_ptr(bank);
806 int DEVICE::write_sound_in_buffer(int bank, int32_t* src, int samples)
808 if(event_manager == NULL) {
809 event_manager = vm->first_device->next_device;
811 return event_manager->write_sound_in_buffer(bank, src, samples);
814 // Add sampled values to sample buffer;value may be -32768 to +32767.
815 // this function may be before (or after) initialize().
816 int DEVICE::get_sound_in_latest_data(int bank, int32_t* dst, int expect_channels)
818 if(event_manager == NULL) return 0;
819 return event_manager->get_sound_in_latest_data(bank, dst, expect_channels);
822 int DEVICE::get_sound_in_data(int bank, int32_t* dst, int expect_samples, int expect_rate, int expect_channels)
824 if(event_manager == NULL) return -1;
825 return event_manager->get_sound_in_data(bank, dst, expect_samples, expect_rate, expect_channels);
828 void DEVICE::set_high_pass_filter_freq(int freq, double quality)
832 void DEVICE::set_low_pass_filter_freq(int freq, double quality)
836 int DEVICE::get_event_manager_id()
838 if(event_manager == NULL) {
839 event_manager = vm->first_device->next_device;
841 return event_manager->this_device_id;
844 uint32_t DEVICE::get_event_clocks()
846 if(event_manager == NULL) {
847 event_manager = vm->first_device->next_device;
849 return event_manager->get_event_clocks();
852 bool DEVICE::is_primary_cpu(DEVICE* device)
854 if(event_manager == NULL) {
855 event_manager = vm->first_device->next_device;
857 return event_manager->is_primary_cpu(device);
860 uint32_t DEVICE::get_cpu_clocks(DEVICE* device)
862 if(event_manager == NULL) {
863 event_manager = vm->first_device->next_device;
865 return event_manager->get_cpu_clocks(device);
867 void DEVICE::update_extra_event(int clock)
869 if(event_manager == NULL) {
870 event_manager = vm->first_device->next_device;
872 event_manager->update_extra_event(clock);
875 void DEVICE::register_event(DEVICE* device, int event_id, double usec, bool loop, int* register_id)
877 if(event_manager == NULL) {
878 event_manager = vm->first_device->next_device;
880 event_manager->register_event(device, event_id, usec, loop, register_id);
883 void DEVICE::register_event_by_clock(DEVICE* device, int event_id, uint64_t clock, bool loop, int* register_id)
885 if(event_manager == NULL) {
886 event_manager = vm->first_device->next_device;
888 event_manager->register_event_by_clock(device, event_id, clock, loop, register_id);
891 void DEVICE::cancel_event(DEVICE* device, int register_id)
893 if(event_manager == NULL) {
894 event_manager = vm->first_device->next_device;
896 event_manager->cancel_event(device, register_id);
899 // Clear and DE-Register EVENT at slot evid.
900 void DEVICE::clear_event(DEVICE* dev, int& evid)
903 cancel_event(dev, evid);
908 // Register a EVENT to evid (and update evid) , even if evid's slot is used.
909 void DEVICE::force_register_event(DEVICE* dev, int event_num, double usec, bool loop, int& evid)
911 clear_event(dev, evid);
912 register_event(dev, event_num, usec, loop, &evid);
915 void DEVICE::force_register_event_by_clock(DEVICE* dev, int event_num, uint64_t clock, bool loop, int& evid)
917 clear_event(dev, evid);
918 register_event_by_clock(dev, event_num, clock, loop, &evid);
921 // Register a EVENT to evid , if evid slot isn't used.
922 void DEVICE::check_and_update_event(DEVICE* dev, int event_num, double usec, bool loop, int& evid)
924 if(evid > -1) return;
925 register_event(dev, event_num, usec, loop, &evid);
928 void DEVICE::check_and_update_event_by_clock(DEVICE* dev, int event_num, uint64_t clock, bool loop, int& evid)
930 if(evid > -1) return;
931 register_event_by_clock(dev, event_num, clock, loop, &evid);
935 void DEVICE::register_frame_event(DEVICE* device)
937 if(event_manager == NULL) {
938 event_manager = vm->first_device->next_device;
940 event_manager->register_frame_event(device);
942 void DEVICE::register_vline_event(DEVICE* device)
944 if(event_manager == NULL) {
945 event_manager = vm->first_device->next_device;
947 event_manager->register_vline_event(device);
950 uint32_t DEVICE::get_event_remaining_clock(int register_id)
952 if(event_manager == NULL) {
953 event_manager = vm->first_device->next_device;
955 return event_manager->get_event_remaining_clock(register_id);
958 double DEVICE::get_event_remaining_usec(int register_id)
960 if(event_manager == NULL) {
961 event_manager = vm->first_device->next_device;
963 return event_manager->get_event_remaining_usec(register_id);
966 uint32_t DEVICE::get_current_clock()
968 __UNLIKELY_IF(event_manager == NULL) {
969 event_manager = vm->first_device->next_device;
971 return event_manager->get_current_clock();
974 uint32_t DEVICE::get_passed_clock(uint32_t prev)
976 __UNLIKELY_IF(event_manager == NULL) {
977 event_manager = vm->first_device->next_device;
979 return event_manager->get_passed_clock(prev);
982 double DEVICE::get_passed_usec(uint32_t prev)
984 __UNLIKELY_IF(event_manager == NULL) {
985 event_manager = vm->first_device->next_device;
987 return event_manager->get_passed_usec(prev);
990 uint32_t DEVICE::get_passed_clock_since_vline()
992 __UNLIKELY_IF(event_manager == NULL) {
993 event_manager = vm->first_device->next_device;
995 return event_manager->get_passed_clock_since_vline();
998 double DEVICE::get_passed_usec_since_vline()
1000 __UNLIKELY_IF(event_manager == NULL) {
1001 event_manager = vm->first_device->next_device;
1003 return event_manager->get_passed_usec_since_vline();
1006 int DEVICE::get_cur_vline()
1008 __UNLIKELY_IF(event_manager == NULL) {
1009 event_manager = vm->first_device->next_device;
1011 return event_manager->get_cur_vline();
1014 int DEVICE::get_cur_vline_clocks()
1016 __UNLIKELY_IF(event_manager == NULL) {
1017 event_manager = vm->first_device->next_device;
1019 return event_manager->get_cur_vline_clocks();
1022 uint32_t DEVICE::get_cpu_pc(int index)
1024 __UNLIKELY_IF(event_manager == NULL) {
1025 event_manager = vm->first_device->next_device;
1027 return event_manager->get_cpu_pc(index);
1030 uint64_t DEVICE::get_current_clock_uint64()
1032 __UNLIKELY_IF(event_manager == NULL) {
1033 event_manager = vm->first_device->next_device;
1035 return event_manager->get_current_clock_uint64();
1038 uint32_t DEVICE::get_cpu_clock(int index)
1040 __UNLIKELY_IF(event_manager == NULL) {
1041 event_manager = vm->first_device->next_device;
1043 return event_manager->get_cpu_clock(index);
1046 void DEVICE::request_skip_frames()
1048 __UNLIKELY_IF(event_manager == NULL) {
1049 event_manager = vm->first_device->next_device;
1051 event_manager->request_skip_frames();
1054 void DEVICE::set_frames_per_sec(double frames)
1056 __UNLIKELY_IF(event_manager == NULL) {
1057 event_manager = vm->first_device->next_device;
1059 event_manager->set_frames_per_sec(frames);
1062 void DEVICE::set_lines_per_frame(int lines)
1064 __UNLIKELY_IF(event_manager == NULL) {
1065 event_manager = vm->first_device->next_device;
1067 event_manager->set_lines_per_frame(lines);
1070 int DEVICE::get_lines_per_frame()
1072 __UNLIKELY_IF(event_manager == NULL) {
1073 event_manager = vm->first_device->next_device;
1075 return event_manager->get_lines_per_frame();
1078 // Force render sound immediately when device's status has changed.
1079 // You must call this after you changing registers (or anything).
1080 // If has problems, try set_realtime_render.
1081 // See mb8877.cpp and ym2203.cpp.
1083 void DEVICE::touch_sound(void)
1085 __UNLIKELY_IF(event_manager == NULL) {
1086 event_manager = vm->first_device->next_device;
1088 event_manager->touch_sound();
1090 // Force render per 1 sample automatically.
1091 // See pcm1bit.cpp .
1093 void DEVICE::set_realtime_render(DEVICE *device, bool flag)
1095 __UNLIKELY_IF(event_manager == NULL) {
1096 event_manager = vm->first_device->next_device;
1098 __UNLIKELY_IF(device != event_manager) event_manager->set_realtime_render(device, flag);
1101 void DEVICE::update_timing(int new_clocks, double new_frames_per_sec, int new_lines_per_frame)
1106 void DEVICE::event_callback(int event_id, int err)
1110 void DEVICE::event_pre_frame()
1112 // this event is to update timing settings
1115 void DEVICE::event_frame()
1117 // this event is to update timing settings
1120 void DEVICE::event_vline(int v, int clock)
1124 void DEVICE::event_hsync(int v, int h, int clock)
1128 void DEVICE::mix(int32_t* buffer, int cnt)
1132 void DEVICE::set_volume(int ch, int decibel_l, int decibel_r)
1134 // +1 equals +0.5dB (same as fmgen)
1137 void DEVICE::get_volume(int ch, int &decibel_l, int &decibel_r)
1143 void DEVICE::set_device_name(const _TCHAR *format, ...)
1145 if(format != NULL) {
1147 _TCHAR buffer[1024];
1149 va_start(ap, format);
1150 my_vstprintf_s(buffer, 1024, format, ap);
1153 my_tcscpy_s(this_device_name, 128, buffer);
1155 emu->get_osd()->set_vm_node(this_device_id, buffer);
1160 void DEVICE::out_debug_log(const char *fmt, ...)
1162 #if defined(_USE_QT)
1163 __UNLIKELY_IF(osd == nullptr) return;
1164 char strbuf[4096] = {0};
1168 vsnprintf(strbuf, 4095, fmt, ap);
1170 osd->debug_log(CSP_LOG_DEBUG, this_device_id + CSP_LOG_TYPE_VM_DEVICE_0, strbuf);
1172 char strbuf[4096] = {0};
1176 vsnprintf(strbuf, 4095, fmt, ap);
1177 emu->out_debug_log("%s", strbuf);
1182 void DEVICE::out_debug_log_with_switch(bool logging, const char *fmt, ...)
1184 if(!(logging)) return;
1185 #if defined(_USE_QT)
1186 __UNLIKELY_IF(osd == nullptr) return;
1187 char strbuf[4096] = {0};
1191 vsnprintf(strbuf, 4095, fmt, ap);
1193 osd->debug_log(CSP_LOG_DEBUG, this_device_id + CSP_LOG_TYPE_VM_DEVICE_0, strbuf);
1200 vsnprintf(strbuf, 4095, fmt, ap);
1201 emu->out_debug_log("%s", strbuf);
1206 void DEVICE::force_out_debug_log(const char *fmt, ...)
1212 vsnprintf(strbuf, 4095, fmt, ap);
1213 emu->force_out_debug_log("%s", strbuf);
1219 void DEVICE::write_debug_data8(uint32_t addr, uint32_t data)
1221 // write_data8(addr, data);
1224 uint32_t DEVICE::read_debug_data8(uint32_t addr)
1226 // return read_data8(addr);
1230 void DEVICE::write_debug_data16(uint32_t addr, uint32_t data)
1232 write_debug_data8(addr, data & 0xff);
1233 write_debug_data8(addr + 1, (data >> 8) & 0xff);
1236 uint32_t DEVICE::read_debug_data16(uint32_t addr)
1238 uint32_t val = read_debug_data8(addr);
1239 val |= read_debug_data8(addr + 1) << 8;
1243 void DEVICE::write_debug_data32(uint32_t addr, uint32_t data)
1245 write_debug_data16(addr, data & 0xffff);
1246 write_debug_data16(addr + 2, (data >> 16) & 0xffff);
1249 uint32_t DEVICE::read_debug_data32(uint32_t addr)
1251 uint32_t val = read_debug_data16(addr);
1252 val |= read_debug_data16(addr + 2) << 16;
1256 void DEVICE::write_debug_io8(uint32_t addr, uint32_t data)
1258 // write_io8(addr, data);
1261 uint32_t DEVICE::read_debug_io8(uint32_t addr)
1263 // return read_io8(addr);
1267 void DEVICE::write_debug_io16(uint32_t addr, uint32_t data)
1269 write_debug_io8(addr, data & 0xff);
1270 write_debug_io8(addr + 1, (data >> 8) & 0xff);
1273 uint32_t DEVICE::read_debug_io16(uint32_t addr)
1275 uint32_t val = read_debug_io8(addr);
1276 val |= read_debug_io8(addr + 1) << 8;
1280 void DEVICE::write_debug_io32(uint32_t addr, uint32_t data)
1282 write_debug_io16(addr, data & 0xffff);
1283 write_debug_io16(addr + 2, (data >> 16) & 0xffff);
1286 uint32_t DEVICE::read_debug_io32(uint32_t addr)
1288 uint32_t val = read_debug_io16(addr);
1289 val |= read_debug_io16(addr + 2) << 16;
1293 bool DEVICE::write_debug_reg(const _TCHAR *reg, uint32_t data)
1298 uint32_t DEVICE::read_debug_reg(const _TCHAR *reg)
1303 bool DEVICE::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
1308 bool DEVICE::get_debug_regs_description(_TCHAR *buffer, size_t buffer_len)
1313 int DEVICE::debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
1315 return debug_dasm_with_userdata(pc, buffer, buffer_len, 0);
1318 int DEVICE::debug_dasm_with_userdata(uint32_t pc, _TCHAR *buffer, size_t buffer_len, uint32_t userdata)
1323 bool DEVICE::debug_rewind_call_trace(uint32_t pc, int &size, _TCHAR* buffer, size_t buffer_len, uint64_t userdata)
1329 void DEVICE::write_via_debugger_data8(uint32_t addr, uint32_t data)
1333 uint32_t DEVICE::read_via_debugger_data8(uint32_t addr)
1338 void DEVICE::write_via_debugger_data16(uint32_t addr, uint32_t data)
1342 uint32_t DEVICE::read_via_debugger_data16(uint32_t addr)
1347 void DEVICE::write_via_debugger_data32(uint32_t addr, uint32_t data)
1351 uint32_t DEVICE::read_via_debugger_data32(uint32_t addr)
1356 void DEVICE::write_via_debugger_data8w(uint32_t addr, uint32_t data, int* wait)
1361 uint32_t DEVICE::read_via_debugger_data8w(uint32_t addr, int* wait)
1367 void DEVICE::write_via_debugger_data16w(uint32_t addr, uint32_t data, int* wait)
1372 uint32_t DEVICE::read_via_debugger_data16w(uint32_t addr, int* wait)
1378 void DEVICE::write_via_debugger_data32w(uint32_t addr, uint32_t data, int* wait)
1382 uint32_t DEVICE::read_via_debugger_data32w(uint32_t addr, int* wait)
1388 void DEVICE::write_via_debugger_io8(uint32_t addr, uint32_t data)
1392 uint32_t DEVICE::read_via_debugger_io8(uint32_t addr)
1397 void DEVICE::write_via_debugger_io16(uint32_t addr, uint32_t data)
1401 uint32_t DEVICE::read_via_debugger_io16(uint32_t addr)
1406 void DEVICE::write_via_debugger_io32(uint32_t addr, uint32_t data)
1410 uint32_t DEVICE::read_via_debugger_io32(uint32_t addr)
1415 void DEVICE::write_via_debugger_io8w(uint32_t addr, uint32_t data, int* wait)
1418 // write_io8w(addr, data, wait);
1421 uint32_t DEVICE::read_via_debugger_io8w(uint32_t addr, int* wait)
1423 // return read_io8w(addr, wait);
1428 void DEVICE::write_via_debugger_io16w(uint32_t addr, uint32_t data, int* wait)
1433 uint32_t DEVICE::read_via_debugger_io16w(uint32_t addr, int* wait)
1438 void DEVICE::write_via_debugger_io32w(uint32_t addr, uint32_t data, int* wait)
1443 uint32_t DEVICE::read_via_debugger_io32w(uint32_t addr, int* wait)
1449 bool DEVICE::address_translate_for_bios(int space, int intention, uint64_t &taddress)
1451 return true; // If don't present address translation, translation succeed.
1454 const _TCHAR *DEVICE::get_lib_common_vm_version(void)
1456 #if defined(__LIBRARY_NAME)
1457 return (const _TCHAR *)__LIBRARY_NAME;
1459 return (const _TCHAR *)"\0";
1464 void DEVICE::update_config()
1468 void DEVICE::save_state(FILEIO* state_fio)
1472 bool DEVICE::load_state(FILEIO* state_fio)
1477 bool DEVICE::process_state(FILEIO* state_fio, bool loading)
1480 return load_state(state_fio);
1482 save_state(state_fio);