2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
7 [ AY-3-8910 / AY-3-8912 / AY-3-8913 ]
16 #include "fmgen/opna.h"
18 #if defined(HAS_AY_3_8913)
19 // AY-3-8913: both port a and port b are not supported
20 #elif defined(HAS_AY_3_8912)
21 // AY-3-8912: port b is not supported
22 #define SUPPORT_AY_3_891X_PORT_A
24 // AY-3-8910: both port a and port b are supported
25 #define SUPPORT_AY_3_891X_PORT_A
26 #define SUPPORT_AY_3_891X_PORT_B
28 #if defined(SUPPORT_AY_3_891X_PORT_A) || defined(SUPPORT_AY_3_891X_PORT_B)
29 #define SUPPORT_AY_3_891X_PORT
32 #ifdef SUPPORT_AY_3_891X_PORT_A
33 #define SIG_AY_3_891X_PORT_A 0
35 #ifdef SUPPORT_AY_3_891X_PORT_B
36 #define SIG_AY_3_891X_PORT_B 1
38 #define SIG_AY_3_891X_MUTE 2
40 class AY_3_891X : public DEVICE
44 int base_decibel_fm, base_decibel_psg;
49 #ifdef SUPPORT_AY_3_891X_PORT
75 AY_3_891X(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
77 #ifdef SUPPORT_AY_3_891X_PORT
78 for(int i = 0; i < 2; i++) {
79 initialize_output_signals(&port[i].outputs);
80 port[i].wreg = port[i].rreg = 0;//0xff;
83 base_decibel_fm = base_decibel_psg = 0;
84 #if defined(HAS_AY_3_8910)
85 set_device_name(_T("AY-3-8910 PSG"));
86 #elif defined(HAS_AY_3_8912)
87 set_device_name(_T("AY-3-8912 PSG"));
88 #elif defined(HAS_AY_3_8913)
89 set_device_name(_T("AY-3-8913 PSG"));
91 set_device_name(_T("AY_3_891X PSG"));
100 void write_io8(uint32_t addr, uint32_t data);
101 uint32_t read_io8(uint32_t addr);
102 void write_signal(int id, uint32_t data, uint32_t mask);
103 void event_vline(int v, int clock);
104 void event_callback(int event_id, int error);
105 void mix(int32_t* buffer, int cnt);
106 void set_volume(int ch, int decibel_l, int decibel_r);
107 void update_timing(int new_clocks, double new_frames_per_sec, int new_lines_per_frame);
109 void save_state(FILEIO* state_fio);
110 bool load_state(FILEIO* state_fio);
113 #ifdef SUPPORT_AY_3_891X_PORT_A
114 void set_context_port_a(DEVICE* device, int id, uint32_t mask, int shift)
116 register_output_signal(&port[0].outputs, device, id, mask, shift);
119 #ifdef SUPPORT_AY_3_891X_PORT_B
120 void set_context_port_b(DEVICE* device, int id, uint32_t mask, int shift)
122 register_output_signal(&port[1].outputs, device, id, mask, shift);
125 void initialize_sound(int rate, int clock, int samples, int decibel_fm, int decibel_psg);
126 void set_reg(uint32_t addr, uint32_t data); // for patch