1 /****************************************************************
2
3 MAME / MESS functions
4
5 ****************************************************************/
6
7 #include "driver.h"
8 #include "ym2413.h"
9
10 //#define YM2413ISA
11 #ifdef YM2413ISA
12 #include <pc.h>
13 #endif
14
15
16 /* for stream system */
17 static int stream[MAX_2413];
18
19 static const struct YM2413interface *intf;
20
21 /*
22 void YM2413DAC_update(int chip,INT16 *buffer,int length)
23 {
24 static int out = 0;
25
26 if ( ym2413[chip].reg[0x0F] & 0x01 )
27 {
28 out = ((ym2413[chip].reg[0x10] & 0xF0) << 7);
29 }
30 while (length--) *(buffer++) = out;
31 }
32 */
YM2413_sh_start(const struct MachineSound * msound)33 int YM2413_sh_start (const struct MachineSound *msound)
34 {
35 char buf[2][40];
36 const char *name[2];
37 int volume[2];
38
39 int i;
40 int rate = Machine->sample_rate;
41
42 intf = msound->sound_interface;
43 if( intf->num > MAX_2413 ) return 1;
44
45 rate = intf->baseclock/72;
46
47
48 /* emulator create */
49 if ( YM2413Init(intf->num, intf->baseclock, rate) != 0)
50 return 1;
51
52 for (i = 0; i < intf->num; i++)
53 {
54 /* stream setup */
55
56 int vol = intf->mixing_level[i];
57
58 name[0]=buf[0];
59 name[1]=buf[1];
60 volume[0] = vol & 0xffff;
61 vol>>=16;
62 volume[1] = vol & 0xffff;
63
64 /* YM2413 has two separate outputs:
65 ** 1 for melody output
66 ** 1 for rhythm output (percussion)
67 */
68 sprintf(buf[0],"%s #%d MO",sound_name(msound),i);
69 sprintf(buf[1],"%s #%d RO",sound_name(msound),i);
70
71 /* stream system initialize */
72 stream[i] = stream_init_multi(2,
73 name,volume,rate,i,YM2413UpdateOne);
74
75 YM2413SetUpdateHandler(i, stream_update, stream[i]);
76 }
77 return 0;
78
79
80
81
82 #if 0
83 int i, tst;
84 char name[40];
85
86 num = intf->num;
87
88 tst = YM3812_sh_start (msound);
89 if (tst)
90 return 1;
91
92 for (i=0;i<num;i++)
93 {
94 ym2413_reset (i);
95 sprintf(name,"YM-2413 DAC #%d",i);
96
97 ym2413[i].DAC_stream = stream_init(name,intf->mixing_level[i],
98 Machine->sample_rate, i, YM2413DAC_update);
99
100 if (ym2413[i].DAC_stream == -1)
101 return 1;
102 }
103 return 0;
104 #endif
105
106 }
107
YM2413_sh_stop(void)108 void YM2413_sh_stop (void)
109 {
110 YM2413Shutdown();
111 }
112
YM2413_sh_reset(void)113 void YM2413_sh_reset (void)
114 {
115 int i;
116
117 for (i=0;i<intf->num;i++)
118 {
119 YM2413ResetChip(i);
120 }
121 }
122
123
124 #ifdef YM2413ISA
WRITE_HANDLER(YM2413_register_port_0_w)125 WRITE_HANDLER( YM2413_register_port_0_w ) {
126 int i,a;
127 outportb(0x308,data); // ym2413_write (0, 0, data);
128 //add delay
129 for (i=0; i<0x20; i++)
130 a = inportb(0x80);
131
132 } /* 1st chip */
133 #else
WRITE_HANDLER(YM2413_register_port_0_w)134 WRITE_HANDLER( YM2413_register_port_0_w ) { YM2413Write (0, 0, data); } /* 1st chip */
135 #endif
WRITE_HANDLER(YM2413_register_port_1_w)136 WRITE_HANDLER( YM2413_register_port_1_w ) { YM2413Write (1, 0, data); } /* 2nd chip */
WRITE_HANDLER(YM2413_register_port_2_w)137 WRITE_HANDLER( YM2413_register_port_2_w ) { YM2413Write (2, 0, data); } /* 3rd chip */
WRITE_HANDLER(YM2413_register_port_3_w)138 WRITE_HANDLER( YM2413_register_port_3_w ) { YM2413Write (3, 0, data); } /* 4th chip */
139
140 #ifdef YM2413ISA
WRITE_HANDLER(YM2413_data_port_0_w)141 WRITE_HANDLER( YM2413_data_port_0_w ) {
142 int i,a;
143 outportb(0x309,data);// YM2413Write (0, 1, data);
144 //add delay
145 for (i=0; i<0x40; i++)
146 a = inportb(0x80);
147 } /* 1st chip */
148 #else
WRITE_HANDLER(YM2413_data_port_0_w)149 WRITE_HANDLER( YM2413_data_port_0_w ) { YM2413Write (0, 1, data); } /* 1st chip */
150 #endif
WRITE_HANDLER(YM2413_data_port_1_w)151 WRITE_HANDLER( YM2413_data_port_1_w ) { YM2413Write (1, 1, data); } /* 2nd chip */
WRITE_HANDLER(YM2413_data_port_2_w)152 WRITE_HANDLER( YM2413_data_port_2_w ) { YM2413Write (2, 1, data); } /* 3rd chip */
WRITE_HANDLER(YM2413_data_port_3_w)153 WRITE_HANDLER( YM2413_data_port_3_w ) { YM2413Write (3, 1, data); } /* 4th chip */
154
WRITE16_HANDLER(YM2413_register_port_0_lsb_w)155 WRITE16_HANDLER( YM2413_register_port_0_lsb_w ) { if (ACCESSING_LSB) YM2413_register_port_0_w(offset,data & 0xff); }
WRITE16_HANDLER(YM2413_register_port_1_lsb_w)156 WRITE16_HANDLER( YM2413_register_port_1_lsb_w ) { if (ACCESSING_LSB) YM2413_register_port_1_w(offset,data & 0xff); }
WRITE16_HANDLER(YM2413_register_port_2_lsb_w)157 WRITE16_HANDLER( YM2413_register_port_2_lsb_w ) { if (ACCESSING_LSB) YM2413_register_port_2_w(offset,data & 0xff); }
WRITE16_HANDLER(YM2413_register_port_3_lsb_w)158 WRITE16_HANDLER( YM2413_register_port_3_lsb_w ) { if (ACCESSING_LSB) YM2413_register_port_3_w(offset,data & 0xff); }
WRITE16_HANDLER(YM2413_data_port_0_lsb_w)159 WRITE16_HANDLER( YM2413_data_port_0_lsb_w ) { if (ACCESSING_LSB) YM2413_data_port_0_w(offset,data & 0xff); }
WRITE16_HANDLER(YM2413_data_port_1_lsb_w)160 WRITE16_HANDLER( YM2413_data_port_1_lsb_w ) { if (ACCESSING_LSB) YM2413_data_port_1_w(offset,data & 0xff); }
WRITE16_HANDLER(YM2413_data_port_2_lsb_w)161 WRITE16_HANDLER( YM2413_data_port_2_lsb_w ) { if (ACCESSING_LSB) YM2413_data_port_2_w(offset,data & 0xff); }
WRITE16_HANDLER(YM2413_data_port_3_lsb_w)162 WRITE16_HANDLER( YM2413_data_port_3_lsb_w ) { if (ACCESSING_LSB) YM2413_data_port_3_w(offset,data & 0xff); }
163
164