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
57 class csp_state_utils;
59 extern CSP_Logger *csp_logger;
70 csp_state_utils *state_entry;
74 DEVICE(VM_TEMPLATE* parent_vm, EMU* parent_emu) : vm(parent_vm), emu(parent_emu)
78 p_logger = csp_logger;
83 memset(this_device_name, 0x00, sizeof(this_device_name));
84 strncpy(this_device_name, "Base Device", 128 - 1);
85 prev_device = vm->last_device;
87 if(vm->first_device == NULL) {
88 // this is the first device
89 vm->first_device = this;
92 // this is not the first device
93 vm->last_device->next_device = this;
94 this_device_id = vm->last_device->this_device_id + 1;
96 vm->last_device = this;
98 // primary event manager
101 //ToDo: Will implement real destructor per real classes and below destructor decl. with "virtual".
102 // This makes warning:
103 //"deleting object of polymorphic class type 'DEVICE' which has non-virtual
104 // destructor might cause undefined behavior [-Wdelete-non-virtual-dtor]".
107 virtual void initialize() { /* osd = emu->get_osd(); */ /* Initializing VM must be after initializing OSD. */ }
109 virtual void release() {
110 if(state_entry != NULL) delete state_entry;
114 virtual void release() {}
117 virtual void update_config() {}
118 virtual void save_state(FILEIO* state_fio) {}
119 virtual bool load_state(FILEIO* state_fio)
124 virtual void reset() {}
125 virtual void special_reset()
129 virtual bool process_state(FILEIO* state_fio, bool loading)
132 return load_state(state_fio);
134 save_state(state_fio);
139 // NOTE: the virtual bus interface functions for 16/32bit access invite the cpu is little endian.
140 // if the cpu is big endian, you need to implement them in the virtual machine memory/io classes.
143 virtual void write_data8(uint32_t addr, uint32_t data) {}
144 virtual uint32_t read_data8(uint32_t addr)
148 virtual void write_data16(uint32_t addr, uint32_t data)
150 write_data8(addr, data & 0xff);
151 write_data8(addr + 1, (data >> 8) & 0xff);
153 virtual uint32_t read_data16(uint32_t addr)
155 uint32_t val = read_data8(addr);
156 val |= read_data8(addr + 1) << 8;
159 virtual void write_data32(uint32_t addr, uint32_t data)
161 write_data16(addr, data & 0xffff);
162 write_data16(addr + 2, (data >> 16) & 0xffff);
164 virtual uint32_t read_data32(uint32_t addr)
166 uint32_t val = read_data16(addr);
167 val |= read_data16(addr + 2) << 16;
170 virtual void write_data8w(uint32_t addr, uint32_t data, int* wait)
173 write_data8(addr, data);
175 virtual uint32_t read_data8w(uint32_t addr, int* wait)
178 return read_data8(addr);
180 virtual void write_data16w(uint32_t addr, uint32_t data, int* wait)
183 write_data8w(addr, data & 0xff, &wait_l);
184 write_data8w(addr + 1, (data >> 8) & 0xff, &wait_h);
185 *wait = wait_l + wait_h;
187 virtual uint32_t read_data16w(uint32_t addr, int* wait)
190 uint32_t val = read_data8w(addr, &wait_l);
191 val |= read_data8w(addr + 1, &wait_h) << 8;
192 *wait = wait_l + wait_h;
195 virtual void write_data32w(uint32_t addr, uint32_t data, int* wait)
198 write_data16w(addr, data & 0xffff, &wait_l);
199 write_data16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
200 *wait = wait_l + wait_h;
202 virtual uint32_t read_data32w(uint32_t addr, int* wait)
205 uint32_t val = read_data16w(addr, &wait_l);
206 val |= read_data16w(addr + 2, &wait_h) << 16;
207 *wait = wait_l + wait_h;
210 virtual uint32_t fetch_op(uint32_t addr, int *wait)
212 return read_data8w(addr, wait);
214 virtual void write_dma_data8(uint32_t addr, uint32_t data)
216 write_data8(addr, data);
218 virtual uint32_t read_dma_data8(uint32_t addr)
220 return read_data8(addr);
222 virtual void write_dma_data16(uint32_t addr, uint32_t data)
224 write_data16(addr, data);
226 virtual uint32_t read_dma_data16(uint32_t addr)
228 return read_data16(addr);
230 virtual void write_dma_data32(uint32_t addr, uint32_t data)
232 write_data32(addr, data);
234 virtual uint32_t read_dma_data32(uint32_t addr)
236 return read_data32(addr);
238 virtual void write_dma_data8w(uint32_t addr, uint32_t data, int* wait)
240 write_data8w(addr, data, wait);
242 virtual uint32_t read_dma_data8w(uint32_t addr, int* wait)
244 return read_data8w(addr, wait);
246 virtual void write_dma_data16w(uint32_t addr, uint32_t data, int* wait)
248 write_data16w(addr, data, wait);
250 virtual uint32_t read_dma_data16w(uint32_t addr, int* wait)
252 return read_data16w(addr, wait);
254 virtual void write_dma_data32w(uint32_t addr, uint32_t data, int* wait)
256 write_data32w(addr, data, wait);
258 virtual uint32_t read_dma_data32w(uint32_t addr, int* wait)
260 return read_data32w(addr, wait);
264 virtual void write_io8(uint32_t addr, uint32_t data) {}
265 virtual uint32_t read_io8(uint32_t addr)
267 #ifdef IOBUS_RETURN_ADDR
268 return (addr & 1 ? addr >> 8 : addr) & 0xff;
273 virtual void write_io16(uint32_t addr, uint32_t data)
275 write_io8(addr, data & 0xff);
276 write_io8(addr + 1, (data >> 8) & 0xff);
278 virtual uint32_t read_io16(uint32_t addr)
280 uint32_t val = read_io8(addr);
281 val |= read_io8(addr + 1) << 8;
284 virtual void write_io32(uint32_t addr, uint32_t data)
286 write_io16(addr, data & 0xffff);
287 write_io16(addr + 2, (data >> 16) & 0xffff);
289 virtual uint32_t read_io32(uint32_t addr)
291 uint32_t val = read_io16(addr);
292 val |= read_io16(addr + 2) << 16;
295 virtual void write_io8w(uint32_t addr, uint32_t data, int* wait)
298 write_io8(addr, data);
300 virtual uint32_t read_io8w(uint32_t addr, int* wait)
303 return read_io8(addr);
305 virtual void write_io16w(uint32_t addr, uint32_t data, int* wait)
308 write_io8w(addr, data & 0xff, &wait_l);
309 write_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
310 *wait = wait_l + wait_h;
312 virtual uint32_t read_io16w(uint32_t addr, int* wait)
315 uint32_t val = read_io8w(addr, &wait_l);
316 val |= read_io8w(addr + 1, &wait_h) << 8;
317 *wait = wait_l + wait_h;
320 virtual void write_io32w(uint32_t addr, uint32_t data, int* wait)
323 write_io16w(addr, data & 0xffff, &wait_l);
324 write_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
325 *wait = wait_l + wait_h;
327 virtual uint32_t read_io32w(uint32_t addr, int* wait)
330 uint32_t val = read_io16w(addr, &wait_l);
331 val |= read_io16w(addr + 2, &wait_h) << 16;
332 *wait = wait_l + wait_h;
335 virtual void write_dma_io8(uint32_t addr, uint32_t data)
337 write_io8(addr, data);
339 virtual uint32_t read_dma_io8(uint32_t addr)
341 return read_io8(addr);
343 virtual void write_dma_io16(uint32_t addr, uint32_t data)
345 write_io16(addr, data);
347 virtual uint32_t read_dma_io16(uint32_t addr)
349 return read_io16(addr);
351 virtual void write_dma_io32(uint32_t addr, uint32_t data)
353 write_io32(addr, data);
355 virtual uint32_t read_dma_io32(uint32_t addr)
357 return read_io32(addr);
359 virtual void write_dma_io8w(uint32_t addr, uint32_t data, int* wait)
361 write_io8w(addr, data, wait);
363 virtual uint32_t read_dma_io8w(uint32_t addr, int* wait)
365 return read_io8w(addr, wait);
367 virtual void write_dma_io16w(uint32_t addr, uint32_t data, int* wait)
369 write_io16w(addr, data, wait);
371 virtual uint32_t read_dma_io16w(uint32_t addr, int* wait)
373 return read_io16w(addr, wait);
375 virtual void write_dma_io32w(uint32_t addr, uint32_t data, int* wait)
377 write_io32w(addr, data, wait);
379 virtual uint32_t read_dma_io32w(uint32_t addr, int* wait)
381 return read_io32w(addr, wait);
385 virtual void write_memory_mapped_io8(uint32_t addr, uint32_t data)
387 write_io8(addr, data);
389 virtual uint32_t read_memory_mapped_io8(uint32_t addr)
391 return read_io8(addr);
393 virtual void write_memory_mapped_io16(uint32_t addr, uint32_t data)
395 write_memory_mapped_io8(addr, data & 0xff);
396 write_memory_mapped_io8(addr + 1, (data >> 8) & 0xff);
398 virtual uint32_t read_memory_mapped_io16(uint32_t addr)
400 uint32_t val = read_memory_mapped_io8(addr);
401 val |= read_memory_mapped_io8(addr + 1) << 8;
404 virtual void write_memory_mapped_io32(uint32_t addr, uint32_t data)
406 write_memory_mapped_io16(addr, data & 0xffff);
407 write_memory_mapped_io16(addr + 2, (data >> 16) & 0xffff);
409 virtual uint32_t read_memory_mapped_io32(uint32_t addr)
411 uint32_t val = read_memory_mapped_io16(addr);
412 val |= read_memory_mapped_io16(addr + 2) << 16;
415 virtual void write_memory_mapped_io8w(uint32_t addr, uint32_t data, int* wait)
418 write_memory_mapped_io8(addr, data);
420 virtual uint32_t read_memory_mapped_io8w(uint32_t addr, int* wait)
423 return read_memory_mapped_io8(addr);
425 virtual void write_memory_mapped_io16w(uint32_t addr, uint32_t data, int* wait)
428 write_memory_mapped_io8w(addr, data & 0xff, &wait_l);
429 write_memory_mapped_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
430 *wait = wait_l + wait_h;
432 virtual uint32_t read_memory_mapped_io16w(uint32_t addr, int* wait)
435 uint32_t val = read_memory_mapped_io8w(addr, &wait_l);
436 val |= read_memory_mapped_io8w(addr + 1, &wait_h) << 8;
437 *wait = wait_l + wait_h;
440 virtual void write_memory_mapped_io32w(uint32_t addr, uint32_t data, int* wait)
443 write_memory_mapped_io16w(addr, data & 0xffff, &wait_l);
444 write_memory_mapped_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
445 *wait = wait_l + wait_h;
447 virtual uint32_t read_memory_mapped_io32w(uint32_t addr, int* wait)
450 uint32_t val = read_memory_mapped_io16w(addr, &wait_l);
451 val |= read_memory_mapped_io16w(addr + 2, &wait_h) << 16;
452 *wait = wait_l + wait_h;
466 output_t item[MAX_OUTPUT];
469 virtual void initialize_output_signals(outputs_t *items)
473 virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask, int shift)
475 int c = items->count++;
476 items->item[c].device = device;
477 items->item[c].id = id;
478 items->item[c].mask = mask;
479 items->item[c].shift = shift;
481 virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask)
483 int c = items->count++;
484 items->item[c].device = device;
485 items->item[c].id = id;
486 items->item[c].mask = mask;
487 items->item[c].shift = 0;
489 virtual void write_signals(outputs_t *items, uint32_t data)
491 for(int i = 0; i < items->count; i++) {
492 output_t *item = &items->item[i];
493 int shift = item->shift;
494 uint32_t val = (shift < 0) ? (data >> (-shift)) : (data << shift);
495 uint32_t mask = (shift < 0) ? (item->mask >> (-shift)) : (item->mask << shift);
496 item->device->write_signal(item->id, val, mask);
499 virtual void write_signal(int id, uint32_t data, uint32_t mask) {}
500 virtual uint32_t read_signal(int ch)
506 virtual void set_context_intr(DEVICE* device, uint32_t bit) {}
507 virtual void set_context_child(DEVICE* device) {}
509 // interrupt device to device
510 virtual void set_intr_iei(bool val) {}
512 // interrupt device to cpu
513 virtual void set_intr_line(bool line, bool pending, uint32_t bit) {}
515 // interrupt cpu to device
516 virtual uint32_t get_intr_ack()
520 virtual void notify_intr_reti() {}
521 virtual void notify_intr_ei() {}
524 virtual void do_dma() {}
527 virtual int run(int clock)
529 // when clock == -1, run one opecode
530 return (clock == -1 ? 1 : clock);
532 virtual void set_extra_clock(int clock) {}
533 virtual int get_extra_clock()
537 virtual uint32_t get_pc()
541 virtual uint32_t get_next_pc()
547 virtual bool bios_call_far_i86(uint32_t PC, uint16_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag)
551 virtual bool bios_int_i86(int intnum, uint16_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag)
555 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) {
559 const _TCHAR *get_device_name(void)
561 return (const _TCHAR *)this_device_name;
565 DEVICE* event_manager;
567 virtual void set_context_event_manager(DEVICE* device)
569 event_manager = device;
571 virtual int get_event_manager_id()
573 if(event_manager == NULL) {
574 event_manager = vm->first_device->next_device;
576 return event_manager->this_device_id;
578 virtual void register_event(DEVICE* device, int event_id, double usec, bool loop, int* register_id)
580 if(event_manager == NULL) {
581 event_manager = vm->first_device->next_device;
583 event_manager->register_event(device, event_id, usec, loop, register_id);
585 virtual void register_event_by_clock(DEVICE* device, int event_id, uint64_t clock, bool loop, int* register_id)
587 if(event_manager == NULL) {
588 event_manager = vm->first_device->next_device;
590 event_manager->register_event_by_clock(device, event_id, clock, loop, register_id);
592 virtual void cancel_event(DEVICE* device, int register_id)
594 if(event_manager == NULL) {
595 event_manager = vm->first_device->next_device;
597 event_manager->cancel_event(device, register_id);
599 virtual void register_frame_event(DEVICE* device)
601 if(event_manager == NULL) {
602 event_manager = vm->first_device->next_device;
604 event_manager->register_frame_event(device);
606 virtual void register_vline_event(DEVICE* device)
608 if(event_manager == NULL) {
609 event_manager = vm->first_device->next_device;
611 event_manager->register_vline_event(device);
613 virtual uint32_t get_event_remaining_clock(int register_id)
615 if(event_manager == NULL) {
616 event_manager = vm->first_device->next_device;
618 return event_manager->get_event_remaining_clock(register_id);
620 virtual double get_event_remaining_usec(int register_id)
622 if(event_manager == NULL) {
623 event_manager = vm->first_device->next_device;
625 return event_manager->get_event_remaining_usec(register_id);
627 virtual uint32_t get_current_clock()
629 if(event_manager == NULL) {
630 event_manager = vm->first_device->next_device;
632 return event_manager->get_current_clock();
634 virtual uint32_t get_passed_clock(uint32_t prev)
636 if(event_manager == NULL) {
637 event_manager = vm->first_device->next_device;
639 return event_manager->get_passed_clock(prev);
641 virtual double get_passed_usec(uint32_t prev)
643 if(event_manager == NULL) {
644 event_manager = vm->first_device->next_device;
646 return event_manager->get_passed_usec(prev);
648 virtual uint32_t get_passed_clock_since_vline()
650 if(event_manager == NULL) {
651 event_manager = vm->first_device->next_device;
653 return event_manager->get_passed_clock_since_vline();
655 virtual double get_passed_usec_since_vline()
657 if(event_manager == NULL) {
658 event_manager = vm->first_device->next_device;
660 return event_manager->get_passed_usec_since_vline();
662 virtual int get_cur_vline()
664 if(event_manager == NULL) {
665 event_manager = vm->first_device->next_device;
667 return event_manager->get_cur_vline();
669 virtual int get_cur_vline_clocks()
671 if(event_manager == NULL) {
672 event_manager = vm->first_device->next_device;
674 return event_manager->get_cur_vline_clocks();
676 virtual uint32_t get_cpu_pc(int index)
678 if(event_manager == NULL) {
679 event_manager = vm->first_device->next_device;
681 return event_manager->get_cpu_pc(index);
683 virtual void request_skip_frames()
685 if(event_manager == NULL) {
686 event_manager = vm->first_device->next_device;
688 event_manager->request_skip_frames();
690 virtual void set_frames_per_sec(double frames)
692 if(event_manager == NULL) {
693 event_manager = vm->first_device->next_device;
695 event_manager->set_frames_per_sec(frames);
697 virtual void set_lines_per_frame(int lines)
699 if(event_manager == NULL) {
700 event_manager = vm->first_device->next_device;
702 event_manager->set_lines_per_frame(lines);
704 virtual int get_lines_per_frame()
706 if(event_manager == NULL) {
707 event_manager = vm->first_device->next_device;
709 return event_manager->get_lines_per_frame();
711 // Force reder sound immediately when device's status has changed.
712 // You must call this after you changing registers (or enything).
713 // If has problems, try set_realtime_render.
714 // See mb8877.cpp and ym2203.cpp.
716 virtual void touch_sound(void)
718 if(event_manager == NULL) {
719 event_manager = vm->first_device->next_device;
721 event_manager->touch_sound();
723 // Force render per 1 sample automatically.
726 virtual void set_realtime_render(DEVICE* device, bool flag = true)
728 if(event_manager == NULL) {
729 event_manager = vm->first_device->next_device;
731 if(device != event_manager) event_manager->set_realtime_render(device, flag);
733 virtual void set_realtime_render(bool flag)
735 set_realtime_render(this, flag);
737 virtual void update_timing(int new_clocks, double new_frames_per_sec, int new_lines_per_frame) {}
740 virtual void event_callback(int event_id, int err) {}
741 virtual void event_pre_frame() {} // this event is to update timing settings
742 virtual void event_frame() {}
743 virtual void event_vline(int v, int clock) {}
744 virtual void event_hsync(int v, int h, int clock) {}
747 virtual void mix(int32_t* buffer, int cnt) {}
748 virtual void set_volume(int ch, int decibel_l, int decibel_r) {} // +1 equals +0.5dB (same as fmgen)
749 virtual void set_device_name(const _TCHAR *format, ...)
755 va_start(ap, format);
756 my_vstprintf_s(buffer, 1024, format, ap);
759 my_tcscpy_s(this_device_name, 128, buffer);
761 emu->get_osd()->set_vm_node(this_device_id, buffer);
765 virtual void out_debug_log(const char *fmt, ...)
771 vsnprintf(strbuf, 4095, fmt, ap);
772 emu->out_debug_log("%s", strbuf);
775 virtual void force_out_debug_log(const char *fmt, ...)
781 vsnprintf(strbuf, 4095, fmt, ap);
782 emu->force_out_debug_log("%s", strbuf);
788 virtual void *get_debugger()
792 virtual uint32_t get_debug_prog_addr_mask()
796 virtual uint32_t get_debug_data_addr_mask()
800 virtual void write_debug_data8(uint32_t addr, uint32_t data) {}
801 virtual uint32_t read_debug_data8(uint32_t addr)
805 virtual void write_debug_data16(uint32_t addr, uint32_t data)
807 write_debug_data8(addr, data & 0xff);
808 write_debug_data8(addr + 1, (data >> 8) & 0xff);
810 virtual uint32_t read_debug_data16(uint32_t addr)
812 uint32_t val = read_debug_data8(addr);
813 val |= read_debug_data8(addr + 1) << 8;
816 virtual void write_debug_data32(uint32_t addr, uint32_t data)
818 write_debug_data16(addr, data & 0xffff);
819 write_debug_data16(addr + 2, (data >> 16) & 0xffff);
821 virtual uint32_t read_debug_data32(uint32_t addr)
823 uint32_t val = read_debug_data16(addr);
824 val |= read_debug_data16(addr + 2) << 16;
827 virtual void write_debug_io8(uint32_t addr, uint32_t data) {}
828 virtual uint32_t read_debug_io8(uint32_t addr)
832 virtual void write_debug_io16(uint32_t addr, uint32_t data)
834 write_debug_io8(addr, data & 0xff);
835 write_debug_io8(addr + 1, (data >> 8) & 0xff);
837 virtual uint32_t read_debug_io16(uint32_t addr)
839 uint32_t val = read_debug_io8(addr);
840 val |= read_debug_io8(addr + 1) << 8;
843 virtual void write_debug_io32(uint32_t addr, uint32_t data)
845 write_debug_io16(addr, data & 0xffff);
846 write_debug_io16(addr + 2, (data >> 16) & 0xffff);
848 virtual uint32_t read_debug_io32(uint32_t addr)
850 uint32_t val = read_debug_io16(addr);
851 val |= read_debug_io16(addr + 2) << 16;
854 virtual bool write_debug_reg(const _TCHAR *reg, uint32_t data)
858 virtual uint32_t read_debug_reg(const _TCHAR *reg)
862 virtual void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len) {}
863 virtual int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
868 _TCHAR this_device_name[128];
874 #endif // USE_SHARED_DLL