OSDN Git Service

1e646a489b79c35eb27ec35eb13f3a5bd48c5a1d
[csp-qt/common_source_project-fm7.git] / source / src / vm / libcpu_newdev / device.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2006.08.18 -
6
7         [ device base class ]
8 */
9
10 #ifndef _LIBCPU_NEWDEV_DEVICE_H_
11 #define _LIBCPU_NEWDEV_DEVICE_H_
12
13 #include <stdarg.h>
14 #include "vm.h"
15 #include "../emu.h"
16 #if defined(_USE_QT)
17 #include "osd.h"
18 #include "csp_logger.h"
19 //#define USE_DEVICE_NAME
20 #endif
21 // max devices connected to the output port
22 #define MAX_OUTPUT      16
23
24 // common signal id
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
30
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
37
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
48
49
50 class VM;
51 class EMU;
52 class OSD;
53 class DEVICE
54 {
55 protected:
56         VM* vm;
57         EMU* emu;
58         OSD* osd;
59 public:
60         DEVICE(VM* parent_vm, EMU* parent_emu);
61         //ToDo: Will implement real destructor per real classes and below destructor decl. with "virtual".
62         // This makes warning:
63         //"deleting object of polymorphic class type 'DEVICE' which has non-virtual
64         // destructor might cause undefined behavior [-Wdelete-non-virtual-dtor]".
65         //~DEVICE(void);
66         ~DEVICE(void) {}
67         
68         virtual void initialize() { osd = emu->get_osd(); }
69         virtual void release() {}
70         
71         virtual void update_config() {}
72         virtual void save_state(FILEIO* state_fio) {}
73         virtual bool load_state(FILEIO* state_fio)
74         {
75                 return true;
76         }
77         
78         // control
79         virtual void reset() {}
80         virtual void special_reset()
81         {
82                 reset();
83         }
84         
85         // NOTE: the virtual bus interface functions for 16/32bit access invite the cpu is little endian.
86         // if the cpu is big endian, you need to implement them in the virtual machine memory/io classes.
87         
88         // memory bus
89         virtual void write_data8(uint32_t addr, uint32_t data) {}
90         virtual uint32_t read_data8(uint32_t addr)
91         {
92                 return 0xff;
93         }
94         virtual void write_data16(uint32_t addr, uint32_t data)
95         {
96                 write_data8(addr, data & 0xff);
97                 write_data8(addr + 1, (data >> 8) & 0xff);
98         }
99         virtual uint32_t read_data16(uint32_t addr)
100         {
101                 uint32_t val = read_data8(addr);
102                 val |= read_data8(addr + 1) << 8;
103                 return val;
104         }
105         virtual void write_data32(uint32_t addr, uint32_t data)
106         {
107                 write_data16(addr, data & 0xffff);
108                 write_data16(addr + 2, (data >> 16) & 0xffff);
109         }
110         virtual uint32_t read_data32(uint32_t addr)
111         {
112                 uint32_t val = read_data16(addr);
113                 val |= read_data16(addr + 2) << 16;
114                 return val;
115         }
116         virtual void write_data8w(uint32_t addr, uint32_t data, int* wait)
117         {
118                 *wait = 0;
119                 write_data8(addr, data);
120         }
121         virtual uint32_t read_data8w(uint32_t addr, int* wait)
122         {
123                 *wait = 0;
124                 return read_data8(addr);
125         }
126         virtual void write_data16w(uint32_t addr, uint32_t data, int* wait)
127         {
128                 int wait_l, wait_h;
129                 write_data8w(addr, data & 0xff, &wait_l);
130                 write_data8w(addr + 1, (data >> 8) & 0xff, &wait_h);
131                 *wait = wait_l + wait_h;
132         }
133         virtual uint32_t read_data16w(uint32_t addr, int* wait)
134         {
135                 int wait_l, wait_h;
136                 uint32_t val = read_data8w(addr, &wait_l);
137                 val |= read_data8w(addr + 1, &wait_h) << 8;
138                 *wait = wait_l + wait_h;
139                 return val;
140         }
141         virtual void write_data32w(uint32_t addr, uint32_t data, int* wait)
142         {
143                 int wait_l, wait_h;
144                 write_data16w(addr, data & 0xffff, &wait_l);
145                 write_data16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
146                 *wait = wait_l + wait_h;
147         }
148         virtual uint32_t read_data32w(uint32_t addr, int* wait)
149         {
150                 int wait_l, wait_h;
151                 uint32_t val = read_data16w(addr, &wait_l);
152                 val |= read_data16w(addr + 2, &wait_h) << 16;
153                 *wait = wait_l + wait_h;
154                 return val;
155         }
156         virtual uint32_t fetch_op(uint32_t addr, int *wait)
157         {
158                 return read_data8w(addr, wait);
159         }
160         virtual void write_dma_data8(uint32_t addr, uint32_t data)
161         {
162                 write_data8(addr, data);
163         }
164         virtual uint32_t read_dma_data8(uint32_t addr)
165         {
166                 return read_data8(addr);
167         }
168         virtual void write_dma_data16(uint32_t addr, uint32_t data)
169         {
170                 write_data16(addr, data);
171         }
172         virtual uint32_t read_dma_data16(uint32_t addr)
173         {
174                 return read_data16(addr);
175         }
176         virtual void write_dma_data32(uint32_t addr, uint32_t data)
177         {
178                 write_data32(addr, data);
179         }
180         virtual uint32_t read_dma_data32(uint32_t addr)
181         {
182                 return read_data32(addr);
183         }
184         virtual void write_dma_data8w(uint32_t addr, uint32_t data, int* wait)
185         {
186                 write_data8w(addr, data, wait);
187         }
188         virtual uint32_t read_dma_data8w(uint32_t addr, int* wait)
189         {
190                 return read_data8w(addr, wait);
191         }
192         virtual void write_dma_data16w(uint32_t addr, uint32_t data, int* wait)
193         {
194                 write_data16w(addr, data, wait);
195         }
196         virtual uint32_t read_dma_data16w(uint32_t addr, int* wait)
197         {
198                 return read_data16w(addr, wait);
199         }
200         virtual void write_dma_data32w(uint32_t addr, uint32_t data, int* wait)
201         {
202                 write_data32w(addr, data, wait);
203         }
204         virtual uint32_t read_dma_data32w(uint32_t addr, int* wait)
205         {
206                 return read_data32w(addr, wait);
207         }
208         
209         // i/o bus
210         virtual void write_io8(uint32_t addr, uint32_t data) {}
211         virtual uint32_t read_io8(uint32_t addr);
212         virtual void write_io16(uint32_t addr, uint32_t data)
213         {
214                 write_io8(addr, data & 0xff);
215                 write_io8(addr + 1, (data >> 8) & 0xff);
216         }
217         virtual uint32_t read_io16(uint32_t addr)
218         {
219                 uint32_t val = read_io8(addr);
220                 val |= read_io8(addr + 1) << 8;
221                 return val;
222         }
223         virtual void write_io32(uint32_t addr, uint32_t data)
224         {
225                 write_io16(addr, data & 0xffff);
226                 write_io16(addr + 2, (data >> 16) & 0xffff);
227         }
228         virtual uint32_t read_io32(uint32_t addr)
229         {
230                 uint32_t val = read_io16(addr);
231                 val |= read_io16(addr + 2) << 16;
232                 return val;
233         }
234         virtual void write_io8w(uint32_t addr, uint32_t data, int* wait)
235         {
236                 *wait = 0;
237                 write_io8(addr, data);
238         }
239         virtual uint32_t read_io8w(uint32_t addr, int* wait)
240         {
241                 *wait = 0;
242                 return read_io8(addr);
243         }
244         virtual void write_io16w(uint32_t addr, uint32_t data, int* wait)
245         {
246                 int wait_l, wait_h;
247                 write_io8w(addr, data & 0xff, &wait_l);
248                 write_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
249                 *wait = wait_l + wait_h;
250         }
251         virtual uint32_t read_io16w(uint32_t addr, int* wait)
252         {
253                 int wait_l, wait_h;
254                 uint32_t val = read_io8w(addr, &wait_l);
255                 val |= read_io8w(addr + 1, &wait_h) << 8;
256                 *wait = wait_l + wait_h;
257                 return val;
258         }
259         virtual void write_io32w(uint32_t addr, uint32_t data, int* wait)
260         {
261                 int wait_l, wait_h;
262                 write_io16w(addr, data & 0xffff, &wait_l);
263                 write_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
264                 *wait = wait_l + wait_h;
265         }
266         virtual uint32_t read_io32w(uint32_t addr, int* wait)
267         {
268                 int wait_l, wait_h;
269                 uint32_t val = read_io16w(addr, &wait_l);
270                 val |= read_io16w(addr + 2, &wait_h) << 16;
271                 *wait = wait_l + wait_h;
272                 return val;
273         }
274         virtual void write_dma_io8(uint32_t addr, uint32_t data)
275         {
276                 write_io8(addr, data);
277         }
278         virtual uint32_t read_dma_io8(uint32_t addr)
279         {
280                 return read_io8(addr);
281         }
282         virtual void write_dma_io16(uint32_t addr, uint32_t data)
283         {
284                 write_io16(addr, data);
285         }
286         virtual uint32_t read_dma_io16(uint32_t addr)
287         {
288                 return read_io16(addr);
289         }
290         virtual void write_dma_io32(uint32_t addr, uint32_t data)
291         {
292                 write_io32(addr, data);
293         }
294         virtual uint32_t read_dma_io32(uint32_t addr)
295         {
296                 return read_io32(addr);
297         }
298         virtual void write_dma_io8w(uint32_t addr, uint32_t data, int* wait)
299         {
300                 write_io8w(addr, data, wait);
301         }
302         virtual uint32_t read_dma_io8w(uint32_t addr, int* wait)
303         {
304                 return read_io8w(addr, wait);
305         }
306         virtual void write_dma_io16w(uint32_t addr, uint32_t data, int* wait)
307         {
308                 write_io16w(addr, data, wait);
309         }
310         virtual uint32_t read_dma_io16w(uint32_t addr, int* wait)
311         {
312                 return read_io16w(addr, wait);
313         }
314         virtual void write_dma_io32w(uint32_t addr, uint32_t data, int* wait)
315         {
316                 write_io32w(addr, data, wait);
317         }
318         virtual uint32_t read_dma_io32w(uint32_t addr, int* wait)
319         {
320                 return read_io32w(addr, wait);
321         }
322         
323         // memory mapped i/o
324         virtual void write_memory_mapped_io8(uint32_t addr, uint32_t data)
325         {
326                 write_io8(addr, data);
327         }
328         virtual uint32_t read_memory_mapped_io8(uint32_t addr)
329         {
330                 return read_io8(addr);
331         }
332         virtual void write_memory_mapped_io16(uint32_t addr, uint32_t data)
333         {
334                 write_memory_mapped_io8(addr, data & 0xff);
335                 write_memory_mapped_io8(addr + 1, (data >> 8) & 0xff);
336         }
337         virtual uint32_t read_memory_mapped_io16(uint32_t addr)
338         {
339                 uint32_t val = read_memory_mapped_io8(addr);
340                 val |= read_memory_mapped_io8(addr + 1) << 8;
341                 return val;
342         }
343         virtual void write_memory_mapped_io32(uint32_t addr, uint32_t data)
344         {
345                 write_memory_mapped_io16(addr, data & 0xffff);
346                 write_memory_mapped_io16(addr + 2, (data >> 16) & 0xffff);
347         }
348         virtual uint32_t read_memory_mapped_io32(uint32_t addr)
349         {
350                 uint32_t val = read_memory_mapped_io16(addr);
351                 val |= read_memory_mapped_io16(addr + 2) << 16;
352                 return val;
353         }
354         virtual void write_memory_mapped_io8w(uint32_t addr, uint32_t data, int* wait)
355         {
356                 *wait = 0;
357                 write_memory_mapped_io8(addr, data);
358         }
359         virtual uint32_t read_memory_mapped_io8w(uint32_t addr, int* wait)
360         {
361                 *wait = 0;
362                 return read_memory_mapped_io8(addr);
363         }
364         virtual void write_memory_mapped_io16w(uint32_t addr, uint32_t data, int* wait)
365         {
366                 int wait_l, wait_h;
367                 write_memory_mapped_io8w(addr, data & 0xff, &wait_l);
368                 write_memory_mapped_io8w(addr + 1, (data >> 8) & 0xff, &wait_h);
369                 *wait = wait_l + wait_h;
370         }
371         virtual uint32_t read_memory_mapped_io16w(uint32_t addr, int* wait)
372         {
373                 int wait_l, wait_h;
374                 uint32_t val = read_memory_mapped_io8w(addr, &wait_l);
375                 val |= read_memory_mapped_io8w(addr + 1, &wait_h) << 8;
376                 *wait = wait_l + wait_h;
377                 return val;
378         }
379         virtual void write_memory_mapped_io32w(uint32_t addr, uint32_t data, int* wait)
380         {
381                 int wait_l, wait_h;
382                 write_memory_mapped_io16w(addr, data & 0xffff, &wait_l);
383                 write_memory_mapped_io16w(addr + 2, (data >> 16) & 0xffff, &wait_h);
384                 *wait = wait_l + wait_h;
385         }
386         virtual uint32_t read_memory_mapped_io32w(uint32_t addr, int* wait)
387         {
388                 int wait_l, wait_h;
389                 uint32_t val = read_memory_mapped_io16w(addr, &wait_l);
390                 val |= read_memory_mapped_io16w(addr + 2, &wait_h) << 16;
391                 *wait = wait_l + wait_h;
392                 return val;
393         }
394         
395         // device to device
396         typedef struct {
397                 DEVICE *device;
398                 int id;
399                 uint32_t mask;
400                 int shift;
401         } output_t;
402         
403         typedef struct {
404                 int count;
405                 output_t item[MAX_OUTPUT];
406         } outputs_t;
407         
408         virtual void initialize_output_signals(outputs_t *items)
409         {
410                 items->count = 0;
411         }
412         virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask, int shift)
413         {
414                 int c = items->count++;
415                 items->item[c].device = device;
416                 items->item[c].id = id;
417                 items->item[c].mask = mask;
418                 items->item[c].shift = shift;
419         }
420         virtual void register_output_signal(outputs_t *items, DEVICE *device, int id, uint32_t mask)
421         {
422                 int c = items->count++;
423                 items->item[c].device = device;
424                 items->item[c].id = id;
425                 items->item[c].mask = mask;
426                 items->item[c].shift = 0;
427         }
428         virtual void write_signals(outputs_t *items, uint32_t data)
429         {
430                 for(int i = 0; i < items->count; i++) {
431                         output_t *item = &items->item[i];
432                         int shift = item->shift;
433                         uint32_t val = (shift < 0) ? (data >> (-shift)) : (data << shift);
434                         uint32_t mask = (shift < 0) ? (item->mask >> (-shift)) : (item->mask << shift);
435                         item->device->write_signal(item->id, val, mask);
436                 }
437         };
438         virtual void write_signal(int id, uint32_t data, uint32_t mask) {}
439         virtual uint32_t read_signal(int ch)
440         {
441                 return 0;
442         }
443         
444         // z80 daisy chain
445         virtual void set_context_intr(DEVICE* device, uint32_t bit) {}
446         virtual void set_context_child(DEVICE* device) {}
447         
448         // interrupt device to device
449         virtual void set_intr_iei(bool val) {}
450         
451         // interrupt device to cpu
452         virtual void set_intr_line(bool line, bool pending, uint32_t bit) {}
453         
454         // interrupt cpu to device
455         virtual uint32_t get_intr_ack()
456         {
457                 return 0xff;
458         }
459         virtual void notify_intr_reti() {}
460         virtual void notify_intr_ei() {}
461         
462         // dma
463         virtual void do_dma() {}
464         
465         // cpu
466         virtual int run(int clock)
467         {
468                 // when clock == -1, run one opecode
469                 return (clock == -1 ? 1 : clock);
470         }
471         virtual void set_extra_clock(int clock) {}
472         virtual int get_extra_clock()
473         {
474                 return 0;
475         }
476         virtual uint32_t get_pc()
477         {
478                 return 0;
479         }
480         virtual uint32_t get_next_pc()
481         {
482                 return 0;
483         }
484         
485         // bios
486         virtual bool bios_call_i86(uint32_t PC, uint16_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag)
487         {
488                 return false;
489         }
490         virtual bool bios_int_i86(int intnum, uint16_t regs[], uint16_t sregs[], int32_t* ZeroFlag, int32_t* CarryFlag)
491         {
492                 return false;
493         }
494         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)   {
495                 return false;
496         }
497         // misc
498         const _TCHAR *get_device_name(void)
499         {
500                 return (const _TCHAR *)this_device_name;
501         }
502    
503         // event manager
504         DEVICE* event_manager;
505         
506         virtual void set_context_event_manager(DEVICE* device)
507         {
508                 event_manager = device;
509         }
510         virtual int get_event_manager_id();
511         virtual void register_event(DEVICE* device, int event_id, double usec, bool loop, int* register_id);
512         virtual void register_event_by_clock(DEVICE* device, int event_id, uint64_t clock, bool loop, int* register_id);
513         virtual void cancel_event(DEVICE* device, int register_id);
514         virtual void register_frame_event(DEVICE* device);
515         virtual void register_vline_event(DEVICE* device);
516         virtual uint32_t get_event_remaining_clock(int register_id);
517         virtual double get_event_remaining_usec(int register_id);
518         virtual uint32_t get_current_clock();
519         virtual uint32_t get_passed_clock(uint32_t prev);
520         virtual double get_passed_usec(uint32_t prev);
521         virtual uint32_t get_cpu_pc(int index);
522         virtual void request_skip_frames();
523         virtual void set_frames_per_sec(double frames);
524         virtual void set_lines_per_frame(int lines);
525         // Force render sound immediately when device's status has changed.
526         // You must call this after you changing registers (or enything).
527         // If has problems, try set_realtime_render.
528         // See mb8877.cpp and ym2203.cpp. 
529         // -- 20161010 K.O
530         virtual void touch_sound(void);
531         // Force render per 1 sample automatically.
532         // See pcm1bit.cpp .
533         // -- 20161010 K.O
534         virtual void set_realtime_render(DEVICE *device, bool flag);
535         virtual void set_realtime_render(bool flag)
536         {
537                 set_realtime_render(this, flag);
538         }
539         virtual void update_timing(int new_clocks, double new_frames_per_sec, int new_lines_per_frame) {}
540         
541         // event callback
542         virtual void event_callback(int event_id, int err) {}
543         virtual void event_pre_frame() {}       // this event is to update timing settings
544         virtual void event_frame() {}
545         virtual void event_vline(int v, int clock) {}
546         virtual void event_hsync(int v, int h, int clock) {}
547         
548         // sound
549         virtual void mix(int32_t* buffer, int cnt) {}
550         virtual void set_volume(int ch, int decibel_l, int decibel_r) {} // +1 equals +0.5dB (same as fmgen)
551         virtual void set_device_name(const _TCHAR *format, ...);
552         virtual void out_debug_log(const char *fmt, ...);
553 #if 1
554         // debugger
555         // DEBUGGER is enabled by default.
556         virtual void *get_debugger();
557         virtual uint32_t get_debug_prog_addr_mask();
558         virtual uint32_t get_debug_data_addr_mask();
559         virtual void write_debug_data8(uint32_t addr, uint32_t data);
560         virtual uint32_t read_debug_data8(uint32_t addr);
561         virtual void write_debug_data16(uint32_t addr, uint32_t data);
562         virtual uint32_t read_debug_data16(uint32_t addr);
563         virtual void write_debug_data32(uint32_t addr, uint32_t data);
564         virtual uint32_t read_debug_data32(uint32_t addr);
565         virtual void write_debug_io8(uint32_t addr, uint32_t data);
566         virtual uint32_t read_debug_io8(uint32_t addr);
567         virtual void write_debug_io16(uint32_t addr, uint32_t data);
568         virtual uint32_t read_debug_io16(uint32_t addr);
569         virtual void write_debug_io32(uint32_t addr, uint32_t data);
570         virtual uint32_t read_debug_io32(uint32_t addr);
571         virtual bool write_debug_reg(const _TCHAR *reg, uint32_t data);
572         virtual void get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
573         virtual int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
574 #endif
575         _TCHAR this_device_name[128];
576         
577         DEVICE* prev_device;
578         DEVICE* next_device;
579         int this_device_id;
580 };
581
582 #endif