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