Previous 199869 Revisions Next

r36804 Monday 30th March, 2015 at 17:30:57 UTC by Osso
dcs.c: added missing save state, fixes dram reload problems in blitz11 and wargods (nw)
[scripts/src]sound.lua
[scripts/target/mame]mame.lua
[src/emu/sound]l7a1045_l6028_dsp_a.c l7a1045_l6028_dsp_a.h
[src/mame/audio]dcs.c hng64.c
[src/mame/includes]hng64.h

trunk/scripts/src/sound.lua
r245315r245316
432432end
433433
434434
435---------------------------------------------------
436-- L7A1045 L6028 DSP-A
437--@src/emu/sound/l7a1045_l6028_dsp_a.h,SOUNDS += L7A1045
438---------------------------------------------------
439435
440if (SOUNDS["L7A1045"]~=null) then
441   files {
442      MAME_DIR .. "src/emu/sound/l7a1045_l6028_dsp_a.c",
443   }
444end
445
446
447436---------------------------------------------------
448437-- LMC1992 mixer chip
449438--@src/emu/sound/lmc1992.h,SOUNDS += LMC1992
trunk/scripts/target/mame/mame.lua
r245315r245316
252252SOUNDS["SB0400"] = true
253253SOUNDS["AC97"] = true
254254SOUNDS["ES1373"] = true
255SOUNDS["L7A1045"] = true
256255
257256--------------------------------------------------
258257-- specify available video cores
trunk/src/emu/sound/l7a1045_l6028_dsp_a.c
r245315r245316
1/***************************************************************************
2
3    L7A1045 L6028 DSP-A
4   (QFP120 package)
5
6   this is the audio chip used on the following
7   SNK Hyper NeoGeo 64 (arcade platform)
8   AKAI MPC3000 (synth)
9
10   both are driven by a V53, the MPC3000 isn't dumped.
11
12   appears to write a register number and channel/voice using
13   l7a1045_sound_select_w (offset 0)
14   format:
15
16   ---- rrrr ---c cccc
17   r = register, c = channel
18
19   the channel select appears to address 32 different voices (5-bits)
20   the register select appears to use 4-bits with 0x0 to 0xa being valid
21
22   the registers data is written / read using offsets 1,2,3 after
23   setting the register + channel, this gives 3 16-bit values for
24   each register.
25
26   register format:
27
28      offset 3           offset 2           offset 1
29      fedcba9876543210 | fedcba9876543210 | fedcba9876543210
30
31   0  ----------------   ----------------   ----------------
32
33   1  ----------------   ----------------   ----------------
34
35   2  ----------------   ----------------   ----------------
36
37   3  ----------------   ----------------   ----------------
38
39   4  ----------------   ----------------   ----------------
40
41   5  ----------------   ----------------   ----------------
42
43   6  ----------------   ----------------   ----------------
44
45   7  ----------------   ----------------   ----------------
46
47   8  ----------------   ----------------   ---------------- (read only?)                                                       
48
49   9  ----------------   ----------------   ---------------- (read only?)
50
51   a  ----------------   ----------------   ----------------
52
53   Registers are not yet understood.
54
55   Some of the other ports on the HNG64 sound CPU may also be tied
56   to this chip, this isn't yet clear.
57
58   Sample data format TBA
59
60***************************************************************************/
61
62#include "emu.h"
63#include "l7a1045_l6028_dsp_a.h"
64
65
66// device type definition
67const device_type L7A1045 = &device_creator<l7a1045_sound_device>;
68
69
70//**************************************************************************
71//  LIVE DEVICE
72//**************************************************************************
73
74//-------------------------------------------------
75//  l7a1045_sound_device - constructor
76//-------------------------------------------------
77
78l7a1045_sound_device::l7a1045_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
79   : device_t(mconfig, L7A1045, "L7A1045 L6028 DSP-A", tag, owner, clock, "l7a1045_custom", __FILE__),
80      device_sound_interface(mconfig, *this),
81      m_stream(NULL)
82      /*m_key(0),
83      m_base(NULL)*/
84{
85}
86
87
88//-------------------------------------------------
89//  device_start - device-specific startup
90//-------------------------------------------------
91
92void l7a1045_sound_device::device_start()
93{
94   /* Allocate the stream */
95   m_stream = stream_alloc(0, 2, clock() / 384);
96}
97
98
99//-------------------------------------------------
100//  sound_stream_update - handle a stream update
101//-------------------------------------------------
102
103void l7a1045_sound_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples)
104{
105   /* Clear the buffers */
106   memset(outputs[0], 0, samples*sizeof(*outputs[0]));
107   memset(outputs[1], 0, samples*sizeof(*outputs[1]));
108}
109
110
111WRITE16_MEMBER( l7a1045_sound_device::l7a1045_sound_w )
112{
113   m_stream->update();
114
115   switch (offset)
116   {
117   case 0x00:l7a1045_sound_select_w(space, offset, data, mem_mask); break;
118   case 0x01:l7a1045_sound_data_02_w(space, offset, data, mem_mask); break;
119   case 0x02:l7a1045_sound_data_04_w(space, offset, data, mem_mask); break;
120   case 0x03:l7a1045_sound_data_06_w(space, offset, data, mem_mask); break;
121   }
122
123}
124
125
126READ16_MEMBER( l7a1045_sound_device::l7a1045_sound_r )
127{
128   m_stream->update();
129
130   switch (offset)
131   {
132   case 0x00:
133   case 0x01:
134      printf("%08x: l7a1045_sound_r unknown offset %02x\n", space.device().safe_pc(), offset * 2);
135      return 0x0000;
136
137   case 0x02: return l7a1045_sound_port_0004_r(space, offset, mem_mask);
138   case 0x03: return l7a1045_sound_port_0006_r(space, offset, mem_mask);
139   }
140   return 0x000;
141}
142
143
144WRITE16_MEMBER(l7a1045_sound_device::l7a1045_sound_select_w)
145{
146   // I'm guessing these addresses are the sound chip / DSP?
147
148   // ---- ---- 000c cccc
149   // c = channel
150
151   if (data & 0x00e0) printf("%08x: l7a1045_sound_select_w unknown channel %02x\n", space.device().safe_pc(), data & 0x00ff);
152
153   UINT8 command = data >> 8;
154
155   switch (command)
156   {
157   case 0x00:
158   case 0x01:
159   case 0x02:
160   case 0x03: // 00003fffffff (startup only?)
161   case 0x04: // doesn't use 6
162   case 0x05: // 00003fffffff (mostly, often)
163   case 0x06: // 00007ff0ffff mostly
164   case 0x07: // 0000000f0708 etc. (low values)
165   case 0x08: // doesn't write to 2/4/6 with this set??
166   case 0x09: // doesn't write to 2/4/6 with this set??
167   case 0x0a: // random looking values
168
169      break;
170
171   default:
172      printf("%08x: l7a1045_sound_select_w unrecognized command %02x\n", space.device().safe_pc(), command);
173      break;
174   }
175
176   COMBINE_DATA(&m_audiochannel);
177}
178
179WRITE16_MEMBER(l7a1045_sound_device::l7a1045_sound_data_02_w)
180{
181   m_audiodat[m_audiochannel].dat[2] = data;
182
183//  if ((m_audiochannel & 0xff00) == 0x0a00)
184//      printf("%08x: write port 0x0002 chansel %04x data %04x (%04x%04x%04x)\n", space.device().safe_pc(), m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]);
185}
186
187WRITE16_MEMBER(l7a1045_sound_device::l7a1045_sound_data_04_w)
188{
189   m_audiodat[m_audiochannel].dat[1] = data;
190
191//  if ((m_audiochannel & 0xff00) == 0x0a00)
192//      printf("%08x: write port 0x0004 chansel %04x data %04x (%04x%04x%04x)\n", space.device().safe_pc(), m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]);
193}
194WRITE16_MEMBER(l7a1045_sound_device::l7a1045_sound_data_06_w)
195{
196   m_audiodat[m_audiochannel].dat[0] = data;
197
198//  if ((m_audiochannel & 0xff00) == 0x0a00)
199//      printf("%08x: write port 0x0006 chansel %04x data %04x (%04x%04x%04x)\n", space.device().safe_pc(), m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]);
200}
201
202
203READ16_MEMBER(l7a1045_sound_device::l7a1045_sound_port_0004_r)
204{
205   // it writes the channel select before reading this.. so either it works on channels, or the command..
206   // read in irq5
207   printf("%08x: l7a1045_sound_port_0004_r mask (%04x) chn %04x\n", space.device().safe_pc(), mem_mask, m_audiochannel);
208   return rand();
209}
210
211READ16_MEMBER(l7a1045_sound_device::l7a1045_sound_port_0006_r)
212{
213   // it writes the channel select before reading this.. so either it works on channels, or the command..
214   // read in irq5
215   printf("%08x: l7a1045_sound_port_0006_r mask (%04x)  chn %04x\n", space.device().safe_pc(), mem_mask, m_audiochannel);
216   return rand();
217}
trunk/src/emu/sound/l7a1045_l6028_dsp_a.h
r245315r245316
1//**************************************************************************
2//  TYPE DEFINITIONS
3//**************************************************************************
4
5struct l7a1045_voice
6{
7   /*
8   l7a1045_voice() :
9      pos(0),
10      frac(0)
11   {
12      memset(regs, 0, sizeof(UINT32)*8);
13   }
14
15   UINT32 regs[8];
16   UINT32 pos;
17   UINT32 frac;
18   */
19};
20
21// ======================> l7a1045_sound_device
22
23class l7a1045_sound_device : public device_t,
24                     public device_sound_interface
25{
26public:
27   l7a1045_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
28   ~l7a1045_sound_device() { }
29
30//   void set_base(INT8* base) { m_base = base; }
31
32   DECLARE_WRITE16_MEMBER( l7a1045_sound_w );
33   DECLARE_READ16_MEMBER( l7a1045_sound_r );
34
35protected:
36   // device-level overrides
37   virtual void device_start();
38
39   // sound stream update overrides
40   virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
41
42private:
43   sound_stream *m_stream;
44//   l7a1045_voice m_voice[32];
45//   UINT16     m_key;
46//   INT8*      m_base;
47
48   UINT16 m_audiochannel;
49
50   struct l7a1045_48bit_data {
51      UINT16 dat[3];
52   };
53
54   l7a1045_48bit_data m_audiodat[0x10000];
55
56   DECLARE_WRITE16_MEMBER(l7a1045_sound_select_w);
57   DECLARE_WRITE16_MEMBER(l7a1045_sound_data_02_w);
58   DECLARE_WRITE16_MEMBER(l7a1045_sound_data_04_w);
59   DECLARE_WRITE16_MEMBER(l7a1045_sound_data_06_w);
60
61   DECLARE_READ16_MEMBER(l7a1045_sound_port_0004_r);
62   DECLARE_READ16_MEMBER(l7a1045_sound_port_0006_r);
63
64
65};
66
67extern const device_type L7A1045;
trunk/src/mame/audio/dcs.c
r245315r245316
927927   if (m_dram_in_mb != 0)
928928   {
929929      m_sounddata = auto_alloc_array(machine(), UINT16, m_dram_in_mb << (20-1));
930      save_pointer(NAME(m_sounddata), m_dram_in_mb << (20-1));
930931      m_sounddata_words = (m_dram_in_mb << 20) / 2;
931932   }
932933   else
trunk/src/mame/audio/hng64.c
r245315r245316
200200
201201}
202202
203READ16_MEMBER(hng64_state::hng64_sound_port_0004_r)
204{
205   // it writes the channel select before reading this.. so either it works on channels, or the command..
206   // read in irq5
207   printf("%08x: hng64_sound_port_0004_r mask (%04x) chn %04x\n", space.device().safe_pc(), mem_mask, m_audiochannel);
208   return rand();
209}
203210
211READ16_MEMBER(hng64_state::hng64_sound_port_0006_r)
212{
213   // it writes the channel select before reading this.. so either it works on channels, or the command..
214   // read in irq5
215   printf("%08x: hng64_sound_port_0006_r mask (%04x)  chn %04x\n", space.device().safe_pc(), mem_mask, m_audiochannel);
216   return rand();
217}
218
204219READ16_MEMBER(hng64_state::hng64_sound_port_0008_r)
205220{
206221   // read in irq5
r245315r245316
208223   return rand();
209224}
210225
226WRITE16_MEMBER(hng64_state::hng64_sound_select_w)
227{
228   // I'm guessing these addresses are the sound chip / DSP?
211229
230   // ---- ---- 000c cccc
231   // c = channel
212232
233   if (data & 0x00e0) printf("hng64_sound_select_w unknown channel %02x\n", data & 0x00ff);
234
235   UINT8 command = data >> 8;
236
237   switch (command)
238   {
239   case 0x00:
240   case 0x01:
241   case 0x02:
242   case 0x03: // 00003fffffff (startup only?)
243   case 0x04: // doesn't use 6
244   case 0x05: // 00003fffffff (mostly, often)
245   case 0x06: // 00007ff0ffff mostly
246   case 0x07: // 0000000f0708 etc. (low values)
247   case 0x08: // doesn't write to 2/4/6 with this set??
248   case 0x09: // doesn't write to 2/4/6 with this set??
249   case 0x0a: // random looking values
250
251      break;
252
253   default:
254      printf("hng64_sound_select_w unrecognized command %02x\n", command);
255      break;
256   }
257
258   COMBINE_DATA(&m_audiochannel);
259}
260
261WRITE16_MEMBER(hng64_state::hng64_sound_data_02_w)
262{
263   m_audiodat[m_audiochannel].dat[2] = data;
264
265//  if ((m_audiochannel & 0xff00) == 0x0a00)
266//      printf("write port 0x0002 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]);
267}
268
269WRITE16_MEMBER(hng64_state::hng64_sound_data_04_w)
270{
271   m_audiodat[m_audiochannel].dat[1] = data;
272
273//  if ((m_audiochannel & 0xff00) == 0x0a00)
274//      printf("write port 0x0004 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]);
275}
276WRITE16_MEMBER(hng64_state::hng64_sound_data_06_w)
277{
278   m_audiodat[m_audiochannel].dat[0] = data;
279
280//  if ((m_audiochannel & 0xff00) == 0x0a00)
281//      printf("write port 0x0006 chansel %04x data %04x (%04x%04x%04x)\n", m_audiochannel, data, m_audiodat[m_audiochannel].dat[0], m_audiodat[m_audiochannel].dat[1], m_audiodat[m_audiochannel].dat[2]);
282}
283
213284// but why not just use the V33/V53 XA mode??
214285WRITE16_MEMBER(hng64_state::hng64_sound_bank_w)
215286{
r245315r245316
295366}
296367
297368static ADDRESS_MAP_START( hng_sound_io, AS_IO, 16, hng64_state )
298   AM_RANGE(0x0000, 0x0007) AM_DEVREADWRITE("l7a1045", l7a1045_sound_device, l7a1045_sound_r, l7a1045_sound_w )
299
369   AM_RANGE(0x0000, 0x0001) AM_WRITE( hng64_sound_select_w )
370   AM_RANGE(0x0002, 0x0003) AM_WRITE( hng64_sound_data_02_w )
371   AM_RANGE(0x0004, 0x0005) AM_READWRITE( hng64_sound_port_0004_r, hng64_sound_data_04_w )
372   AM_RANGE(0x0006, 0x0007) AM_READWRITE( hng64_sound_port_0006_r, hng64_sound_data_06_w )
300373   AM_RANGE(0x0008, 0x0009) AM_READWRITE( hng64_sound_port_0008_r, hng64_sound_port_0008_w )
301374   AM_RANGE(0x000a, 0x000b) AM_WRITE( hng64_sound_port_000a_w )
302375   AM_RANGE(0x000c, 0x000d) AM_WRITE( hng64_sound_port_000c_w )
r245315r245316
371444   MCFG_V53_TCU_OUT1_HANDLER(WRITELINE(hng64_state, tcu_tm1_cb))
372445   MCFG_V53_TCU_OUT2_HANDLER(WRITELINE(hng64_state, tcu_tm2_cb))
373446
374   MCFG_SOUND_ADD("l7a1045", L7A1045, 16000000 ) // ??
375   MCFG_SOUND_ROUTE(1, "lspeaker", 1.0)
376   MCFG_SOUND_ROUTE(0, "rspeaker", 1.0)
377
378447MACHINE_CONFIG_END
trunk/src/mame/includes/hng64.h
r245315r245316
11#include "machine/msm6242.h"
22#include "cpu/mips/mips3.h"
33#include "cpu/nec/v53.h"
4#include "sound/l7a1045_l6028_dsp_a.h"
54
65enum
76{
r245315r245316
363362   DECLARE_WRITE_LINE_MEMBER(tcu_tm1_cb);
364363   DECLARE_WRITE_LINE_MEMBER(tcu_tm2_cb);
365364
365   UINT16 m_audiochannel;
366366
367   struct hng64_48bit_data {
368      UINT16 dat[3];
369   };
367370
371   hng64_48bit_data m_audiodat[0x10000];
372
373   DECLARE_WRITE16_MEMBER(hng64_sound_select_w);
374   DECLARE_WRITE16_MEMBER(hng64_sound_data_02_w);
375   DECLARE_WRITE16_MEMBER(hng64_sound_data_04_w);
376   DECLARE_WRITE16_MEMBER(hng64_sound_data_06_w);
377
378   DECLARE_READ16_MEMBER(hng64_sound_port_0004_r);
379   DECLARE_READ16_MEMBER(hng64_sound_port_0006_r);
380
368381   DECLARE_READ16_MEMBER(hng64_sound_port_0008_r);
369382   DECLARE_WRITE16_MEMBER(hng64_sound_port_0008_w);
370383


Previous 199869 Revisions Next


© 1997-2024 The MAME Team