2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
10 #ifndef _LIBCPU_NEWDEV_DEVICE_H_
11 #define _LIBCPU_NEWDEV_DEVICE_H_
18 #include "csp_logger.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
58 DEVICE(VM* parent_vm, EMU* parent_emu);
59 //ToDo: Will implement real destructor per real classes and below destructor decl. with "virtual".
60 // This makes warning:
61 //"deleting object of polymorphic class type 'DEVICE' which has non-virtual
62 // destructor might cause undefined behavior [-Wdelete-non-virtual-dtor]".
66 virtual void initialize() {}
67 virtual void release() {}
69 virtual void update_config() {}
70 virtual void save_state(FILEIO* state_fio) {}
71 virtual bool load_state(FILEIO* state_fio)
77 virtual void reset() {}
78 virtual void special_reset()
83 // NOTE: the virtual bus interface functions for 16/32bit access invite the cpu is little endian.
84 // if the cpu is big endian, you need to implement them in the virtual machine memory/io classes.
87 virtual void write_data8(uint32_t addr, uint32_t data) {}
88 virtual uint32_t read_data8(uint32_t addr)
92 virtual void write_data16(uint32_t addr, uint32_t data)
94 write_data8(addr, data & 0xff);
95 write_data8(addr + 1, (data >> 8) & 0xff);
97 virtual uint32_t read_data16(uint32_t addr)
99 uint32_t val = read_data8(addr);
100 val |= read_data8(addr + 1) << 8;
103 virtual void write_data32(uint32_t addr, uint32_t data)
105 write_data16(addr, data & 0xffff);
106 write_data16(addr + 2, (data >> 16) & 0xffff);
108 virtual uint32_t read_data32(uint32_t addr)
110 uint32_t val = read_data16(addr);
111 val |= read_data16(addr + 2) << 16;
114 virtual void write_data8w(uint32_t addr, uint32_t data, int* wait)
117 write_data8(addr, data);
119 virtual uint32_t read_data8w(uint32_t addr, int* wait)
122 return read_data8(addr);
124 virtual void write_data16w(uint32_t addr, uint32_t data, int* wait)
127 write_data8w(addr, data & 0xff, &wait_l);
128 write_data8w(addr + 1, (data >> 8) & 0xff, &wait_h);
129 *wait = wait_l + wait_h;
131 virtual uint32_t read_data16w(uint32_t addr, int* wait)
134 uint32_t val = read_data8w(addr, &wait_l);
135 val |= read_data8w(addr + 1, &wait_h) << 8;
136 *wait = wait_l + wait_h;
139 virtual void write_data32w(uint32_t addr, uint32_t data, int* wait)
142 write_data16w(addr, data & 0xffff, &wait_l);
143 write_data16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
144 *wait = wait_l + wait_h;
146 virtual uint32_t read_data32w(uint32_t addr, int* wait)
149 uint32_t val = read_data16w(addr, &wait_l);
150 val |= read_data16w(addr + 2, &wait_h) << 16;
151 *wait = wait_l + wait_h;
154 virtual uint32_t fetch_op(uint32_t addr, int *wait)
156 return read_data8w(addr, wait);
158 virtual void write_dma_data8(uint32_t addr, uint32_t data)
160 write_data8(addr, data);
162 virtual uint32_t read_dma_data8(uint32_t addr)
164 return read_data8(addr);
166 virtual void write_dma_data16(uint32_t addr, uint32_t data)
168 write_data16(addr, data);
170 virtual uint32_t read_dma_data16(uint32_t addr)
172 return read_data16(addr);
174 virtual void write_dma_data32(uint32_t addr, uint32_t data)
176 write_data32(addr, data);
178 virtual uint32_t read_dma_data32(uint32_t addr)
180 return read_data32(addr);
182 virtual void write_dma_data8w(uint32_t addr, uint32_t data, int* wait)
184 write_data8w(addr, data, wait);
186 virtual uint32_t read_dma_data8w(uint32_t addr, int* wait)
188 return read_data8w(addr, wait);
190 virtual void write_dma_data16w(uint32_t addr, uint32_t data, int* wait)
192 write_data16w(addr, data, wait);
194 virtual uint32_t read_dma_data16w(uint32_t addr, int* wait)
196 return read_data16w(addr, wait);
198 virtual void write_dma_data32w(uint32_t addr, uint32_t data, int* wait)
200 write_data32w(addr, data, wait);
202 virtual uint32_t read_dma_data32w(uint32_t addr, int* wait)
204 return read_data32w(addr, wait);
208 virtual void write_io8(uint32_t addr, uint32_t data) {}
209 virtual uint32_t read_io8(uint32_t addr);
210 virtual void write_io16(uint32_t addr, uint32_t data)
212 write_io8(addr, data & 0xff);
213 write_io8(addr + 1, (data >> 8) & 0xff);
215 virtual uint32_t read_io16(uint32_t addr)
217 uint32_t val = read_io8(addr);
218 val |= read_io8(addr + 1) << 8;
221 virtual void write_io32(uint32_t addr, uint32_t data)
223 write_io16(addr, data & 0xffff);
224 write_io16(addr + 2, (data >> 16) & 0xffff);
226 virtual uint32_t read_io32(uint32_t addr)
228 uint32_t val = read_io16(addr);
229 val |= read_io16(addr + 2) << 16;
232 virtual void write_io8w(uint32_t addr, uint32_t data, int* wait)
235 write_io8(addr, data);
237 virtual uint32_t read_io8w(uint32_t addr, int* wait)
240 return read_io8(addr);
242 virtual void write_io16w(uint32_t addr, uint32_t data, int* wait)
245 write_io8w(addr, data & 0xff, &wait_l);
246 write_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
247 *wait = wait_l + wait_h;
249 virtual uint32_t read_io16w(uint32_t addr, int* wait)
252 uint32_t val = read_io8w(addr, &wait_l);
253 val |= read_io8w(addr + 1, &wait_h) << 8;
254 *wait = wait_l + wait_h;
257 virtual void write_io32w(uint32_t addr, uint32_t data, int* wait)
260 write_io16w(addr, data & 0xffff, &wait_l);
261 write_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
262 *wait = wait_l + wait_h;
264 virtual uint32_t read_io32w(uint32_t addr, int* wait)
267 uint32_t val = read_io16w(addr, &wait_l);
268 val |= read_io16w(addr + 2, &wait_h) << 16;
269 *wait = wait_l + wait_h;
272 virtual void write_dma_io8(uint32_t addr, uint32_t data)
274 write_io8(addr, data);
276 virtual uint32_t read_dma_io8(uint32_t addr)
278 return read_io8(addr);
280 virtual void write_dma_io16(uint32_t addr, uint32_t data)
282 write_io16(addr, data);
284 virtual uint32_t read_dma_io16(uint32_t addr)
286 return read_io16(addr);
288 virtual void write_dma_io32(uint32_t addr, uint32_t data)
290 write_io32(addr, data);
292 virtual uint32_t read_dma_io32(uint32_t addr)
294 return read_io32(addr);
296 virtual void write_dma_io8w(uint32_t addr, uint32_t data, int* wait)
298 write_io8w(addr, data, wait);
300 virtual uint32_t read_dma_io8w(uint32_t addr, int* wait)
302 return read_io8w(addr, wait);
304 virtual void write_dma_io16w(uint32_t addr, uint32_t data, int* wait)
306 write_io16w(addr, data, wait);
308 virtual uint32_t read_dma_io16w(uint32_t addr, int* wait)
310 return read_io16w(addr, wait);
312 virtual void write_dma_io32w(uint32_t addr, uint32_t data, int* wait)
314 write_io32w(addr, data, wait);
316 virtual uint32_t read_dma_io32w(uint32_t addr, int* wait)
318 return read_io32w(addr, wait);
322 virtual void write_memory_mapped_io8(uint32_t addr, uint32_t data)
324 write_io8(addr, data);
326 virtual uint32_t read_memory_mapped_io8(uint32_t addr)
328 return read_io8(addr);
330 virtual void write_memory_mapped_io16(uint32_t addr, uint32_t data)
332 write_memory_mapped_io8(addr, data & 0xff);
333 write_memory_mapped_io8(addr + 1, (data >> 8) & 0xff);
335 virtual uint32_t read_memory_mapped_io16(uint32_t addr)
337 uint32_t val = read_memory_mapped_io8(addr);
338 val |= read_memory_mapped_io8(addr + 1) << 8;
341 virtual void write_memory_mapped_io32(uint32_t addr, uint32_t data)
343 write_memory_mapped_io16(addr, data & 0xffff);
344 write_memory_mapped_io16(addr + 2, (data >> 16) & 0xffff);
346 virtual uint32_t read_memory_mapped_io32(uint32_t addr)
348 uint32_t val = read_memory_mapped_io16(addr);
349 val |= read_memory_mapped_io16(addr + 2) << 16;
352 virtual void write_memory_mapped_io8w(uint32_t addr, uint32_t data, int* wait)
355 write_memory_mapped_io8(addr, data);
357 virtual uint32_t read_memory_mapped_io8w(uint32_t addr, int* wait)
360 return read_memory_mapped_io8(addr);
362 virtual void write_memory_mapped_io16w(uint32_t addr, uint32_t data, int* wait)
365 write_memory_mapped_io8w(addr, data & 0xff, &wait_l);
366 write_memory_mapped_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
367 *wait = wait_l + wait_h;
369 virtual uint32_t read_memory_mapped_io16w(uint32_t addr, int* wait)
372 uint32_t val = read_memory_mapped_io8w(addr, &wait_l);
373 val |= read_memory_mapped_io8w(addr + 1, &wait_h) << 8;
374 *wait = wait_l + wait_h;
377 virtual void write_memory_mapped_io32w(uint32_t addr, uint32_t data, int* wait)
380 write_memory_mapped_io16w(addr, data & 0xffff, &wait_l);
381 write_memory_mapped_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
382 *wait = wait_l + wait_h;
384 virtual uint32_t read_memory_mapped_io32w(uint32_t addr, int* wait)
387 uint32_t val = read_memory_mapped_io16w(addr, &wait_l);
388 val |= read_memory_mapped_io16w(addr + 2, &wait_h) << 16;
389 *wait = wait_l + wait_h;
403 output_t item[MAX_OUTPUT];
406 virtual void initialize_output_signals(outputs_t *items)
410 virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask, int shift)
412 int c = items->count++;
413 items->item[c].device = device;
414 items->item[c].id = id;
415 items->item[c].mask = mask;
416 items->item[c].shift = shift;
418 virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask)
420 int c = items->count++;
421 items->item[c].device = device;
422 items->item[c].id = id;
423 items->item[c].mask = mask;
424 items->item[c].shift = 0;
426 virtual void write_signals(outputs_t *items, uint32_t data)
428 for(int i = 0; i < items->count; i++) {
429 output_t *item = &items->item[i];
430 int shift = item->shift;
431 uint32_t val = (shift < 0) ? (data >> (-shift)) : (data << shift);
432 uint32_t mask = (shift < 0) ? (item->mask >> (-shift)) : (item->mask << shift);
433 item->device->write_signal(item->id, val, mask);
436 virtual void write_signal(int id, uint32_t data, uint32_t mask) {}
437 virtual uint32_t read_signal(int ch)
443 virtual void set_context_intr(DEVICE* device, uint32_t bit) {}
444 virtual void set_context_child(DEVICE* device) {}
446 // interrupt device to device
447 virtual void set_intr_iei(bool val) {}
449 // interrupt device to cpu
450 virtual void set_intr_line(bool line, bool pending, uint32_t bit) {}
452 // interrupt cpu to device
453 virtual uint32_t get_intr_ack()
457 virtual void notify_intr_reti() {}
458 virtual void notify_intr_ei() {}
461 virtual void do_dma() {}
464 virtual int run(int clock)
466 // when clock == -1, run one opecode
467 return (clock == -1 ? 1 : clock);
469 virtual void set_extra_clock(int clock) {}
470 virtual int get_extra_clock()
474 virtual uint32_t get_pc()
478 virtual uint32_t get_next_pc()
484 virtual bool bios_call_i86(uint32_t PC, uint16_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag)
488 virtual bool bios_int_i86(int intnum, uint16_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag)
492 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) {
496 const _TCHAR *get_device_name(void)
498 return (const _TCHAR *)this_device_name;
502 DEVICE* event_manager;
504 virtual void set_context_event_manager(DEVICE* device)
506 event_manager = device;
508 virtual int get_event_manager_id();
509 virtual void register_event(DEVICE* device, int event_id, double usec, bool loop, int* register_id);
510 virtual void register_event_by_clock(DEVICE* device, int event_id, uint64_t clock, bool loop, int* register_id);
511 virtual void cancel_event(DEVICE* device, int register_id);
512 virtual void register_frame_event(DEVICE* device);
513 virtual void register_vline_event(DEVICE* device);
514 virtual uint32_t get_event_remaining_clock(int register_id);
515 virtual double get_event_remaining_usec(int register_id);
516 virtual uint32_t get_current_clock();
517 virtual uint32_t get_passed_clock(uint32_t prev);
518 virtual double get_passed_usec(uint32_t prev);
519 virtual uint32_t get_cpu_pc(int index);
520 virtual void request_skip_frames();
521 virtual void set_frames_per_sec(double frames);
522 virtual void set_lines_per_frame(int lines);
523 // Force render sound immediately when device's status has changed.
524 // You must call this after you changing registers (or enything).
525 // If has problems, try set_realtime_render.
526 // See mb8877.cpp and ym2203.cpp.
528 virtual void touch_sound(void);
529 // Force render per 1 sample automatically.
532 virtual void set_realtime_render(bool flag);
533 virtual void update_timing(int new_clocks, double new_frames_per_sec, int new_lines_per_frame) {}
536 virtual void event_callback(int event_id, int err) {}
537 virtual void event_pre_frame() {} // this event is to update timing settings
538 virtual void event_frame() {}
539 virtual void event_vline(int v, int clock) {}
540 virtual void event_hsync(int v, int h, int clock) {}
543 virtual void mix(int32_t* buffer, int cnt) {}
544 virtual void set_volume(int ch, int decibel_l, int decibel_r) {} // +1 equals +0.5dB (same as fmgen)
546 virtual void set_device_name(const _TCHAR *name);
547 virtual void out_debug_log(const char *fmt, ...);
550 // DEBUGGER is enabled by default.
551 virtual void *get_debugger();
552 virtual uint32_t get_debug_prog_addr_mask();
553 virtual uint32_t get_debug_data_addr_mask();
554 virtual void write_debug_data8(uint32_t addr, uint32_t data);
555 virtual uint32_t read_debug_data8(uint32_t addr);
556 virtual void write_debug_data16(uint32_t addr, uint32_t data);
557 virtual uint32_t read_debug_data16(uint32_t addr);
558 virtual void write_debug_data32(uint32_t addr, uint32_t data);
559 virtual uint32_t read_debug_data32(uint32_t addr);
560 virtual void write_debug_io8(uint32_t addr, uint32_t data);
561 virtual uint32_t read_debug_io8(uint32_t addr);
562 virtual void write_debug_io16(uint32_t addr, uint32_t data);
563 virtual uint32_t read_debug_io16(uint32_t addr);
564 virtual void write_debug_io32(uint32_t addr, uint32_t data);
565 virtual uint32_t read_debug_io32(uint32_t addr);
566 virtual bool write_debug_reg(const _TCHAR *reg, uint32_t data);
567 virtual void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
568 virtual int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
570 _TCHAR this_device_name[128];