2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
14 #include "../fileio.h"
17 #include "csp_logger.h"
18 #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
57 DEVICE(VM* parent_vm, EMU* parent_emu);
58 //ToDo: Will implement real destructor per real classes and below destructor decl. with "virtual".
59 // This makes warning:
60 //"deleting object of polymorphic class type 'DEVICE' which has non-virtual
61 // destructor might cause undefined behavior [-Wdelete-non-virtual-dtor]".
64 virtual void initialize() {}
65 virtual void release() {}
67 virtual void update_config() {}
68 virtual void save_state(FILEIO* state_fio) {}
69 virtual bool load_state(FILEIO* state_fio)
75 virtual void reset() {}
76 virtual void special_reset()
81 // NOTE: the virtual bus interface functions for 16/32bit access invite the cpu is little endian.
82 // if the cpu is big endian, you need to implement them in the virtual machine memory/io classes.
85 virtual void write_data8(uint32_t addr, uint32_t data) {}
86 virtual uint32_t read_data8(uint32_t addr)
90 virtual void write_data16(uint32_t addr, uint32_t data)
92 write_data8(addr, data & 0xff);
93 write_data8(addr + 1, (data >> 8) & 0xff);
95 virtual uint32_t read_data16(uint32_t addr)
97 uint32_t val = read_data8(addr);
98 val |= read_data8(addr + 1) << 8;
101 virtual void write_data32(uint32_t addr, uint32_t data)
103 write_data16(addr, data & 0xffff);
104 write_data16(addr + 2, (data >> 16) & 0xffff);
106 virtual uint32_t read_data32(uint32_t addr)
108 uint32_t val = read_data16(addr);
109 val |= read_data16(addr + 2) << 16;
112 virtual void write_data8w(uint32_t addr, uint32_t data, int* wait)
115 write_data8(addr, data);
117 virtual uint32_t read_data8w(uint32_t addr, int* wait)
120 return read_data8(addr);
122 virtual void write_data16w(uint32_t addr, uint32_t data, int* wait)
125 write_data8w(addr, data & 0xff, &wait_l);
126 write_data8w(addr + 1, (data >> 8) & 0xff, &wait_h);
127 *wait = wait_l + wait_h;
129 virtual uint32_t read_data16w(uint32_t addr, int* wait)
132 uint32_t val = read_data8w(addr, &wait_l);
133 val |= read_data8w(addr + 1, &wait_h) << 8;
134 *wait = wait_l + wait_h;
137 virtual void write_data32w(uint32_t addr, uint32_t data, int* wait)
140 write_data16w(addr, data & 0xffff, &wait_l);
141 write_data16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
142 *wait = wait_l + wait_h;
144 virtual uint32_t read_data32w(uint32_t addr, int* wait)
147 uint32_t val = read_data16w(addr, &wait_l);
148 val |= read_data16w(addr + 2, &wait_h) << 16;
149 *wait = wait_l + wait_h;
152 virtual uint32_t fetch_op(uint32_t addr, int *wait)
154 return read_data8w(addr, wait);
156 virtual void write_dma_data8(uint32_t addr, uint32_t data)
158 write_data8(addr, data);
160 virtual uint32_t read_dma_data8(uint32_t addr)
162 return read_data8(addr);
164 virtual void write_dma_data16(uint32_t addr, uint32_t data)
166 write_data16(addr, data);
168 virtual uint32_t read_dma_data16(uint32_t addr)
170 return read_data16(addr);
172 virtual void write_dma_data32(uint32_t addr, uint32_t data)
174 write_data32(addr, data);
176 virtual uint32_t read_dma_data32(uint32_t addr)
178 return read_data32(addr);
180 virtual void write_dma_data8w(uint32_t addr, uint32_t data, int* wait)
182 write_data8w(addr, data, wait);
184 virtual uint32_t read_dma_data8w(uint32_t addr, int* wait)
186 return read_data8w(addr, wait);
188 virtual void write_dma_data16w(uint32_t addr, uint32_t data, int* wait)
190 write_data16w(addr, data, wait);
192 virtual uint32_t read_dma_data16w(uint32_t addr, int* wait)
194 return read_data16w(addr, wait);
196 virtual void write_dma_data32w(uint32_t addr, uint32_t data, int* wait)
198 write_data32w(addr, data, wait);
200 virtual uint32_t read_dma_data32w(uint32_t addr, int* wait)
202 return read_data32w(addr, wait);
206 virtual void write_io8(uint32_t addr, uint32_t data) {}
207 virtual uint32_t read_io8(uint32_t addr);
208 virtual void write_io16(uint32_t addr, uint32_t data)
210 write_io8(addr, data & 0xff);
211 write_io8(addr + 1, (data >> 8) & 0xff);
213 virtual uint32_t read_io16(uint32_t addr)
215 uint32_t val = read_io8(addr);
216 val |= read_io8(addr + 1) << 8;
219 virtual void write_io32(uint32_t addr, uint32_t data)
221 write_io16(addr, data & 0xffff);
222 write_io16(addr + 2, (data >> 16) & 0xffff);
224 virtual uint32_t read_io32(uint32_t addr)
226 uint32_t val = read_io16(addr);
227 val |= read_io16(addr + 2) << 16;
230 virtual void write_io8w(uint32_t addr, uint32_t data, int* wait)
233 write_io8(addr, data);
235 virtual uint32_t read_io8w(uint32_t addr, int* wait)
238 return read_io8(addr);
240 virtual void write_io16w(uint32_t addr, uint32_t data, int* wait)
243 write_io8w(addr, data & 0xff, &wait_l);
244 write_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
245 *wait = wait_l + wait_h;
247 virtual uint32_t read_io16w(uint32_t addr, int* wait)
250 uint32_t val = read_io8w(addr, &wait_l);
251 val |= read_io8w(addr + 1, &wait_h) << 8;
252 *wait = wait_l + wait_h;
255 virtual void write_io32w(uint32_t addr, uint32_t data, int* wait)
258 write_io16w(addr, data & 0xffff, &wait_l);
259 write_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
260 *wait = wait_l + wait_h;
262 virtual uint32_t read_io32w(uint32_t addr, int* wait)
265 uint32_t val = read_io16w(addr, &wait_l);
266 val |= read_io16w(addr + 2, &wait_h) << 16;
267 *wait = wait_l + wait_h;
270 virtual void write_dma_io8(uint32_t addr, uint32_t data)
272 write_io8(addr, data);
274 virtual uint32_t read_dma_io8(uint32_t addr)
276 return read_io8(addr);
278 virtual void write_dma_io16(uint32_t addr, uint32_t data)
280 write_io16(addr, data);
282 virtual uint32_t read_dma_io16(uint32_t addr)
284 return read_io16(addr);
286 virtual void write_dma_io32(uint32_t addr, uint32_t data)
288 write_io32(addr, data);
290 virtual uint32_t read_dma_io32(uint32_t addr)
292 return read_io32(addr);
294 virtual void write_dma_io8w(uint32_t addr, uint32_t data, int* wait)
296 write_io8w(addr, data, wait);
298 virtual uint32_t read_dma_io8w(uint32_t addr, int* wait)
300 return read_io8w(addr, wait);
302 virtual void write_dma_io16w(uint32_t addr, uint32_t data, int* wait)
304 write_io16w(addr, data, wait);
306 virtual uint32_t read_dma_io16w(uint32_t addr, int* wait)
308 return read_io16w(addr, wait);
310 virtual void write_dma_io32w(uint32_t addr, uint32_t data, int* wait)
312 write_io32w(addr, data, wait);
314 virtual uint32_t read_dma_io32w(uint32_t addr, int* wait)
316 return read_io32w(addr, wait);
320 virtual void write_memory_mapped_io8(uint32_t addr, uint32_t data)
322 write_io8(addr, data);
324 virtual uint32_t read_memory_mapped_io8(uint32_t addr)
326 return read_io8(addr);
328 virtual void write_memory_mapped_io16(uint32_t addr, uint32_t data)
330 write_memory_mapped_io8(addr, data & 0xff);
331 write_memory_mapped_io8(addr + 1, (data >> 8) & 0xff);
333 virtual uint32_t read_memory_mapped_io16(uint32_t addr)
335 uint32_t val = read_memory_mapped_io8(addr);
336 val |= read_memory_mapped_io8(addr + 1) << 8;
339 virtual void write_memory_mapped_io32(uint32_t addr, uint32_t data)
341 write_memory_mapped_io16(addr, data & 0xffff);
342 write_memory_mapped_io16(addr + 2, (data >> 16) & 0xffff);
344 virtual uint32_t read_memory_mapped_io32(uint32_t addr)
346 uint32_t val = read_memory_mapped_io16(addr);
347 val |= read_memory_mapped_io16(addr + 2) << 16;
350 virtual void write_memory_mapped_io8w(uint32_t addr, uint32_t data, int* wait)
353 write_memory_mapped_io8(addr, data);
355 virtual uint32_t read_memory_mapped_io8w(uint32_t addr, int* wait)
358 return read_memory_mapped_io8(addr);
360 virtual void write_memory_mapped_io16w(uint32_t addr, uint32_t data, int* wait)
363 write_memory_mapped_io8w(addr, data & 0xff, &wait_l);
364 write_memory_mapped_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
365 *wait = wait_l + wait_h;
367 virtual uint32_t read_memory_mapped_io16w(uint32_t addr, int* wait)
370 uint32_t val = read_memory_mapped_io8w(addr, &wait_l);
371 val |= read_memory_mapped_io8w(addr + 1, &wait_h) << 8;
372 *wait = wait_l + wait_h;
375 virtual void write_memory_mapped_io32w(uint32_t addr, uint32_t data, int* wait)
378 write_memory_mapped_io16w(addr, data & 0xffff, &wait_l);
379 write_memory_mapped_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
380 *wait = wait_l + wait_h;
382 virtual uint32_t read_memory_mapped_io32w(uint32_t addr, int* wait)
385 uint32_t val = read_memory_mapped_io16w(addr, &wait_l);
386 val |= read_memory_mapped_io16w(addr + 2, &wait_h) << 16;
387 *wait = wait_l + wait_h;
401 output_t item[MAX_OUTPUT];
404 virtual void initialize_output_signals(outputs_t *items)
408 virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask, int shift)
410 int c = items->count++;
411 items->item[c].device = device;
412 items->item[c].id = id;
413 items->item[c].mask = mask;
414 items->item[c].shift = shift;
416 virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask)
418 int c = items->count++;
419 items->item[c].device = device;
420 items->item[c].id = id;
421 items->item[c].mask = mask;
422 items->item[c].shift = 0;
424 virtual void write_signals(outputs_t *items, uint32_t data)
426 for(int i = 0; i < items->count; i++) {
427 output_t *item = &items->item[i];
428 int shift = item->shift;
429 uint32_t val = (shift < 0) ? (data >> (-shift)) : (data << shift);
430 uint32_t mask = (shift < 0) ? (item->mask >> (-shift)) : (item->mask << shift);
431 item->device->write_signal(item->id, val, mask);
434 virtual void write_signal(int id, uint32_t data, uint32_t mask) {}
435 virtual uint32_t read_signal(int ch)
441 virtual void set_context_intr(DEVICE* device, uint32_t bit) {}
442 virtual void set_context_child(DEVICE* device) {}
444 // interrupt device to device
445 virtual void set_intr_iei(bool val) {}
447 // interrupt device to cpu
448 virtual void set_intr_line(bool line, bool pending, uint32_t bit) {}
450 // interrupt cpu to device
451 virtual uint32_t get_intr_ack()
455 virtual void notify_intr_reti() {}
456 virtual void notify_intr_ei() {}
459 virtual void do_dma() {}
462 virtual int run(int clock)
464 // when clock == -1, run one opecode
465 return (clock == -1 ? 1 : clock);
467 virtual void set_extra_clock(int clock) {}
468 virtual int get_extra_clock()
472 virtual uint32_t get_pc()
476 virtual uint32_t get_next_pc()
482 virtual bool bios_call_i86(uint32_t PC, uint16_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag)
486 virtual bool bios_int_i86(int intnum, uint16_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag)
490 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) {
494 const _TCHAR *get_device_name(void)
496 return (const _TCHAR *)this_device_name;
500 DEVICE* event_manager;
502 virtual void set_context_event_manager(DEVICE* device)
504 event_manager = device;
506 virtual int get_event_manager_id();
507 virtual void register_event(DEVICE* device, int event_id, double usec, bool loop, int* register_id);
508 virtual void register_event_by_clock(DEVICE* device, int event_id, uint64_t clock, bool loop, int* register_id);
509 virtual void cancel_event(DEVICE* device, int register_id);
510 virtual void register_frame_event(DEVICE* device);
511 virtual void register_vline_event(DEVICE* device);
512 virtual uint32_t get_event_remaining_clock(int register_id);
513 virtual double get_event_remaining_usec(int register_id);
514 virtual uint32_t get_current_clock();
515 virtual uint32_t get_passed_clock(uint32_t prev);
516 virtual double get_passed_usec(uint32_t prev);
517 virtual uint32_t get_cpu_pc(int index);
518 virtual void request_skip_frames();
519 virtual void set_frames_per_sec(double frames);
520 virtual void set_lines_per_frame(int lines);
521 // Force render sound immediately when device's status has changed.
522 // You must call this after you changing registers (or enything).
523 // If has problems, try set_realtime_render.
524 // See mb8877.cpp and ym2203.cpp.
526 virtual void touch_sound(void);
527 // Force render per 1 sample automatically.
530 virtual void set_realtime_render(bool flag);
531 virtual void update_timing(int new_clocks, double new_frames_per_sec, int new_lines_per_frame) {}
534 virtual void event_callback(int event_id, int err) {}
535 virtual void event_pre_frame() {} // this event is to update timing settings
536 virtual void event_frame() {}
537 virtual void event_vline(int v, int clock) {}
538 virtual void event_hsync(int v, int h, int clock) {}
541 virtual void mix(int32_t* buffer, int cnt) {}
542 virtual void set_volume(int ch, int decibel_l, int decibel_r) {} // +1 equals +0.5dB (same as fmgen)
544 virtual void set_device_name(const _TCHAR *name);
545 virtual void out_debug_log(const char *fmt, ...);
548 virtual void *get_debugger();
549 virtual uint32_t get_debug_prog_addr_mask();
550 virtual uint32_t get_debug_data_addr_mask();
551 virtual void write_debug_data8(uint32_t addr, uint32_t data);
552 virtual uint32_t read_debug_data8(uint32_t addr);
553 virtual void write_debug_data16(uint32_t addr, uint32_t data);
554 virtual uint32_t read_debug_data16(uint32_t addr);
555 virtual void write_debug_data32(uint32_t addr, uint32_t data);
556 virtual uint32_t read_debug_data32(uint32_t addr);
557 virtual void write_debug_io8(uint32_t addr, uint32_t data);
558 virtual uint32_t read_debug_io8(uint32_t addr);
559 virtual void write_debug_io16(uint32_t addr, uint32_t data);
560 virtual uint32_t read_debug_io16(uint32_t addr);
561 virtual void write_debug_io32(uint32_t addr, uint32_t data);
562 virtual uint32_t read_debug_io32(uint32_t addr);
563 virtual bool write_debug_reg(const _TCHAR *reg, uint32_t data);
564 virtual void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
565 virtual int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
567 _TCHAR this_device_name[128];