2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
10 #ifndef _LIBCPU_NEWDEV_DEVICE_H_
11 #define _LIBCPU_NEWDEV_DEVICE_H_
19 //#define USE_DEVICE_NAME
21 // max devices connected to the output port
25 #define SIG_CPU_IRQ 101
26 #define SIG_CPU_FIRQ 102
27 #define SIG_CPU_NMI 103
28 #define SIG_CPU_BUSREQ 104
29 #define SIG_CPU_DEBUG 105
31 #define SIG_PRINTER_DATA 201
32 #define SIG_PRINTER_STROBE 202
33 #define SIG_PRINTER_RESET 203
34 #define SIG_PRINTER_BUSY 204
35 #define SIG_PRINTER_ACK 205
36 #define SIG_PRINTER_SELECT 206
38 #define SIG_SCSI_DAT 301
39 #define SIG_SCSI_BSY 302
40 #define SIG_SCSI_CD 303
41 #define SIG_SCSI_IO 304
42 #define SIG_SCSI_MSG 305
43 #define SIG_SCSI_REQ 306
44 #define SIG_SCSI_SEL 307
45 #define SIG_SCSI_ATN 308
46 #define SIG_SCSI_ACK 309
47 #define SIG_SCSI_RST 310
49 #include "vm_template.h"
52 class csp_state_utils;
62 csp_state_utils *state_entry;
65 DEVICE(VM_TEMPLATE* parent_vm, EMU* parent_emu);
66 //ToDo: Will implement real destructor per real classes and below destructor decl. with "virtual".
67 // This makes warning:
68 //"deleting object of polymorphic class type 'DEVICE' which has non-virtual
69 // destructor might cause undefined behavior [-Wdelete-non-virtual-dtor]".
73 virtual void initialize() { /* osd = emu->get_osd(); */}
74 virtual void release();
76 virtual void update_config() {}
77 virtual void save_state(FILEIO* state_fio) {}
78 virtual bool load_state(FILEIO* state_fio)
83 virtual void decl_state(void);
84 virtual void enter_decl_state(int version);
85 virtual void enter_decl_state(int version, _TCHAR *name);
86 virtual void leave_decl_state(void);
89 virtual void reset() {}
90 virtual void special_reset()
95 // NOTE: the virtual bus interface functions for 16/32bit access invite the cpu is little endian.
96 // if the cpu is big endian, you need to implement them in the virtual machine memory/io classes.
99 virtual void write_data8(uint32_t addr, uint32_t data) {}
100 virtual uint32_t read_data8(uint32_t addr)
104 virtual void write_data16(uint32_t addr, uint32_t data)
106 write_data8(addr, data & 0xff);
107 write_data8(addr + 1, (data >> 8) & 0xff);
109 virtual uint32_t read_data16(uint32_t addr)
111 uint32_t val = read_data8(addr);
112 val |= read_data8(addr + 1) << 8;
115 virtual void write_data32(uint32_t addr, uint32_t data)
117 write_data16(addr, data & 0xffff);
118 write_data16(addr + 2, (data >> 16) & 0xffff);
120 virtual uint32_t read_data32(uint32_t addr)
122 uint32_t val = read_data16(addr);
123 val |= read_data16(addr + 2) << 16;
126 virtual void write_data8w(uint32_t addr, uint32_t data, int* wait)
129 write_data8(addr, data);
131 virtual uint32_t read_data8w(uint32_t addr, int* wait)
134 return read_data8(addr);
136 virtual void write_data16w(uint32_t addr, uint32_t data, int* wait)
139 write_data8w(addr, data & 0xff, &wait_l);
140 write_data8w(addr + 1, (data >> 8) & 0xff, &wait_h);
141 *wait = wait_l + wait_h;
143 virtual uint32_t read_data16w(uint32_t addr, int* wait)
146 uint32_t val = read_data8w(addr, &wait_l);
147 val |= read_data8w(addr + 1, &wait_h) << 8;
148 *wait = wait_l + wait_h;
151 virtual void write_data32w(uint32_t addr, uint32_t data, int* wait)
154 write_data16w(addr, data & 0xffff, &wait_l);
155 write_data16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
156 *wait = wait_l + wait_h;
158 virtual uint32_t read_data32w(uint32_t addr, int* wait)
161 uint32_t val = read_data16w(addr, &wait_l);
162 val |= read_data16w(addr + 2, &wait_h) << 16;
163 *wait = wait_l + wait_h;
166 virtual uint32_t fetch_op(uint32_t addr, int *wait)
168 return read_data8w(addr, wait);
170 virtual void write_dma_data8(uint32_t addr, uint32_t data)
172 write_data8(addr, data);
174 virtual uint32_t read_dma_data8(uint32_t addr)
176 return read_data8(addr);
178 virtual void write_dma_data16(uint32_t addr, uint32_t data)
180 write_data16(addr, data);
182 virtual uint32_t read_dma_data16(uint32_t addr)
184 return read_data16(addr);
186 virtual void write_dma_data32(uint32_t addr, uint32_t data)
188 write_data32(addr, data);
190 virtual uint32_t read_dma_data32(uint32_t addr)
192 return read_data32(addr);
194 virtual void write_dma_data8w(uint32_t addr, uint32_t data, int* wait)
196 write_data8w(addr, data, wait);
198 virtual uint32_t read_dma_data8w(uint32_t addr, int* wait)
200 return read_data8w(addr, wait);
202 virtual void write_dma_data16w(uint32_t addr, uint32_t data, int* wait)
204 write_data16w(addr, data, wait);
206 virtual uint32_t read_dma_data16w(uint32_t addr, int* wait)
208 return read_data16w(addr, wait);
210 virtual void write_dma_data32w(uint32_t addr, uint32_t data, int* wait)
212 write_data32w(addr, data, wait);
214 virtual uint32_t read_dma_data32w(uint32_t addr, int* wait)
216 return read_data32w(addr, wait);
220 virtual void write_io8(uint32_t addr, uint32_t data) {}
221 virtual uint32_t read_io8(uint32_t addr);
222 virtual void write_io16(uint32_t addr, uint32_t data)
224 write_io8(addr, data & 0xff);
225 write_io8(addr + 1, (data >> 8) & 0xff);
227 virtual uint32_t read_io16(uint32_t addr)
229 uint32_t val = read_io8(addr);
230 val |= read_io8(addr + 1) << 8;
233 virtual void write_io32(uint32_t addr, uint32_t data)
235 write_io16(addr, data & 0xffff);
236 write_io16(addr + 2, (data >> 16) & 0xffff);
238 virtual uint32_t read_io32(uint32_t addr)
240 uint32_t val = read_io16(addr);
241 val |= read_io16(addr + 2) << 16;
244 virtual void write_io8w(uint32_t addr, uint32_t data, int* wait)
247 write_io8(addr, data);
249 virtual uint32_t read_io8w(uint32_t addr, int* wait)
252 return read_io8(addr);
254 virtual void write_io16w(uint32_t addr, uint32_t data, int* wait)
257 write_io8w(addr, data & 0xff, &wait_l);
258 write_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
259 *wait = wait_l + wait_h;
261 virtual uint32_t read_io16w(uint32_t addr, int* wait)
264 uint32_t val = read_io8w(addr, &wait_l);
265 val |= read_io8w(addr + 1, &wait_h) << 8;
266 *wait = wait_l + wait_h;
269 virtual void write_io32w(uint32_t addr, uint32_t data, int* wait)
272 write_io16w(addr, data & 0xffff, &wait_l);
273 write_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
274 *wait = wait_l + wait_h;
276 virtual uint32_t read_io32w(uint32_t addr, int* wait)
279 uint32_t val = read_io16w(addr, &wait_l);
280 val |= read_io16w(addr + 2, &wait_h) << 16;
281 *wait = wait_l + wait_h;
284 virtual void write_dma_io8(uint32_t addr, uint32_t data)
286 write_io8(addr, data);
288 virtual uint32_t read_dma_io8(uint32_t addr)
290 return read_io8(addr);
292 virtual void write_dma_io16(uint32_t addr, uint32_t data)
294 write_io16(addr, data);
296 virtual uint32_t read_dma_io16(uint32_t addr)
298 return read_io16(addr);
300 virtual void write_dma_io32(uint32_t addr, uint32_t data)
302 write_io32(addr, data);
304 virtual uint32_t read_dma_io32(uint32_t addr)
306 return read_io32(addr);
308 virtual void write_dma_io8w(uint32_t addr, uint32_t data, int* wait)
310 write_io8w(addr, data, wait);
312 virtual uint32_t read_dma_io8w(uint32_t addr, int* wait)
314 return read_io8w(addr, wait);
316 virtual void write_dma_io16w(uint32_t addr, uint32_t data, int* wait)
318 write_io16w(addr, data, wait);
320 virtual uint32_t read_dma_io16w(uint32_t addr, int* wait)
322 return read_io16w(addr, wait);
324 virtual void write_dma_io32w(uint32_t addr, uint32_t data, int* wait)
326 write_io32w(addr, data, wait);
328 virtual uint32_t read_dma_io32w(uint32_t addr, int* wait)
330 return read_io32w(addr, wait);
334 virtual void write_memory_mapped_io8(uint32_t addr, uint32_t data)
336 write_io8(addr, data);
338 virtual uint32_t read_memory_mapped_io8(uint32_t addr)
340 return read_io8(addr);
342 virtual void write_memory_mapped_io16(uint32_t addr, uint32_t data)
344 write_memory_mapped_io8(addr, data & 0xff);
345 write_memory_mapped_io8(addr + 1, (data >> 8) & 0xff);
347 virtual uint32_t read_memory_mapped_io16(uint32_t addr)
349 uint32_t val = read_memory_mapped_io8(addr);
350 val |= read_memory_mapped_io8(addr + 1) << 8;
353 virtual void write_memory_mapped_io32(uint32_t addr, uint32_t data)
355 write_memory_mapped_io16(addr, data & 0xffff);
356 write_memory_mapped_io16(addr + 2, (data >> 16) & 0xffff);
358 virtual uint32_t read_memory_mapped_io32(uint32_t addr)
360 uint32_t val = read_memory_mapped_io16(addr);
361 val |= read_memory_mapped_io16(addr + 2) << 16;
364 virtual void write_memory_mapped_io8w(uint32_t addr, uint32_t data, int* wait)
367 write_memory_mapped_io8(addr, data);
369 virtual uint32_t read_memory_mapped_io8w(uint32_t addr, int* wait)
372 return read_memory_mapped_io8(addr);
374 virtual void write_memory_mapped_io16w(uint32_t addr, uint32_t data, int* wait)
377 write_memory_mapped_io8w(addr, data & 0xff, &wait_l);
378 write_memory_mapped_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
379 *wait = wait_l + wait_h;
381 virtual uint32_t read_memory_mapped_io16w(uint32_t addr, int* wait)
384 uint32_t val = read_memory_mapped_io8w(addr, &wait_l);
385 val |= read_memory_mapped_io8w(addr + 1, &wait_h) << 8;
386 *wait = wait_l + wait_h;
389 virtual void write_memory_mapped_io32w(uint32_t addr, uint32_t data, int* wait)
392 write_memory_mapped_io16w(addr, data & 0xffff, &wait_l);
393 write_memory_mapped_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
394 *wait = wait_l + wait_h;
396 virtual uint32_t read_memory_mapped_io32w(uint32_t addr, int* wait)
399 uint32_t val = read_memory_mapped_io16w(addr, &wait_l);
400 val |= read_memory_mapped_io16w(addr + 2, &wait_h) << 16;
401 *wait = wait_l + wait_h;
415 output_t item[MAX_OUTPUT];
418 virtual void initialize_output_signals(outputs_t *items)
422 virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask, int shift)
424 int c = items->count++;
425 items->item[c].device = device;
426 items->item[c].id = id;
427 items->item[c].mask = mask;
428 items->item[c].shift = shift;
430 virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask)
432 int c = items->count++;
433 items->item[c].device = device;
434 items->item[c].id = id;
435 items->item[c].mask = mask;
436 items->item[c].shift = 0;
438 virtual void write_signals(outputs_t *items, uint32_t data)
440 for(int i = 0; i < items->count; i++) {
441 output_t *item = &items->item[i];
442 int shift = item->shift;
443 uint32_t val = (shift < 0) ? (data >> (-shift)) : (data << shift);
444 uint32_t mask = (shift < 0) ? (item->mask >> (-shift)) : (item->mask << shift);
445 item->device->write_signal(item->id, val, mask);
448 virtual void write_signal(int id, uint32_t data, uint32_t mask) {}
449 virtual uint32_t read_signal(int ch)
455 virtual void set_context_intr(DEVICE* device, uint32_t bit) {}
456 virtual void set_context_child(DEVICE* device) {}
458 // interrupt device to device
459 virtual void set_intr_iei(bool val) {}
461 // interrupt device to cpu
462 virtual void set_intr_line(bool line, bool pending, uint32_t bit) {}
464 // interrupt cpu to device
465 virtual uint32_t get_intr_ack()
469 virtual void notify_intr_reti() {}
470 virtual void notify_intr_ei() {}
473 virtual void do_dma() {}
476 virtual int run(int clock)
478 // when clock == -1, run one opecode
479 return (clock == -1 ? 1 : clock);
481 virtual void set_extra_clock(int clock) {}
482 virtual int get_extra_clock()
486 virtual uint32_t get_pc()
490 virtual uint32_t get_next_pc()
496 virtual bool bios_call_far_i86(uint32_t PC, uint16_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag)
500 virtual bool bios_int_i86(int intnum, uint16_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag)
504 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) {
508 const _TCHAR *get_device_name(void)
510 return (const _TCHAR *)this_device_name;
514 DEVICE* event_manager;
516 virtual void set_context_event_manager(DEVICE* device)
518 event_manager = device;
520 virtual int get_event_manager_id();
521 virtual void register_event(DEVICE* device, int event_id, double usec, bool loop, int* register_id);
522 virtual void register_event_by_clock(DEVICE* device, int event_id, uint64_t clock, bool loop, int* register_id);
523 virtual void cancel_event(DEVICE* device, int register_id);
524 virtual void register_frame_event(DEVICE* device);
525 virtual void register_vline_event(DEVICE* device);
526 virtual uint32_t get_event_remaining_clock(int register_id);
527 virtual double get_event_remaining_usec(int register_id);
528 virtual uint32_t get_current_clock();
529 virtual uint32_t get_passed_clock(uint32_t prev);
530 virtual double get_passed_usec(uint32_t prev);
531 virtual uint32_t get_passed_clock_since_vline();
532 virtual double get_passed_usec_since_vline();
533 virtual int get_cur_vline();
534 virtual int get_cur_vline_clocks();
535 virtual uint32_t get_cpu_pc(int index);
536 virtual void request_skip_frames();
537 virtual void set_frames_per_sec(double frames);
538 virtual void set_lines_per_frame(int lines);
539 virtual int get_lines_per_frame(void);
540 // Force render sound immediately when device's status has changed.
541 // You must call this after you changing registers (or enything).
542 // If has problems, try set_realtime_render.
543 // See mb8877.cpp and ym2203.cpp.
545 virtual void touch_sound(void);
546 // Force render per 1 sample automatically.
549 virtual void set_realtime_render(DEVICE *device, bool flag);
550 virtual void set_realtime_render(bool flag)
552 set_realtime_render(this, flag);
554 virtual void update_timing(int new_clocks, double new_frames_per_sec, int new_lines_per_frame) {}
557 virtual void event_callback(int event_id, int err) {}
558 virtual void event_pre_frame() {} // this event is to update timing settings
559 virtual void event_frame() {}
560 virtual void event_vline(int v, int clock) {}
561 virtual void event_hsync(int v, int h, int clock) {}
564 virtual void mix(int32_t* buffer, int cnt) {}
565 virtual void set_volume(int ch, int decibel_l, int decibel_r) {} // +1 equals +0.5dB (same as fmgen)
566 virtual void set_device_name(const _TCHAR *format, ...);
567 virtual void out_debug_log(const char *fmt, ...);
568 virtual void force_out_debug_log(const char *fmt, ...);
571 // DEBUGGER is enabled by default.
572 virtual void *get_debugger();
573 virtual uint32_t get_debug_prog_addr_mask();
574 virtual uint32_t get_debug_data_addr_mask();
575 virtual void write_debug_data8(uint32_t addr, uint32_t data);
576 virtual uint32_t read_debug_data8(uint32_t addr);
577 virtual void write_debug_data16(uint32_t addr, uint32_t data);
578 virtual uint32_t read_debug_data16(uint32_t addr);
579 virtual void write_debug_data32(uint32_t addr, uint32_t data);
580 virtual uint32_t read_debug_data32(uint32_t addr);
581 virtual void write_debug_io8(uint32_t addr, uint32_t data);
582 virtual uint32_t read_debug_io8(uint32_t addr);
583 virtual void write_debug_io16(uint32_t addr, uint32_t data);
584 virtual uint32_t read_debug_io16(uint32_t addr);
585 virtual void write_debug_io32(uint32_t addr, uint32_t data);
586 virtual uint32_t read_debug_io32(uint32_t addr);
587 virtual bool write_debug_reg(const _TCHAR *reg, uint32_t data);
588 virtual void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
589 virtual int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
591 _TCHAR this_device_name[128];