OSDN Git Service

[VM] Fix crash when end of emulation at various(!) VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / ym2151.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2009.03.08-
6
7         [ YM2151 ]
8 */
9
10 #ifndef _YM2151_H_
11 #define _YM2151_H_
12
13 //#include "vm.h"
14 //#include "../emu.h"
15 #include "device.h"
16 #include "fmgen/opm.h"
17
18 #ifdef SUPPORT_WIN32_DLL
19 #define SUPPORT_MAME_FM_DLL
20 //#include "fmdll/fmdll.h"
21 #endif
22
23 #define SIG_YM2151_MUTE         0
24
25 class VM;
26 class EMU;
27 class DEBUGGER;
28 class YM2151 : public DEVICE
29 {
30 private:
31         // output signals
32         outputs_t outputs_irq;
33         
34         DEBUGGER *d_debugger;
35         FM::OPM* opm;
36 #ifdef SUPPORT_MAME_FM_DLL
37 //      CFMDLL* fmdll;
38         LPVOID* dllchip;
39 #endif
40         struct {
41                 bool written;
42                 uint8_t data;
43         } port_log[0x100];
44         int base_decibel;
45         
46         int chip_clock;
47         uint8_t ch;
48         bool irq_prev, mute;
49         
50         uint32_t clock_prev;
51         uint32_t clock_accum;
52         uint32_t clock_const;
53         int timer_event_id;
54         
55         uint32_t clock_busy;
56         bool busy;
57         
58         void update_count();
59         void update_event();
60         void update_interrupt();
61         
62 public:
63         YM2151(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
64         {
65                 initialize_output_signals(&outputs_irq);
66                 base_decibel = 0;
67                 d_debugger = NULL;
68                 set_device_name(_T("YM2151 OPM"));
69         }
70         ~YM2151() {}
71         
72         // common functions
73         void initialize();
74         void release();
75         void reset();
76         void write_io8(uint32_t addr, uint32_t data);
77         uint32_t read_io8(uint32_t addr);
78         void write_signal(int id, uint32_t data, uint32_t mask);
79         void event_vline(int v, int clock);
80         void event_callback(int event_id, int error);
81         void mix(int32_t* buffer, int cnt);
82         void set_volume(int ch, int decibel_l, int decibel_r);
83         void update_timing(int new_clocks, double new_frames_per_sec, int new_lines_per_frame);
84         // for debugging
85         void write_via_debugger_data8(uint32_t addr, uint32_t data);
86         uint32_t read_via_debugger_data8(uint32_t addr);
87         bool is_debugger_available()
88         {
89                 return true;
90         }
91         void *get_debugger()
92         {
93                 return d_debugger;
94         }
95         uint64_t get_debug_data_addr_space()
96         {
97                 return 0x100;
98         }
99         void write_debug_data8(uint32_t addr, uint32_t data)
100         {
101                 if(addr < 0x100) {
102                         write_via_debugger_data8(addr, data);
103                 }
104         }
105         uint32_t read_debug_data8(uint32_t addr)
106         {
107                 if(addr < 0x100) {
108                         return read_via_debugger_data8(addr);
109                 }
110                 return 0;
111         }
112
113         bool process_state(FILEIO* state_fio, bool loading);
114         // unique functions
115         void set_context_irq(DEVICE* device, int id, uint32_t mask)
116         {
117                 register_output_signal(&outputs_irq, device, id, mask);
118         }
119         void set_context_debugger(DEBUGGER* device)
120         {
121                 d_debugger = device;
122         }
123         void initialize_sound(int rate, int clock, int samples, int decibel);
124         void set_reg(uint32_t addr, uint32_t data); // for patch
125 };
126
127 #endif
128