2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
18 #include "csp_logger.h"
19 #define USE_DEVICE_NAME
22 #if defined(USE_SHARED_DLL)
23 #include "libcpu_newdev/device.h"
26 // max devices connected to the output port
30 #define SIG_CPU_IRQ 101
31 #define SIG_CPU_FIRQ 102
32 #define SIG_CPU_NMI 103
33 #define SIG_CPU_BUSREQ 104
34 #define SIG_CPU_HALTREQ 105
35 #define SIG_CPU_DEBUG 106
36 #define SIG_CPU_ADDRESS_DIRTY 107
37 #define SIG_CPU_TOTAL_CYCLE_LO 108
38 #define SIG_CPU_TOTAL_CYCLE_HI 109
39 #define SIG_CPU_WAIT_FACTOR 110
41 #define SIG_PRINTER_DATA 201
42 #define SIG_PRINTER_STROBE 202
43 #define SIG_PRINTER_RESET 203
44 #define SIG_PRINTER_BUSY 204
45 #define SIG_PRINTER_ACK 205
46 #define SIG_PRINTER_SELECT 206
48 #define SIG_SCSI_DAT 301
49 #define SIG_SCSI_BSY 302
50 #define SIG_SCSI_CD 303
51 #define SIG_SCSI_IO 304
52 #define SIG_SCSI_MSG 305
53 #define SIG_SCSI_REQ 306
54 #define SIG_SCSI_SEL 307
55 #define SIG_SCSI_ATN 308
56 #define SIG_SCSI_ACK 309
57 #define SIG_SCSI_RST 310
61 extern CSP_Logger *csp_logger;
74 DEVICE(VM_TEMPLATE* parent_vm, EMU* parent_emu) : vm(parent_vm), emu(parent_emu)
78 p_logger = csp_logger;
82 memset(this_device_name, 0x00, sizeof(this_device_name));
83 strncpy(this_device_name, "Base Device", 128 - 1);
84 prev_device = vm->last_device;
86 if(vm->first_device == NULL) {
87 // this is the first device
88 vm->first_device = this;
91 // this is not the first device
92 vm->last_device->next_device = this;
93 this_device_id = vm->last_device->this_device_id + 1;
95 vm->last_device = this;
96 // primary event manager
99 //ToDo: Will implement real destructor per real classes and below destructor decl. with "virtual".
100 // This makes warning:
101 //"deleting object of polymorphic class type 'DEVICE' which has non-virtual
102 // destructor might cause undefined behavior [-Wdelete-non-virtual-dtor]".
105 virtual void initialize() { /* osd = emu->get_osd(); */ /* Initializing VM must be after initializing OSD. */ }
107 virtual void release() {
110 virtual void release() {}
112 // Sound input functions
113 virtual void clear_sound_in_source(int bank) {
114 if(event_manager == NULL) {
115 event_manager = vm->first_device->next_device;
117 event_manager->clear_sound_in_source(bank);
119 // this function may be before (or after) initialize().
120 virtual int add_sound_in_source(int rate, int samples, int channels) {
121 if(event_manager == NULL) return -1;
122 return event_manager->add_sound_in_source(rate, samples, channels);
124 // this function may be before (or after) initialize().
125 virtual int release_sound_in_source(int bank) {
126 if(event_manager == NULL) return -1;
127 return event_manager->release_sound_in_source(bank);
130 virtual bool is_sound_in_source_exists(int bank) {
131 if(event_manager == NULL) {
132 event_manager = vm->first_device->next_device;
134 return event_manager->is_sound_in_source_exists(bank);
136 virtual int increment_sound_in_passed_data(int bank, double passed_usec) {
137 if(event_manager == NULL) {
140 return event_manager->increment_sound_in_passed_data(bank, passed_usec);
142 virtual int get_sound_in_buffers_count() {
143 if(event_manager == NULL) {
144 event_manager = vm->first_device->next_device;
146 return event_manager->get_sound_in_buffers_count();
148 virtual int get_sound_in_samples(int bank) {
149 if(event_manager == NULL) {
150 event_manager = vm->first_device->next_device;
152 return event_manager->get_sound_in_samples(bank);
154 virtual int get_sound_in_rate(int bank) {
155 if(event_manager == NULL) {
156 event_manager = vm->first_device->next_device;
158 return event_manager->get_sound_in_rate(bank);
160 virtual int get_sound_in_channels(int bank) {
161 if(event_manager == NULL) {
162 event_manager = vm->first_device->next_device;
164 return event_manager->get_sound_in_channels(bank);
166 // this function may be before (or after) initialize().
167 virtual int16_t* get_sound_in_buf_ptr(int bank) {
168 if(event_manager == NULL) return NULL;
169 return event_manager->get_sound_in_buf_ptr(bank);
171 virtual int write_sound_in_buffer(int bank, int32_t* src, int samples) {
172 if(event_manager == NULL) {
173 event_manager = vm->first_device->next_device;
175 return event_manager->write_sound_in_buffer(bank, src, samples);
178 // Add sampled values to sample buffer;value may be -32768 to +32767.
179 // this function may be before (or after) initialize().
180 virtual int get_sound_in_latest_data(int bank, int32_t* dst, int expect_channels) {
181 if(event_manager == NULL) return 0;
182 return event_manager->get_sound_in_latest_data(bank, dst, expect_channels);
184 virtual int get_sound_in_data(int bank, int32_t* dst, int expect_samples, int expect_rate, int expect_channels) {
185 if(event_manager == NULL) return -1;
186 return event_manager->get_sound_in_data(bank, dst, expect_samples, expect_rate, expect_channels);
189 virtual void set_high_pass_filter_freq(int freq, double quality) { } // If freq < 0 disable HPF.
190 virtual void set_low_pass_filter_freq(int freq, double quality) { } // If freq <= 0 disable LPF.
192 virtual void update_config() {}
193 virtual void save_state(FILEIO* state_fio) {}
194 virtual bool load_state(FILEIO* state_fio)
199 virtual void reset() {}
200 virtual void special_reset()
204 virtual bool process_state(FILEIO* state_fio, bool loading)
207 return load_state(state_fio);
209 save_state(state_fio);
214 // NOTE: the virtual bus interface functions for 16/32bit access invite the cpu is little endian.
215 // if the cpu is big endian, you need to implement them in the virtual machine memory/io classes.
216 virtual uint32_t __FASTCALL translate_address(int segment, uint32_t offset) { /* offset must be numeric, not value */ return offset; }
219 virtual void __FASTCALL write_data8(uint32_t addr, uint32_t data) {}
220 virtual uint32_t __FASTCALL read_data8(uint32_t addr)
224 virtual void __FASTCALL write_data16(uint32_t addr, uint32_t data)
226 write_data8(addr, data & 0xff);
227 write_data8(addr + 1, (data >> 8) & 0xff);
229 virtual uint32_t __FASTCALL read_data16(uint32_t addr)
231 uint32_t val = read_data8(addr);
232 val |= read_data8(addr + 1) << 8;
235 virtual void __FASTCALL write_data32(uint32_t addr, uint32_t data)
237 write_data16(addr, data & 0xffff);
238 write_data16(addr + 2, (data >> 16) & 0xffff);
240 virtual uint32_t __FASTCALL read_data32(uint32_t addr)
242 uint32_t val = read_data16(addr);
243 val |= read_data16(addr + 2) << 16;
246 virtual void __FASTCALL write_data8w(uint32_t addr, uint32_t data, int* wait)
249 write_data8(addr, data);
251 virtual uint32_t __FASTCALL read_data8w(uint32_t addr, int* wait)
254 return read_data8(addr);
256 virtual void __FASTCALL write_data16w(uint32_t addr, uint32_t data, int* wait)
259 write_data8w(addr, data & 0xff, &wait_l);
260 write_data8w(addr + 1, (data >> 8) & 0xff, &wait_h);
261 *wait = wait_l + wait_h;
263 virtual uint32_t __FASTCALL read_data16w(uint32_t addr, int* wait)
266 uint32_t val = read_data8w(addr, &wait_l);
267 val |= read_data8w(addr + 1, &wait_h) << 8;
268 *wait = wait_l + wait_h;
271 virtual void __FASTCALL write_data32w(uint32_t addr, uint32_t data, int* wait)
274 write_data16w(addr, data & 0xffff, &wait_l);
275 write_data16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
276 *wait = wait_l + wait_h;
278 virtual uint32_t __FASTCALL read_data32w(uint32_t addr, int* wait)
281 uint32_t val = read_data16w(addr, &wait_l);
282 val |= read_data16w(addr + 2, &wait_h) << 16;
283 *wait = wait_l + wait_h;
286 virtual uint32_t __FASTCALL fetch_op(uint32_t addr, int *wait)
288 return read_data8w(addr, wait);
290 virtual void __FASTCALL write_dma_data8(uint32_t addr, uint32_t data)
292 write_data8(addr, data);
294 virtual uint32_t __FASTCALL read_dma_data8(uint32_t addr)
296 return read_data8(addr);
298 virtual void __FASTCALL write_dma_data16(uint32_t addr, uint32_t data)
300 write_data16(addr, data);
302 virtual uint32_t __FASTCALL read_dma_data16(uint32_t addr)
304 return read_data16(addr);
306 virtual void __FASTCALL write_dma_data32(uint32_t addr, uint32_t data)
308 write_data32(addr, data);
310 virtual uint32_t __FASTCALL read_dma_data32(uint32_t addr)
312 return read_data32(addr);
314 virtual void __FASTCALL write_dma_data8w(uint32_t addr, uint32_t data, int* wait)
316 write_data8w(addr, data, wait);
318 virtual uint32_t __FASTCALL read_dma_data8w(uint32_t addr, int* wait)
320 return read_data8w(addr, wait);
322 virtual void __FASTCALL write_dma_data16w(uint32_t addr, uint32_t data, int* wait)
324 write_data16w(addr, data, wait);
326 virtual uint32_t __FASTCALL read_dma_data16w(uint32_t addr, int* wait)
328 return read_data16w(addr, wait);
330 virtual void __FASTCALL write_dma_data32w(uint32_t addr, uint32_t data, int* wait)
332 write_data32w(addr, data, wait);
334 virtual uint32_t __FASTCALL read_dma_data32w(uint32_t addr, int* wait)
336 return read_data32w(addr, wait);
340 virtual void __FASTCALL write_io8(uint32_t addr, uint32_t data) {}
341 virtual uint32_t __FASTCALL read_io8(uint32_t addr)
343 #ifdef IOBUS_RETURN_ADDR
344 return (addr & 1 ? addr >> 8 : addr) & 0xff;
349 virtual void __FASTCALL write_io16(uint32_t addr, uint32_t data)
351 write_io8(addr, data & 0xff);
352 write_io8(addr + 1, (data >> 8) & 0xff);
354 virtual uint32_t __FASTCALL read_io16(uint32_t addr)
356 uint32_t val = read_io8(addr);
357 val |= read_io8(addr + 1) << 8;
360 virtual void __FASTCALL write_io32(uint32_t addr, uint32_t data)
362 write_io16(addr, data & 0xffff);
363 write_io16(addr + 2, (data >> 16) & 0xffff);
365 virtual uint32_t __FASTCALL read_io32(uint32_t addr)
367 uint32_t val = read_io16(addr);
368 val |= read_io16(addr + 2) << 16;
371 virtual void __FASTCALL write_io8w(uint32_t addr, uint32_t data, int* wait)
374 write_io8(addr, data);
376 virtual uint32_t __FASTCALL read_io8w(uint32_t addr, int* wait)
379 return read_io8(addr);
381 virtual void __FASTCALL write_io16w(uint32_t addr, uint32_t data, int* wait)
384 write_io8w(addr, data & 0xff, &wait_l);
385 write_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
386 *wait = wait_l + wait_h;
388 virtual uint32_t __FASTCALL read_io16w(uint32_t addr, int* wait)
391 uint32_t val = read_io8w(addr, &wait_l);
392 val |= read_io8w(addr + 1, &wait_h) << 8;
393 *wait = wait_l + wait_h;
396 virtual void __FASTCALL write_io32w(uint32_t addr, uint32_t data, int* wait)
399 write_io16w(addr, data & 0xffff, &wait_l);
400 write_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
401 *wait = wait_l + wait_h;
403 virtual uint32_t __FASTCALL read_io32w(uint32_t addr, int* wait)
406 uint32_t val = read_io16w(addr, &wait_l);
407 val |= read_io16w(addr + 2, &wait_h) << 16;
408 *wait = wait_l + wait_h;
411 virtual void __FASTCALL write_dma_io8(uint32_t addr, uint32_t data)
413 write_io8(addr, data);
415 virtual uint32_t __FASTCALL read_dma_io8(uint32_t addr)
417 return read_io8(addr);
419 virtual void __FASTCALL write_dma_io16(uint32_t addr, uint32_t data)
421 write_io16(addr, data);
423 virtual uint32_t __FASTCALL read_dma_io16(uint32_t addr)
425 return read_io16(addr);
427 virtual void __FASTCALL write_dma_io32(uint32_t addr, uint32_t data)
429 write_io32(addr, data);
431 virtual uint32_t __FASTCALL read_dma_io32(uint32_t addr)
433 return read_io32(addr);
435 virtual void __FASTCALL write_dma_io8w(uint32_t addr, uint32_t data, int* wait)
437 write_io8w(addr, data, wait);
439 virtual uint32_t __FASTCALL read_dma_io8w(uint32_t addr, int* wait)
441 return read_io8w(addr, wait);
443 virtual void __FASTCALL write_dma_io16w(uint32_t addr, uint32_t data, int* wait)
445 write_io16w(addr, data, wait);
447 virtual uint32_t __FASTCALL read_dma_io16w(uint32_t addr, int* wait)
449 return read_io16w(addr, wait);
451 virtual void __FASTCALL write_dma_io32w(uint32_t addr, uint32_t data, int* wait)
453 write_io32w(addr, data, wait);
455 virtual uint32_t __FASTCALL read_dma_io32w(uint32_t addr, int* wait)
457 return read_io32w(addr, wait);
461 virtual void __FASTCALL write_memory_mapped_io8(uint32_t addr, uint32_t data)
463 write_io8(addr, data);
465 virtual uint32_t __FASTCALL read_memory_mapped_io8(uint32_t addr)
467 return read_io8(addr);
469 virtual void __FASTCALL write_memory_mapped_io16(uint32_t addr, uint32_t data)
471 write_memory_mapped_io8(addr, data & 0xff);
472 write_memory_mapped_io8(addr + 1, (data >> 8) & 0xff);
474 virtual uint32_t __FASTCALL read_memory_mapped_io16(uint32_t addr)
476 uint32_t val = read_memory_mapped_io8(addr);
477 val |= read_memory_mapped_io8(addr + 1) << 8;
480 virtual void __FASTCALL write_memory_mapped_io32(uint32_t addr, uint32_t data)
482 write_memory_mapped_io16(addr, data & 0xffff);
483 write_memory_mapped_io16(addr + 2, (data >> 16) & 0xffff);
485 virtual uint32_t __FASTCALL read_memory_mapped_io32(uint32_t addr)
487 uint32_t val = read_memory_mapped_io16(addr);
488 val |= read_memory_mapped_io16(addr + 2) << 16;
491 virtual void __FASTCALL write_memory_mapped_io8w(uint32_t addr, uint32_t data, int* wait)
494 write_memory_mapped_io8(addr, data);
496 virtual uint32_t __FASTCALL read_memory_mapped_io8w(uint32_t addr, int* wait)
499 return read_memory_mapped_io8(addr);
501 virtual void __FASTCALL write_memory_mapped_io16w(uint32_t addr, uint32_t data, int* wait)
504 write_memory_mapped_io8w(addr, data & 0xff, &wait_l);
505 write_memory_mapped_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
506 *wait = wait_l + wait_h;
508 virtual uint32_t __FASTCALL read_memory_mapped_io16w(uint32_t addr, int* wait)
511 uint32_t val = read_memory_mapped_io8w(addr, &wait_l);
512 val |= read_memory_mapped_io8w(addr + 1, &wait_h) << 8;
513 *wait = wait_l + wait_h;
516 virtual void __FASTCALL write_memory_mapped_io32w(uint32_t addr, uint32_t data, int* wait)
519 write_memory_mapped_io16w(addr, data & 0xffff, &wait_l);
520 write_memory_mapped_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
521 *wait = wait_l + wait_h;
523 virtual uint32_t __FASTCALL read_memory_mapped_io32w(uint32_t addr, int* wait)
526 uint32_t val = read_memory_mapped_io16w(addr, &wait_l);
527 val |= read_memory_mapped_io16w(addr + 2, &wait_h) << 16;
528 *wait = wait_l + wait_h;
542 output_t item[MAX_OUTPUT];
545 virtual void initialize_output_signals(outputs_t *items)
549 virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask, int shift)
551 int c = items->count++;
552 items->item[c].device = device;
553 items->item[c].id = id;
554 items->item[c].mask = mask;
555 items->item[c].shift = shift;
557 virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask)
559 int c = items->count++;
560 items->item[c].device = device;
561 items->item[c].id = id;
562 items->item[c].mask = mask;
563 items->item[c].shift = 0;
565 virtual void __FASTCALL write_signals(outputs_t *items, uint32_t data)
567 for(int i = 0; i < items->count; i++) {
568 output_t *item = &items->item[i];
569 int shift = item->shift;
570 uint32_t val = (shift < 0) ? (data >> (-shift)) : (data << shift);
571 uint32_t mask = (shift < 0) ? (item->mask >> (-shift)) : (item->mask << shift);
572 item->device->write_signal(item->id, val, mask);
575 virtual void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask) {}
576 virtual uint32_t __FASTCALL read_signal(int ch)
582 virtual void set_context_intr(DEVICE* device, uint32_t bit) {}
583 virtual void set_context_child(DEVICE* device) {}
584 virtual DEVICE *get_context_child()
589 // interrupt device to device
590 virtual void set_intr_iei(bool val) {}
592 // interrupt device to cpu
593 virtual void set_intr_line(bool line, bool pending, uint32_t bit) {}
595 // interrupt cpu to device
596 virtual uint32_t get_intr_ack()
600 virtual void notify_intr_reti() {}
601 virtual void notify_intr_ei() {}
604 virtual void __FASTCALL do_dma() { }
607 virtual int __FASTCALL run(int clock)
609 // when clock == -1, run one opecode
610 return (clock == -1 ? 1 : clock);
612 virtual void set_extra_clock(int clock) {}
613 virtual int get_extra_clock()
617 virtual uint32_t get_pc()
621 virtual uint32_t get_next_pc()
627 virtual bool bios_call_far_i86(uint32_t PC, uint16_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag, int* cycles, uint64_t* total_cycles)
631 virtual bool bios_int_i86(int intnum, uint16_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag, int* cycles, uint64_t* total_cycles)
635 virtual bool bios_call_far_ia32(uint32_t PC, uint32_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag, int* cycles, uint64_t* total_cycles)
639 virtual bool bios_int_ia32(int intnum, uint32_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag, int* cycles, uint64_t* total_cycles)
643 virtual bool 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) {
646 virtual bool __FASTCALL address_translate(int space, int intention, uint64_t &taddress) { return true; /* If not present, always succeeded.*/ }
648 const _TCHAR *get_device_name(void)
650 return (const _TCHAR *)this_device_name;
654 DEVICE* event_manager;
656 virtual void set_context_event_manager(DEVICE* device)
658 event_manager = device;
660 virtual int get_event_manager_id()
662 if(event_manager == NULL) {
663 event_manager = vm->first_device->next_device;
665 return event_manager->this_device_id;
667 virtual bool is_primary_cpu(DEVICE* device)
669 if(event_manager == NULL) {
670 event_manager = vm->first_device->next_device;
672 return event_manager->is_primary_cpu(device);
674 virtual void update_extra_event(int clock)
676 if(event_manager == NULL) {
677 event_manager = vm->first_device->next_device;
679 event_manager->update_extra_event(clock);
681 virtual void register_event(DEVICE* device, int event_id, double usec, bool loop, int* register_id)
683 if(event_manager == NULL) {
684 event_manager = vm->first_device->next_device;
686 event_manager->register_event(device, event_id, usec, loop, register_id);
688 virtual void register_event_by_clock(DEVICE* device, int event_id, uint64_t clock, bool loop, int* register_id)
690 if(event_manager == NULL) {
691 event_manager = vm->first_device->next_device;
693 event_manager->register_event_by_clock(device, event_id, clock, loop, register_id);
695 virtual void cancel_event(DEVICE* device, int register_id)
697 if(event_manager == NULL) {
698 event_manager = vm->first_device->next_device;
700 event_manager->cancel_event(device, register_id);
702 virtual void register_frame_event(DEVICE* device)
704 if(event_manager == NULL) {
705 event_manager = vm->first_device->next_device;
707 event_manager->register_frame_event(device);
709 virtual void register_vline_event(DEVICE* device)
711 if(event_manager == NULL) {
712 event_manager = vm->first_device->next_device;
714 event_manager->register_vline_event(device);
716 virtual uint32_t get_event_remaining_clock(int register_id)
718 if(event_manager == NULL) {
719 event_manager = vm->first_device->next_device;
721 return event_manager->get_event_remaining_clock(register_id);
723 virtual double get_event_remaining_usec(int register_id)
725 if(event_manager == NULL) {
726 event_manager = vm->first_device->next_device;
728 return event_manager->get_event_remaining_usec(register_id);
730 virtual uint32_t get_current_clock()
732 if(event_manager == NULL) {
733 event_manager = vm->first_device->next_device;
735 return event_manager->get_current_clock();
737 virtual uint32_t get_passed_clock(uint32_t prev)
739 if(event_manager == NULL) {
740 event_manager = vm->first_device->next_device;
742 return event_manager->get_passed_clock(prev);
744 virtual double get_passed_usec(uint32_t prev)
746 if(event_manager == NULL) {
747 event_manager = vm->first_device->next_device;
749 return event_manager->get_passed_usec(prev);
751 virtual uint32_t get_passed_clock_since_vline()
753 if(event_manager == NULL) {
754 event_manager = vm->first_device->next_device;
756 return event_manager->get_passed_clock_since_vline();
758 virtual double get_passed_usec_since_vline()
760 if(event_manager == NULL) {
761 event_manager = vm->first_device->next_device;
763 return event_manager->get_passed_usec_since_vline();
765 virtual int get_cur_vline()
767 if(event_manager == NULL) {
768 event_manager = vm->first_device->next_device;
770 return event_manager->get_cur_vline();
772 virtual int get_cur_vline_clocks()
774 if(event_manager == NULL) {
775 event_manager = vm->first_device->next_device;
777 return event_manager->get_cur_vline_clocks();
779 virtual uint32_t get_cpu_pc(int index)
781 if(event_manager == NULL) {
782 event_manager = vm->first_device->next_device;
784 return event_manager->get_cpu_pc(index);
786 virtual uint64_t get_current_clock_uint64()
788 if(event_manager == NULL) {
789 event_manager = vm->first_device->next_device;
791 return event_manager->get_current_clock_uint64();
793 virtual uint32_t get_cpu_clock(int index)
795 if(event_manager == NULL) {
796 event_manager = vm->first_device->next_device;
798 return event_manager->get_cpu_clock(index);
800 virtual void request_skip_frames()
802 if(event_manager == NULL) {
803 event_manager = vm->first_device->next_device;
805 event_manager->request_skip_frames();
807 virtual void set_frames_per_sec(double frames)
809 if(event_manager == NULL) {
810 event_manager = vm->first_device->next_device;
812 event_manager->set_frames_per_sec(frames);
814 virtual void set_lines_per_frame(int lines)
816 if(event_manager == NULL) {
817 event_manager = vm->first_device->next_device;
819 event_manager->set_lines_per_frame(lines);
821 virtual int get_lines_per_frame()
823 if(event_manager == NULL) {
824 event_manager = vm->first_device->next_device;
826 return event_manager->get_lines_per_frame();
828 // Force reder sound immediately when device's status has changed.
829 // You must call this after you changing registers (or enything).
830 // If has problems, try set_realtime_render.
831 // See mb8877.cpp and ym2203.cpp.
833 virtual void touch_sound(void)
835 if(event_manager == NULL) {
836 event_manager = vm->first_device->next_device;
838 event_manager->touch_sound();
840 // Force render per 1 sample automatically.
843 virtual void set_realtime_render(DEVICE* device, bool flag = true)
845 if(event_manager == NULL) {
846 event_manager = vm->first_device->next_device;
848 if(device != event_manager) event_manager->set_realtime_render(device, flag);
850 virtual void set_realtime_render(bool flag)
852 set_realtime_render(this, flag);
854 virtual void update_timing(int new_clocks, double new_frames_per_sec, int new_lines_per_frame) {}
857 virtual void event_callback(int event_id, int err) {}
858 virtual void event_pre_frame() {} // this event is to update timing settings
859 virtual void event_frame() {}
860 virtual void event_vline(int v, int clock) {}
861 virtual void event_hsync(int v, int h, int clock) {}
864 virtual void mix(int32_t* buffer, int cnt) {}
865 virtual void set_volume(int ch, int decibel_l, int decibel_r) {} // +1 equals +0.5dB (same as fmgen)
866 virtual void set_device_name(const _TCHAR *format, ...)
872 va_start(ap, format);
873 my_vstprintf_s(buffer, 1024, format, ap);
876 my_tcscpy_s(this_device_name, 128, buffer);
878 emu->get_osd()->set_vm_node(this_device_id, buffer);
883 These functions are used for debugging non-cpu device
884 Insert debugger between standard read/write functions and these functions for checking breakpoints
886 void DEVICE::write_data8(uint32_t addr, uint32_t data)
888 if(debugger != NULL && debugger->now_device_debugging) {
889 // debugger->mem = this;
890 // debugger->mem->write_via_debugger_data8(addr, data)
891 debugger->write_via_debugger_data8(addr, data);
893 this->write_via_debugger_data8(addr, data);
896 void DEVICE::write_via_debugger_data8(uint32_t addr, uint32_t data)
901 virtual void __FASTCALL write_via_debugger_data8(uint32_t addr, uint32_t data) {}
902 virtual uint32_t __FASTCALL read_via_debugger_data8(uint32_t addr)
906 virtual void __FASTCALL write_via_debugger_data16(uint32_t addr, uint32_t data) {}
907 virtual uint32_t __FASTCALL read_via_debugger_data16(uint32_t addr)
911 virtual void __FASTCALL write_via_debugger_data32(uint32_t addr, uint32_t data) {}
912 virtual uint32_t __FASTCALL read_via_debugger_data32(uint32_t addr)
916 virtual void __FASTCALL write_via_debugger_data8w(uint32_t addr, uint32_t data, int* wait) {}
917 virtual uint32_t __FASTCALL read_via_debugger_data8w(uint32_t addr, int* wait)
921 virtual void __FASTCALL write_via_debugger_data16w(uint32_t addr, uint32_t data, int* wait) {}
922 virtual uint32_t __FASTCALL read_via_debugger_data16w(uint32_t addr, int* wait)
926 virtual void __FASTCALL write_via_debugger_data32w(uint32_t addr, uint32_t data, int* wait) {}
927 virtual uint32_t __FASTCALL read_via_debugger_data32w(uint32_t addr, int* wait)
931 virtual void __FASTCALL write_via_debugger_io8(uint32_t addr, uint32_t data) {}
932 virtual uint32_t __FASTCALL read_via_debugger_io8(uint32_t addr)
936 virtual void __FASTCALL write_via_debugger_io16(uint32_t addr, uint32_t data) {}
937 virtual uint32_t __FASTCALL read_via_debugger_io16(uint32_t addr)
941 virtual void __FASTCALL write_via_debugger_io32(uint32_t addr, uint32_t data) {}
942 virtual uint32_t __FASTCALL read_via_debugger_io32(uint32_t addr)
946 virtual void __FASTCALL write_via_debugger_io8w(uint32_t addr, uint32_t data, int* wait) {}
947 virtual uint32_t __FASTCALL read_via_debugger_io8w(uint32_t addr, int* wait)
951 virtual void __FASTCALL write_via_debugger_io16w(uint32_t addr, uint32_t data, int* wait) {}
952 virtual uint32_t __FASTCALL read_via_debugger_io16w(uint32_t addr, int* wait)
956 virtual void __FASTCALL write_via_debugger_io32w(uint32_t addr, uint32_t data, int* wait) {}
957 virtual uint32_t __FASTCALL read_via_debugger_io32w(uint32_t addr, int* wait)
961 virtual void out_debug_log(const char *fmt, ...)
967 vsnprintf(strbuf, 4095, fmt, ap);
968 emu->out_debug_log("%s", strbuf);
971 virtual void force_out_debug_log(const char *fmt, ...)
977 vsnprintf(strbuf, 4095, fmt, ap);
978 emu->force_out_debug_log("%s", strbuf);
984 virtual bool is_cpu()
988 virtual bool is_debugger()
992 virtual bool is_debugger_available()
996 virtual void *get_debugger()
1000 virtual uint32_t get_debug_prog_addr_mask()
1004 virtual uint32_t get_debug_data_addr_mask()
1008 virtual uint64_t get_debug_data_addr_space()
1010 // override this function when memory space is not (2 << n)
1011 return (uint64_t)get_debug_data_addr_mask() + 1;
1013 virtual void __FASTCALL write_debug_data8(uint32_t addr, uint32_t data)
1015 // write_data8(addr, data);
1017 virtual uint32_t __FASTCALL read_debug_data8(uint32_t addr)
1019 // return read_data8(addr);
1022 virtual void __FASTCALL write_debug_data16(uint32_t addr, uint32_t data)
1024 write_debug_data8(addr, data & 0xff);
1025 write_debug_data8(addr + 1, (data >> 8) & 0xff);
1027 virtual uint32_t __FASTCALL read_debug_data16(uint32_t addr)
1029 uint32_t val = read_debug_data8(addr);
1030 val |= read_debug_data8(addr + 1) << 8;
1033 virtual void __FASTCALL write_debug_data32(uint32_t addr, uint32_t data)
1035 write_debug_data16(addr, data & 0xffff);
1036 write_debug_data16(addr + 2, (data >> 16) & 0xffff);
1038 virtual uint32_t __FASTCALL read_debug_data32(uint32_t addr)
1040 uint32_t val = read_debug_data16(addr);
1041 val |= read_debug_data16(addr + 2) << 16;
1044 virtual void __FASTCALL write_debug_io8(uint32_t addr, uint32_t data)
1046 // write_io8(addr, data);
1048 virtual uint32_t __FASTCALL read_debug_io8(uint32_t addr)
1050 // return read_io8(addr);
1053 virtual void __FASTCALL write_debug_io16(uint32_t addr, uint32_t data)
1055 write_debug_io8(addr, data & 0xff);
1056 write_debug_io8(addr + 1, (data >> 8) & 0xff);
1058 virtual uint32_t __FASTCALL read_debug_io16(uint32_t addr)
1060 uint32_t val = read_debug_io8(addr);
1061 val |= read_debug_io8(addr + 1) << 8;
1064 virtual void __FASTCALL write_debug_io32(uint32_t addr, uint32_t data)
1066 write_debug_io16(addr, data & 0xffff);
1067 write_debug_io16(addr + 2, (data >> 16) & 0xffff);
1069 virtual uint32_t __FASTCALL read_debug_io32(uint32_t addr)
1071 uint32_t val = read_debug_io16(addr);
1072 val |= read_debug_io16(addr + 2) << 16;
1075 virtual bool write_debug_reg(const _TCHAR *reg, uint32_t data)
1079 virtual uint32_t __FASTCALL read_debug_reg(const _TCHAR *reg)
1083 virtual bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
1087 virtual int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
1089 return debug_dasm_with_userdata(pc, buffer, buffer_len, 0);
1091 virtual int debug_dasm_with_userdata(uint32_t pc, _TCHAR *buffer, size_t buffer_len, uint32_t userdata = 0)
1096 _TCHAR this_device_name[128];
1098 DEVICE* prev_device;
1099 DEVICE* next_device;
1102 #endif // USE_SHARED_DLL