2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
16 // max devices connected to the output port
20 #define SIG_CPU_IRQ 101
21 #define SIG_CPU_FIRQ 102
22 #define SIG_CPU_NMI 103
23 #define SIG_CPU_BUSREQ 104
24 #define SIG_CPU_DEBUG 201
32 DEVICE(VM* parent_vm, EMU* parent_emu) : vm(parent_vm), emu(parent_emu)
34 prev_device = vm->last_device;
36 if(vm->first_device == NULL) {
37 // this is the first device
38 vm->first_device = this;
41 // this is not the first device
42 vm->last_device->next_device = this;
43 this_device_id = vm->last_device->this_device_id + 1;
45 vm->last_device = this;
47 // primary event manager
52 virtual void initialize() {}
53 virtual void release() {}
55 virtual void update_config() {}
56 virtual void save_state(FILEIO* state_fio) {}
57 virtual bool load_state(FILEIO* state_fio)
63 virtual void reset() {}
64 virtual void special_reset()
69 // NOTE: the virtual bus interface functions for 16/32bit access invite the cpu is little endian.
70 // if the cpu is big endian, you need to implement them in the virtual machine memory/io classes.
73 virtual void write_data8(uint32 addr, uint32 data) {}
74 virtual uint32 read_data8(uint32 addr)
78 virtual void write_data16(uint32 addr, uint32 data)
80 write_data8(addr, data & 0xff);
81 write_data8(addr + 1, (data >> 8) & 0xff);
83 virtual uint32 read_data16(uint32 addr)
85 uint32 val = read_data8(addr);
86 val |= read_data8(addr + 1) << 8;
89 virtual void write_data32(uint32 addr, uint32 data)
91 write_data16(addr, data & 0xffff);
92 write_data16(addr + 2, (data >> 16) & 0xffff);
94 virtual uint32 read_data32(uint32 addr)
96 uint32 val = read_data16(addr);
97 val |= read_data16(addr + 2) << 16;
100 virtual void write_data8w(uint32 addr, uint32 data, int* wait)
103 write_data8(addr, data);
105 virtual uint32 read_data8w(uint32 addr, int* wait)
108 return read_data8(addr);
110 virtual void write_data16w(uint32 addr, uint32 data, int* wait)
113 write_data8w(addr, data & 0xff, &wait_l);
114 write_data8w(addr + 1, (data >> 8) & 0xff, &wait_h);
115 *wait = wait_l + wait_h;
117 virtual uint32 read_data16w(uint32 addr, int* wait)
120 uint32 val = read_data8w(addr, &wait_l);
121 val |= read_data8w(addr + 1, &wait_h) << 8;
122 *wait = wait_l + wait_h;
125 virtual void write_data32w(uint32 addr, uint32 data, int* wait)
128 write_data16w(addr, data & 0xffff, &wait_l);
129 write_data16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
130 *wait = wait_l + wait_h;
132 virtual uint32 read_data32w(uint32 addr, int* wait)
135 uint32 val = read_data16w(addr, &wait_l);
136 val |= read_data16w(addr + 2, &wait_h) << 16;
137 *wait = wait_l + wait_h;
140 virtual uint32 fetch_op(uint32 addr, int *wait)
142 return read_data8w(addr, wait);
144 virtual void write_dma_data8(uint32 addr, uint32 data)
146 write_data8(addr, data);
148 virtual uint32 read_dma_data8(uint32 addr)
150 return read_data8(addr);
152 virtual void write_dma_data16(uint32 addr, uint32 data)
154 write_data16(addr, data);
156 virtual uint32 read_dma_data16(uint32 addr)
158 return read_data16(addr);
160 virtual void write_dma_data32(uint32 addr, uint32 data)
162 write_data32(addr, data);
164 virtual uint32 read_dma_data32(uint32 addr)
166 return read_data32(addr);
168 virtual void write_dma_data8w(uint32 addr, uint32 data, int* wait)
170 write_data8w(addr, data, wait);
172 virtual uint32 read_dma_data8w(uint32 addr, int* wait)
174 return read_data8w(addr, wait);
176 virtual void write_dma_data16w(uint32 addr, uint32 data, int* wait)
178 write_data16w(addr, data, wait);
180 virtual uint32 read_dma_data16w(uint32 addr, int* wait)
182 return read_data16w(addr, wait);
184 virtual void write_dma_data32w(uint32 addr, uint32 data, int* wait)
186 write_data32w(addr, data, wait);
188 virtual uint32 read_dma_data32w(uint32 addr, int* wait)
190 return read_data32w(addr, wait);
194 virtual void write_io8(uint32 addr, uint32 data) {}
195 virtual uint32 read_io8(uint32 addr)
197 #ifdef IOBUS_RETURN_ADDR
198 return (addr & 1 ? addr >> 8 : addr) & 0xff;
203 virtual void write_io16(uint32 addr, uint32 data)
205 write_io8(addr, data & 0xff);
206 write_io8(addr + 1, (data >> 8) & 0xff);
208 virtual uint32 read_io16(uint32 addr)
210 uint32 val = read_io8(addr);
211 val |= read_io8(addr + 1) << 8;
214 virtual void write_io32(uint32 addr, uint32 data)
216 write_io16(addr, data & 0xffff);
217 write_io16(addr + 2, (data >> 16) & 0xffff);
219 virtual uint32 read_io32(uint32 addr)
221 uint32 val = read_io16(addr);
222 val |= read_io16(addr + 2) << 16;
225 virtual void write_io8w(uint32 addr, uint32 data, int* wait)
228 write_io8(addr, data);
230 virtual uint32 read_io8w(uint32 addr, int* wait)
233 return read_io8(addr);
235 virtual void write_io16w(uint32 addr, uint32 data, int* wait)
238 write_io8w(addr, data & 0xff, &wait_l);
239 write_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
240 *wait = wait_l + wait_h;
242 virtual uint32 read_io16w(uint32 addr, int* wait)
245 uint32 val = read_io8w(addr, &wait_l);
246 val |= read_io8w(addr + 1, &wait_h) << 8;
247 *wait = wait_l + wait_h;
250 virtual void write_io32w(uint32 addr, uint32 data, int* wait)
253 write_io16w(addr, data & 0xffff, &wait_l);
254 write_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
255 *wait = wait_l + wait_h;
257 virtual uint32 read_io32w(uint32 addr, int* wait)
260 uint32 val = read_io16w(addr, &wait_l);
261 val |= read_io16w(addr + 2, &wait_h) << 16;
262 *wait = wait_l + wait_h;
265 virtual void write_dma_io8(uint32 addr, uint32 data)
267 write_io8(addr, data);
269 virtual uint32 read_dma_io8(uint32 addr)
271 return read_io8(addr);
273 virtual void write_dma_io16(uint32 addr, uint32 data)
275 write_io16(addr, data);
277 virtual uint32 read_dma_io16(uint32 addr)
279 return read_io16(addr);
281 virtual void write_dma_io32(uint32 addr, uint32 data)
283 write_io32(addr, data);
285 virtual uint32 read_dma_io32(uint32 addr)
287 return read_io32(addr);
289 virtual void write_dma_io8w(uint32 addr, uint32 data, int* wait)
291 write_io8w(addr, data, wait);
293 virtual uint32 read_dma_io8w(uint32 addr, int* wait)
295 return read_io8w(addr, wait);
297 virtual void write_dma_io16w(uint32 addr, uint32 data, int* wait)
299 write_io16w(addr, data, wait);
301 virtual uint32 read_dma_io16w(uint32 addr, int* wait)
303 return read_io16w(addr, wait);
305 virtual void write_dma_io32w(uint32 addr, uint32 data, int* wait)
307 write_io32w(addr, data, wait);
309 virtual uint32 read_dma_io32w(uint32 addr, int* wait)
311 return read_io32w(addr, wait);
315 virtual void write_memory_mapped_io8(uint32 addr, uint32 data)
317 write_io8(addr, data);
319 virtual uint32 read_memory_mapped_io8(uint32 addr)
321 return read_io8(addr);
323 virtual void write_memory_mapped_io16(uint32 addr, uint32 data)
325 write_memory_mapped_io8(addr, data & 0xff);
326 write_memory_mapped_io8(addr + 1, (data >> 8) & 0xff);
328 virtual uint32 read_memory_mapped_io16(uint32 addr)
330 uint32 val = read_memory_mapped_io8(addr);
331 val |= read_memory_mapped_io8(addr + 1) << 8;
334 virtual void write_memory_mapped_io32(uint32 addr, uint32 data)
336 write_memory_mapped_io16(addr, data & 0xffff);
337 write_memory_mapped_io16(addr + 2, (data >> 16) & 0xffff);
339 virtual uint32 read_memory_mapped_io32(uint32 addr)
341 uint32 val = read_memory_mapped_io16(addr);
342 val |= read_memory_mapped_io16(addr + 2) << 16;
345 virtual void write_memory_mapped_io8w(uint32 addr, uint32 data, int* wait)
348 write_memory_mapped_io8(addr, data);
350 virtual uint32 read_memory_mapped_io8w(uint32 addr, int* wait)
353 return read_memory_mapped_io8(addr);
355 virtual void write_memory_mapped_io16w(uint32 addr, uint32 data, int* wait)
358 write_memory_mapped_io8w(addr, data & 0xff, &wait_l);
359 write_memory_mapped_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
360 *wait = wait_l + wait_h;
362 virtual uint32 read_memory_mapped_io16w(uint32 addr, int* wait)
365 uint32 val = read_memory_mapped_io8w(addr, &wait_l);
366 val |= read_memory_mapped_io8w(addr + 1, &wait_h) << 8;
367 *wait = wait_l + wait_h;
370 virtual void write_memory_mapped_io32w(uint32 addr, uint32 data, int* wait)
373 write_memory_mapped_io16w(addr, data & 0xffff, &wait_l);
374 write_memory_mapped_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
375 *wait = wait_l + wait_h;
377 virtual uint32 read_memory_mapped_io32w(uint32 addr, int* wait)
380 uint32 val = read_memory_mapped_io16w(addr, &wait_l);
381 val |= read_memory_mapped_io16w(addr + 2, &wait_h) << 16;
382 *wait = wait_l + wait_h;
396 output_t item[MAX_OUTPUT];
399 virtual void init_output_signals(outputs_t *items)
403 virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32 mask, int shift)
405 int c = items->count++;
406 items->item[c].device = device;
407 items->item[c].id = id;
408 items->item[c].mask = mask;
409 items->item[c].shift = shift;
411 virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32 mask)
413 int c = items->count++;
414 items->item[c].device = device;
415 items->item[c].id = id;
416 items->item[c].mask = mask;
417 items->item[c].shift = 0;
419 virtual void write_signals(outputs_t *items, uint32 data)
421 for(int i = 0; i < items->count; i++) {
422 output_t *item = &items->item[i];
423 int shift = item->shift;
424 uint32 val = (shift < 0) ? (data >> (-shift)) : (data << shift);
425 uint32 mask = (shift < 0) ? (item->mask >> (-shift)) : (item->mask << shift);
426 item->device->write_signal(item->id, val, mask);
429 virtual void write_signal(int id, uint32 data, uint32 mask) {}
430 virtual uint32 read_signal(int ch)
436 virtual void set_context_intr(DEVICE* device, uint32 bit) {}
437 virtual void set_context_child(DEVICE* device) {}
439 // interrupt device to device
440 virtual void set_intr_iei(bool val) {}
442 // interrupt device to cpu
443 virtual void set_intr_line(bool line, bool pending, uint32 bit) {}
445 // interrupt cpu to device
446 virtual uint32 intr_ack()
450 virtual void intr_reti() {}
451 virtual void intr_ei() {}
454 virtual void do_dma() {}
457 virtual int run(int clock)
459 // when clock == -1, run one opecode
460 return (clock == -1 ? 1 : clock);
462 virtual void set_extra_clock(int clock) {}
463 virtual int get_extra_clock()
467 virtual uint32 get_pc()
471 virtual uint32 get_next_pc()
477 virtual bool bios_call_i86(uint32 PC, uint16 regs[], uint16 sregs[], int32* ZeroFlag, int32* CarryFlag)
481 virtual bool bios_int_i86(int intnum, uint16 regs[], uint16 sregs[], int32* ZeroFlag, int32* CarryFlag)
485 virtual bool bios_ret_z80(uint16 PC, pair* af, pair* bc, pair* de, pair* hl, pair* ix, pair* iy, uint8* iff1)
491 DEVICE* event_manager;
493 virtual void set_context_event_manager(DEVICE* device)
495 event_manager = device;
497 virtual int event_manager_id()
499 if(event_manager == NULL) {
500 event_manager = vm->first_device->next_device;
502 return event_manager->this_device_id;
504 virtual void register_event(DEVICE* device, int event_id, double usec, bool loop, int* register_id)
506 if(event_manager == NULL) {
507 event_manager = vm->first_device->next_device;
509 event_manager->register_event(device, event_id, usec, loop, register_id);
511 virtual void register_event_by_clock(DEVICE* device, int event_id, uint64 clock, bool loop, int* register_id)
513 if(event_manager == NULL) {
514 event_manager = vm->first_device->next_device;
516 event_manager->register_event_by_clock(device, event_id, clock, loop, register_id);
518 virtual void cancel_event(DEVICE* device, int register_id)
520 if(event_manager == NULL) {
521 event_manager = vm->first_device->next_device;
523 event_manager->cancel_event(device, register_id);
525 virtual void register_frame_event(DEVICE* device)
527 if(event_manager == NULL) {
528 event_manager = vm->first_device->next_device;
530 event_manager->register_frame_event(device);
532 virtual void register_vline_event(DEVICE* device)
534 if(event_manager == NULL) {
535 event_manager = vm->first_device->next_device;
537 event_manager->register_vline_event(device);
539 virtual uint32 current_clock()
541 if(event_manager == NULL) {
542 event_manager = vm->first_device->next_device;
544 return event_manager->current_clock();
546 virtual uint32 passed_clock(uint32 prev)
548 if(event_manager == NULL) {
549 event_manager = vm->first_device->next_device;
551 return event_manager->passed_clock(prev);
553 virtual double passed_usec(uint32 prev)
555 if(event_manager == NULL) {
556 event_manager = vm->first_device->next_device;
558 return event_manager->passed_usec(prev);
560 virtual uint32 get_cpu_pc(int index)
562 if(event_manager == NULL) {
563 event_manager = vm->first_device->next_device;
565 return event_manager->get_cpu_pc(index);
567 virtual void request_skip_frames()
569 if(event_manager == NULL) {
570 event_manager = vm->first_device->next_device;
572 event_manager->request_skip_frames();
574 virtual void set_frames_per_sec(double frames)
576 if(event_manager == NULL) {
577 event_manager = vm->first_device->next_device;
579 event_manager->set_frames_per_sec(frames);
581 virtual void set_lines_per_frame(int lines)
583 if(event_manager == NULL) {
584 event_manager = vm->first_device->next_device;
586 event_manager->set_lines_per_frame(lines);
588 virtual void update_timing(int new_clocks, double new_frames_per_sec, int new_lines_per_frame) {}
591 virtual void event_callback(int event_id, int err) {}
592 virtual void event_pre_frame() {} // this event is to update timing settings
593 virtual void event_frame() {}
594 virtual void event_vline(int v, int clock) {}
595 virtual void event_hsync(int v, int h, int clock) {}
598 virtual void mix(int32* buffer, int cnt) {}
602 virtual void *get_debugger()
606 virtual uint32 debug_prog_addr_mask()
610 virtual uint32 debug_data_addr_mask()
614 virtual void debug_write_data8(uint32 addr, uint32 data) {}
615 virtual uint32 debug_read_data8(uint32 addr)
619 virtual void debug_write_data16(uint32 addr, uint32 data)
621 debug_write_data8(addr, data & 0xff);
622 debug_write_data8(addr + 1, (data >> 8) & 0xff);
624 virtual uint32 debug_read_data16(uint32 addr)
626 uint32 val = debug_read_data8(addr);
627 val |= debug_read_data8(addr + 1) << 8;
630 virtual void debug_write_data32(uint32 addr, uint32 data)
632 debug_write_data16(addr, data & 0xffff);
633 debug_write_data16(addr + 2, (data >> 16) & 0xffff);
635 virtual uint32 debug_read_data32(uint32 addr)
637 uint32 val = debug_read_data16(addr);
638 val |= debug_read_data16(addr + 2) << 16;
641 virtual void debug_write_io8(uint32 addr, uint32 data) {}
642 virtual uint32 debug_read_io8(uint32 addr)
646 virtual void debug_write_io16(uint32 addr, uint32 data)
648 debug_write_io8(addr, data & 0xff);
649 debug_write_io8(addr + 1, (data >> 8) & 0xff);
651 virtual uint32 debug_read_io16(uint32 addr)
653 uint32 val = debug_read_io8(addr);
654 val |= debug_read_io8(addr + 1) << 8;
657 virtual void debug_write_io32(uint32 addr, uint32 data)
659 debug_write_io16(addr, data & 0xffff);
660 debug_write_io16(addr + 2, (data >> 16) & 0xffff);
662 virtual uint32 debug_read_io32(uint32 addr)
664 uint32 val = debug_read_io16(addr);
665 val |= debug_read_io16(addr + 2) << 16;
668 virtual bool debug_write_reg(const _TCHAR *reg, uint32 data)
672 virtual void debug_regs_info(_TCHAR *buffer, size_t buffer_len) {}
673 virtual int debug_dasm(uint32 pc, _TCHAR *buffer, size_t buffer_len)