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
37 #define SIG_PRINTER_DATA 201
38 #define SIG_PRINTER_STROBE 202
39 #define SIG_PRINTER_RESET 203
40 #define SIG_PRINTER_BUSY 204
41 #define SIG_PRINTER_ACK 205
42 #define SIG_PRINTER_SELECT 206
44 #define SIG_SCSI_DAT 301
45 #define SIG_SCSI_BSY 302
46 #define SIG_SCSI_CD 303
47 #define SIG_SCSI_IO 304
48 #define SIG_SCSI_MSG 305
49 #define SIG_SCSI_REQ 306
50 #define SIG_SCSI_SEL 307
51 #define SIG_SCSI_ATN 308
52 #define SIG_SCSI_ACK 309
53 #define SIG_SCSI_RST 310
62 DEVICE(VM* parent_vm, EMU* parent_emu) : vm(parent_vm), emu(parent_emu)
70 strncpy(this_device_name, "Base Device", 128);
71 prev_device = vm->last_device;
73 if(vm->first_device == NULL) {
74 // this is the first device
75 vm->first_device = this;
78 // this is not the first device
79 vm->last_device->next_device = this;
80 this_device_id = vm->last_device->this_device_id + 1;
82 vm->last_device = this;
84 // primary event manager
87 //ToDo: Will implement real destructor per real classes and below destructor decl. with "virtual".
88 // This makes warning:
89 //"deleting object of polymorphic class type 'DEVICE' which has non-virtual
90 // destructor might cause undefined behavior [-Wdelete-non-virtual-dtor]".
93 virtual void initialize() { /* osd = emu->get_osd(); */ /* Initializing VM must be after initializing OSD. */ }
94 virtual void release() {}
96 virtual void update_config() {}
97 virtual void save_state(FILEIO* state_fio) {}
98 virtual bool load_state(FILEIO* state_fio)
102 virtual void decl_state(void) {}
105 virtual void reset() {}
106 virtual void special_reset()
111 // NOTE: the virtual bus interface functions for 16/32bit access invite the cpu is little endian.
112 // if the cpu is big endian, you need to implement them in the virtual machine memory/io classes.
115 virtual void write_data8(uint32_t addr, uint32_t data) {}
116 virtual uint32_t read_data8(uint32_t addr)
120 virtual void write_data16(uint32_t addr, uint32_t data)
122 write_data8(addr, data & 0xff);
123 write_data8(addr + 1, (data >> 8) & 0xff);
125 virtual uint32_t read_data16(uint32_t addr)
127 uint32_t val = read_data8(addr);
128 val |= read_data8(addr + 1) << 8;
131 virtual void write_data32(uint32_t addr, uint32_t data)
133 write_data16(addr, data & 0xffff);
134 write_data16(addr + 2, (data >> 16) & 0xffff);
136 virtual uint32_t read_data32(uint32_t addr)
138 uint32_t val = read_data16(addr);
139 val |= read_data16(addr + 2) << 16;
142 virtual void write_data8w(uint32_t addr, uint32_t data, int* wait)
145 write_data8(addr, data);
147 virtual uint32_t read_data8w(uint32_t addr, int* wait)
150 return read_data8(addr);
152 virtual void write_data16w(uint32_t addr, uint32_t data, int* wait)
155 write_data8w(addr, data & 0xff, &wait_l);
156 write_data8w(addr + 1, (data >> 8) & 0xff, &wait_h);
157 *wait = wait_l + wait_h;
159 virtual uint32_t read_data16w(uint32_t addr, int* wait)
162 uint32_t val = read_data8w(addr, &wait_l);
163 val |= read_data8w(addr + 1, &wait_h) << 8;
164 *wait = wait_l + wait_h;
167 virtual void write_data32w(uint32_t addr, uint32_t data, int* wait)
170 write_data16w(addr, data & 0xffff, &wait_l);
171 write_data16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
172 *wait = wait_l + wait_h;
174 virtual uint32_t read_data32w(uint32_t addr, int* wait)
177 uint32_t val = read_data16w(addr, &wait_l);
178 val |= read_data16w(addr + 2, &wait_h) << 16;
179 *wait = wait_l + wait_h;
182 virtual uint32_t fetch_op(uint32_t addr, int *wait)
184 return read_data8w(addr, wait);
186 virtual void write_dma_data8(uint32_t addr, uint32_t data)
188 write_data8(addr, data);
190 virtual uint32_t read_dma_data8(uint32_t addr)
192 return read_data8(addr);
194 virtual void write_dma_data16(uint32_t addr, uint32_t data)
196 write_data16(addr, data);
198 virtual uint32_t read_dma_data16(uint32_t addr)
200 return read_data16(addr);
202 virtual void write_dma_data32(uint32_t addr, uint32_t data)
204 write_data32(addr, data);
206 virtual uint32_t read_dma_data32(uint32_t addr)
208 return read_data32(addr);
210 virtual void write_dma_data8w(uint32_t addr, uint32_t data, int* wait)
212 write_data8w(addr, data, wait);
214 virtual uint32_t read_dma_data8w(uint32_t addr, int* wait)
216 return read_data8w(addr, wait);
218 virtual void write_dma_data16w(uint32_t addr, uint32_t data, int* wait)
220 write_data16w(addr, data, wait);
222 virtual uint32_t read_dma_data16w(uint32_t addr, int* wait)
224 return read_data16w(addr, wait);
226 virtual void write_dma_data32w(uint32_t addr, uint32_t data, int* wait)
228 write_data32w(addr, data, wait);
230 virtual uint32_t read_dma_data32w(uint32_t addr, int* wait)
232 return read_data32w(addr, wait);
236 virtual void write_io8(uint32_t addr, uint32_t data) {}
237 virtual uint32_t read_io8(uint32_t addr)
239 #ifdef IOBUS_RETURN_ADDR
240 return (addr & 1 ? addr >> 8 : addr) & 0xff;
245 virtual void write_io16(uint32_t addr, uint32_t data)
247 write_io8(addr, data & 0xff);
248 write_io8(addr + 1, (data >> 8) & 0xff);
250 virtual uint32_t read_io16(uint32_t addr)
252 uint32_t val = read_io8(addr);
253 val |= read_io8(addr + 1) << 8;
256 virtual void write_io32(uint32_t addr, uint32_t data)
258 write_io16(addr, data & 0xffff);
259 write_io16(addr + 2, (data >> 16) & 0xffff);
261 virtual uint32_t read_io32(uint32_t addr)
263 uint32_t val = read_io16(addr);
264 val |= read_io16(addr + 2) << 16;
267 virtual void write_io8w(uint32_t addr, uint32_t data, int* wait)
270 write_io8(addr, data);
272 virtual uint32_t read_io8w(uint32_t addr, int* wait)
275 return read_io8(addr);
277 virtual void write_io16w(uint32_t addr, uint32_t data, int* wait)
280 write_io8w(addr, data & 0xff, &wait_l);
281 write_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
282 *wait = wait_l + wait_h;
284 virtual uint32_t read_io16w(uint32_t addr, int* wait)
287 uint32_t val = read_io8w(addr, &wait_l);
288 val |= read_io8w(addr + 1, &wait_h) << 8;
289 *wait = wait_l + wait_h;
292 virtual void write_io32w(uint32_t addr, uint32_t data, int* wait)
295 write_io16w(addr, data & 0xffff, &wait_l);
296 write_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
297 *wait = wait_l + wait_h;
299 virtual uint32_t read_io32w(uint32_t addr, int* wait)
302 uint32_t val = read_io16w(addr, &wait_l);
303 val |= read_io16w(addr + 2, &wait_h) << 16;
304 *wait = wait_l + wait_h;
307 virtual void write_dma_io8(uint32_t addr, uint32_t data)
309 write_io8(addr, data);
311 virtual uint32_t read_dma_io8(uint32_t addr)
313 return read_io8(addr);
315 virtual void write_dma_io16(uint32_t addr, uint32_t data)
317 write_io16(addr, data);
319 virtual uint32_t read_dma_io16(uint32_t addr)
321 return read_io16(addr);
323 virtual void write_dma_io32(uint32_t addr, uint32_t data)
325 write_io32(addr, data);
327 virtual uint32_t read_dma_io32(uint32_t addr)
329 return read_io32(addr);
331 virtual void write_dma_io8w(uint32_t addr, uint32_t data, int* wait)
333 write_io8w(addr, data, wait);
335 virtual uint32_t read_dma_io8w(uint32_t addr, int* wait)
337 return read_io8w(addr, wait);
339 virtual void write_dma_io16w(uint32_t addr, uint32_t data, int* wait)
341 write_io16w(addr, data, wait);
343 virtual uint32_t read_dma_io16w(uint32_t addr, int* wait)
345 return read_io16w(addr, wait);
347 virtual void write_dma_io32w(uint32_t addr, uint32_t data, int* wait)
349 write_io32w(addr, data, wait);
351 virtual uint32_t read_dma_io32w(uint32_t addr, int* wait)
353 return read_io32w(addr, wait);
357 virtual void write_memory_mapped_io8(uint32_t addr, uint32_t data)
359 write_io8(addr, data);
361 virtual uint32_t read_memory_mapped_io8(uint32_t addr)
363 return read_io8(addr);
365 virtual void write_memory_mapped_io16(uint32_t addr, uint32_t data)
367 write_memory_mapped_io8(addr, data & 0xff);
368 write_memory_mapped_io8(addr + 1, (data >> 8) & 0xff);
370 virtual uint32_t read_memory_mapped_io16(uint32_t addr)
372 uint32_t val = read_memory_mapped_io8(addr);
373 val |= read_memory_mapped_io8(addr + 1) << 8;
376 virtual void write_memory_mapped_io32(uint32_t addr, uint32_t data)
378 write_memory_mapped_io16(addr, data & 0xffff);
379 write_memory_mapped_io16(addr + 2, (data >> 16) & 0xffff);
381 virtual uint32_t read_memory_mapped_io32(uint32_t addr)
383 uint32_t val = read_memory_mapped_io16(addr);
384 val |= read_memory_mapped_io16(addr + 2) << 16;
387 virtual void write_memory_mapped_io8w(uint32_t addr, uint32_t data, int* wait)
390 write_memory_mapped_io8(addr, data);
392 virtual uint32_t read_memory_mapped_io8w(uint32_t addr, int* wait)
395 return read_memory_mapped_io8(addr);
397 virtual void write_memory_mapped_io16w(uint32_t addr, uint32_t data, int* wait)
400 write_memory_mapped_io8w(addr, data & 0xff, &wait_l);
401 write_memory_mapped_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
402 *wait = wait_l + wait_h;
404 virtual uint32_t read_memory_mapped_io16w(uint32_t addr, int* wait)
407 uint32_t val = read_memory_mapped_io8w(addr, &wait_l);
408 val |= read_memory_mapped_io8w(addr + 1, &wait_h) << 8;
409 *wait = wait_l + wait_h;
412 virtual void write_memory_mapped_io32w(uint32_t addr, uint32_t data, int* wait)
415 write_memory_mapped_io16w(addr, data & 0xffff, &wait_l);
416 write_memory_mapped_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
417 *wait = wait_l + wait_h;
419 virtual uint32_t read_memory_mapped_io32w(uint32_t addr, int* wait)
422 uint32_t val = read_memory_mapped_io16w(addr, &wait_l);
423 val |= read_memory_mapped_io16w(addr + 2, &wait_h) << 16;
424 *wait = wait_l + wait_h;
438 output_t item[MAX_OUTPUT];
441 virtual void initialize_output_signals(outputs_t *items)
445 virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask, int shift)
447 int c = items->count++;
448 items->item[c].device = device;
449 items->item[c].id = id;
450 items->item[c].mask = mask;
451 items->item[c].shift = shift;
453 virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask)
455 int c = items->count++;
456 items->item[c].device = device;
457 items->item[c].id = id;
458 items->item[c].mask = mask;
459 items->item[c].shift = 0;
461 virtual void write_signals(outputs_t *items, uint32_t data)
463 for(int i = 0; i < items->count; i++) {
464 output_t *item = &items->item[i];
465 int shift = item->shift;
466 uint32_t val = (shift < 0) ? (data >> (-shift)) : (data << shift);
467 uint32_t mask = (shift < 0) ? (item->mask >> (-shift)) : (item->mask << shift);
468 item->device->write_signal(item->id, val, mask);
471 virtual void write_signal(int id, uint32_t data, uint32_t mask) {}
472 virtual uint32_t read_signal(int ch)
478 virtual void set_context_intr(DEVICE* device, uint32_t bit) {}
479 virtual void set_context_child(DEVICE* device) {}
481 // interrupt device to device
482 virtual void set_intr_iei(bool val) {}
484 // interrupt device to cpu
485 virtual void set_intr_line(bool line, bool pending, uint32_t bit) {}
487 // interrupt cpu to device
488 virtual uint32_t get_intr_ack()
492 virtual void notify_intr_reti() {}
493 virtual void notify_intr_ei() {}
496 virtual void do_dma() {}
499 virtual int run(int clock)
501 // when clock == -1, run one opecode
502 return (clock == -1 ? 1 : clock);
504 virtual void set_extra_clock(int clock) {}
505 virtual int get_extra_clock()
509 virtual uint32_t get_pc()
513 virtual uint32_t get_next_pc()
519 virtual bool bios_call_far_i86(uint32_t PC, uint16_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag)
523 virtual bool bios_int_i86(int intnum, uint16_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag)
527 virtual bool bios_ret_z80(uint16_t PC, pair_t* af, pair_t* bc, pair_t* de, pair_t* hl, pair_t* ix, pair_t* iy, uint8_t* iff1) {
531 const _TCHAR *get_device_name(void)
533 return (const _TCHAR *)this_device_name;
537 DEVICE* event_manager;
539 virtual void set_context_event_manager(DEVICE* device)
541 event_manager = device;
543 virtual int get_event_manager_id()
545 if(event_manager == NULL) {
546 event_manager = vm->first_device->next_device;
548 return event_manager->this_device_id;
550 virtual void register_event(DEVICE* device, int event_id, double usec, bool loop, int* register_id)
552 if(event_manager == NULL) {
553 event_manager = vm->first_device->next_device;
555 event_manager->register_event(device, event_id, usec, loop, register_id);
557 virtual void register_event_by_clock(DEVICE* device, int event_id, uint64_t clock, bool loop, int* register_id)
559 if(event_manager == NULL) {
560 event_manager = vm->first_device->next_device;
562 event_manager->register_event_by_clock(device, event_id, clock, loop, register_id);
564 virtual void cancel_event(DEVICE* device, int register_id)
566 if(event_manager == NULL) {
567 event_manager = vm->first_device->next_device;
569 event_manager->cancel_event(device, register_id);
571 virtual void register_frame_event(DEVICE* device)
573 if(event_manager == NULL) {
574 event_manager = vm->first_device->next_device;
576 event_manager->register_frame_event(device);
578 virtual void register_vline_event(DEVICE* device)
580 if(event_manager == NULL) {
581 event_manager = vm->first_device->next_device;
583 event_manager->register_vline_event(device);
585 virtual uint32_t get_event_remaining_clock(int register_id)
587 if(event_manager == NULL) {
588 event_manager = vm->first_device->next_device;
590 return event_manager->get_event_remaining_clock(register_id);
592 virtual double get_event_remaining_usec(int register_id)
594 if(event_manager == NULL) {
595 event_manager = vm->first_device->next_device;
597 return event_manager->get_event_remaining_usec(register_id);
599 virtual uint32_t get_current_clock()
601 if(event_manager == NULL) {
602 event_manager = vm->first_device->next_device;
604 return event_manager->get_current_clock();
606 virtual uint32_t get_passed_clock(uint32_t prev)
608 if(event_manager == NULL) {
609 event_manager = vm->first_device->next_device;
611 return event_manager->get_passed_clock(prev);
613 virtual double get_passed_usec(uint32_t prev)
615 if(event_manager == NULL) {
616 event_manager = vm->first_device->next_device;
618 return event_manager->get_passed_usec(prev);
620 virtual uint32_t get_passed_clock_since_vline()
622 if(event_manager == NULL) {
623 event_manager = vm->first_device->next_device;
625 return event_manager->get_passed_clock_since_vline();
627 virtual double get_passed_usec_since_vline()
629 if(event_manager == NULL) {
630 event_manager = vm->first_device->next_device;
632 return event_manager->get_passed_usec_since_vline();
634 virtual int get_cur_vline()
636 if(event_manager == NULL) {
637 event_manager = vm->first_device->next_device;
639 return event_manager->get_cur_vline();
641 virtual int get_cur_vline_clocks()
643 if(event_manager == NULL) {
644 event_manager = vm->first_device->next_device;
646 return event_manager->get_cur_vline_clocks();
648 virtual uint32_t get_cpu_pc(int index)
650 if(event_manager == NULL) {
651 event_manager = vm->first_device->next_device;
653 return event_manager->get_cpu_pc(index);
655 virtual void request_skip_frames()
657 if(event_manager == NULL) {
658 event_manager = vm->first_device->next_device;
660 event_manager->request_skip_frames();
662 virtual void set_frames_per_sec(double frames)
664 if(event_manager == NULL) {
665 event_manager = vm->first_device->next_device;
667 event_manager->set_frames_per_sec(frames);
669 virtual void set_lines_per_frame(int lines)
671 if(event_manager == NULL) {
672 event_manager = vm->first_device->next_device;
674 event_manager->set_lines_per_frame(lines);
676 virtual int get_lines_per_frame()
678 if(event_manager == NULL) {
679 event_manager = vm->first_device->next_device;
681 return event_manager->get_lines_per_frame();
683 // Force reder sound immediately when device's status has changed.
684 // You must call this after you changing registers (or enything).
685 // If has problems, try set_realtime_render.
686 // See mb8877.cpp and ym2203.cpp.
688 virtual void touch_sound(void)
690 if(event_manager == NULL) {
691 event_manager = vm->first_device->next_device;
693 event_manager->touch_sound();
695 // Force render per 1 sample automatically.
698 virtual void set_realtime_render(DEVICE* device, bool flag = true)
700 if(event_manager == NULL) {
701 event_manager = vm->first_device->next_device;
703 if(device != event_manager) event_manager->set_realtime_render(device, flag);
705 virtual void set_realtime_render(bool flag)
707 set_realtime_render(this, flag);
709 virtual void update_timing(int new_clocks, double new_frames_per_sec, int new_lines_per_frame) {}
712 virtual void event_callback(int event_id, int err) {}
713 virtual void event_pre_frame() {} // this event is to update timing settings
714 virtual void event_frame() {}
715 virtual void event_vline(int v, int clock) {}
716 virtual void event_hsync(int v, int h, int clock) {}
719 virtual void mix(int32_t* buffer, int cnt) {}
720 virtual void set_volume(int ch, int decibel_l, int decibel_r) {} // +1 equals +0.5dB (same as fmgen)
721 virtual void set_device_name(const _TCHAR *format, ...)
727 va_start(ap, format);
728 my_vstprintf_s(buffer, 1024, format, ap);
731 my_tcscpy_s(this_device_name, 128, buffer);
733 emu->get_osd()->set_vm_node(this_device_id, buffer);
737 virtual void out_debug_log(const char *fmt, ...)
743 vsnprintf(strbuf, 4095, fmt, ap);
744 emu->out_debug_log("%s", strbuf);
747 virtual void force_out_debug_log(const char *fmt, ...)
753 vsnprintf(strbuf, 4095, fmt, ap);
754 emu->force_out_debug_log("%s", strbuf);
760 virtual void *get_debugger()
764 virtual uint32_t get_debug_prog_addr_mask()
768 virtual uint32_t get_debug_data_addr_mask()
772 virtual void write_debug_data8(uint32_t addr, uint32_t data) {}
773 virtual uint32_t read_debug_data8(uint32_t addr)
777 virtual void write_debug_data16(uint32_t addr, uint32_t data)
779 write_debug_data8(addr, data & 0xff);
780 write_debug_data8(addr + 1, (data >> 8) & 0xff);
782 virtual uint32_t read_debug_data16(uint32_t addr)
784 uint32_t val = read_debug_data8(addr);
785 val |= read_debug_data8(addr + 1) << 8;
788 virtual void write_debug_data32(uint32_t addr, uint32_t data)
790 write_debug_data16(addr, data & 0xffff);
791 write_debug_data16(addr + 2, (data >> 16) & 0xffff);
793 virtual uint32_t read_debug_data32(uint32_t addr)
795 uint32_t val = read_debug_data16(addr);
796 val |= read_debug_data16(addr + 2) << 16;
799 virtual void write_debug_io8(uint32_t addr, uint32_t data) {}
800 virtual uint32_t read_debug_io8(uint32_t addr)
804 virtual void write_debug_io16(uint32_t addr, uint32_t data)
806 write_debug_io8(addr, data & 0xff);
807 write_debug_io8(addr + 1, (data >> 8) & 0xff);
809 virtual uint32_t read_debug_io16(uint32_t addr)
811 uint32_t val = read_debug_io8(addr);
812 val |= read_debug_io8(addr + 1) << 8;
815 virtual void write_debug_io32(uint32_t addr, uint32_t data)
817 write_debug_io16(addr, data & 0xffff);
818 write_debug_io16(addr + 2, (data >> 16) & 0xffff);
820 virtual uint32_t read_debug_io32(uint32_t addr)
822 uint32_t val = read_debug_io16(addr);
823 val |= read_debug_io16(addr + 2) << 16;
826 virtual bool write_debug_reg(const _TCHAR *reg, uint32_t data)
830 virtual uint32_t read_debug_reg(const _TCHAR *reg)
834 virtual void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len) {}
835 virtual int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
840 _TCHAR this_device_name[128];
846 #endif // USE_SHARED_DLL