Previous 199869 Revisions Next

r40646 Tuesday 8th September, 2015 at 14:09:47 UTC by Andrew Gardner
Merge branch 'master' of https://github.com/mamedev/mame
[scripts/src]sound.lua
[src/emu/sound]315-5641.c* 315-5641.h* upd7759.c upd7759.h
[src/mess/drivers]segapico.c

trunk/scripts/src/sound.lua
r249157r249158
627627   files {
628628      MAME_DIR .. "src/emu/sound/upd7759.c",
629629      MAME_DIR .. "src/emu/sound/upd7759.h",
630      MAME_DIR .. "src/emu/sound/315-5641.c",
631      MAME_DIR .. "src/emu/sound/315-5641.h",
630632   }
631633end
632634
trunk/src/emu/sound/315-5641.c
r0r249158
1/* Sega 315-5641 / D77591 / 9442CA010 */
2
3#include "emu.h"
4#include "315-5641.h"
5
6const device_type SEGA_315_5641_PCM = &device_creator<sega_315_5641_pcm_device>;
7
8sega_315_5641_pcm_device::sega_315_5641_pcm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
9   : upd7759_device(mconfig, SEGA_315_5641_PCM, "315-5641 PCM", tag, owner, clock, "315-5641_pcm", __FILE__)
10{
11}
12
13void sega_315_5641_pcm_device::device_start()
14{
15   save_item(NAME(m_fifo_data), 0x40);
16   save_item(NAME(m_fifo_read));
17   save_item(NAME(m_fifo_write));
18
19   upd7759_device::device_start();
20}
21
22void sega_315_5641_pcm_device::advance_state()
23{
24   switch (m_state)
25   {
26      case STATE_DROP_DRQ:
27         if (m_rombase == NULL)
28         {
29            // Slave Mode: get data from FIFO buffer
30            UINT8 fiforead = (m_fifo_read + 1) & 0x3F;
31            if (fiforead != m_fifo_write)
32            {
33               m_fifo_in = m_fifo_data[fiforead];
34               m_fifo_read = fiforead;
35            }
36         }
37         break;
38   }
39
40   upd775x_device::advance_state();
41}
42
43
44WRITE8_MEMBER( sega_315_5641_pcm_device::port_w )
45{
46   if (m_rombase != NULL)
47   {
48      /* update the FIFO value */
49      m_fifo_in = data;
50   }
51   else
52   {
53      m_fifo_data[m_fifo_write++] = data;
54      m_fifo_write &= 0x3F;
55   }
56}
57
58
59UINT8 sega_315_5641_pcm_device::get_fifo_space()
60{
61   return (m_fifo_read - m_fifo_write) & 0x3F;
62}
63
64void sega_315_5641_pcm_device::device_reset()
65{
66   m_fifo_read          = 0x3F;
67   m_fifo_write         = 0x00;
68
69   upd775x_device::device_reset();
70}
No newline at end of file
trunk/src/emu/sound/315-5641.h
r0r249158
1/* Sega 315-5641 / D77591 / 9442CA010 */
2
3// this is the PICO sound chip, we are not sure if it's the same as a 7759 or not, it requires FIFO logic
4// which the 7759 does _not_ have but it is possible that is handled somewhere else on the PICO hardawre.
5
6#include "upd7759.h"
7
8
9class sega_315_5641_pcm_device : public upd7759_device
10{
11public:
12   sega_315_5641_pcm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
13
14   UINT8 get_fifo_space();
15   void advance_state();
16   DECLARE_WRITE8_MEMBER(port_w);
17
18   UINT8       m_fifo_data[0x40];
19   UINT8       m_fifo_read;   // last read offset (will read in m_fifo_read+1)
20   UINT8       m_fifo_write;   // write offset
21 
22protected:
23   // device-level overrides
24   virtual void device_start();
25   virtual void device_reset();
26
27
28};
29
30extern const device_type SEGA_315_5641_PCM;
No newline at end of file
trunk/src/emu/sound/upd7759.c
r249157r249158
143143#define FRAC_ONE        (1 << FRAC_BITS)
144144#define FRAC_MASK       (FRAC_ONE - 1)
145145
146/* chip states */
147enum
148{
149   STATE_IDLE,
150   STATE_DROP_DRQ,
151   STATE_START,
152   STATE_FIRST_REQ,
153   STATE_LAST_SAMPLE,
154   STATE_DUMMY1,
155   STATE_ADDR_MSB,
156   STATE_ADDR_LSB,
157   STATE_DUMMY2,
158   STATE_BLOCK_HEADER,
159   STATE_NIBBLE_COUNT,
160   STATE_NIBBLE_MSN,
161   STATE_NIBBLE_LSN
162};
163146
164147upd775x_device::upd775x_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
165148   : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
r249157r249158
204187{
205188}
206189
190
191upd7759_device::upd7759_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
192   : upd775x_device(mconfig, type, name, tag, owner, clock, shortname, source),
193      m_timer(NULL)
194{
195}
196
197
207198const device_type UPD7756 = &device_creator<upd7756_device>;
208199
209200upd7756_device::upd7756_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
trunk/src/emu/sound/upd7759.h
r249157r249158
55#ifndef __UPD7759_H__
66#define __UPD7759_H__
77
8/* chip states */
9enum
10{
11   STATE_IDLE,
12   STATE_DROP_DRQ,
13   STATE_START,
14   STATE_FIRST_REQ,
15   STATE_LAST_SAMPLE,
16   STATE_DUMMY1,
17   STATE_ADDR_MSB,
18   STATE_ADDR_LSB,
19   STATE_DUMMY2,
20   STATE_BLOCK_HEADER,
21   STATE_NIBBLE_COUNT,
22   STATE_NIBBLE_MSN,
23   STATE_NIBBLE_LSN
24};
825
926/* NEC uPD7759/55/56/P56/57/58 ADPCM Speech Processor */
1027
r249157r249158
2946
3047   DECLARE_WRITE_LINE_MEMBER( reset_w );
3148   DECLARE_READ_LINE_MEMBER( busy_r );
32   DECLARE_WRITE8_MEMBER( port_w );
49   virtual DECLARE_WRITE8_MEMBER( port_w );
3350   void postload();
3451
3552protected:
r249157r249158
86103   devcb_write_line m_drqcallback;
87104
88105   void update_adpcm(int data);
89   void advance_state();
106   virtual void advance_state();
90107};
91108
92109class upd7759_device : public upd775x_device
93110{
94111public:
95112   upd7759_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
113   upd7759_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
96114
97115   enum
98116   {
trunk/src/mess/drivers/segapico.c
r249157r249158
119119
120120#include "emu.h"
121121#include "includes/md_cons.h"
122#include "sound/upd7759.h"
122#include "sound/315-5641.h"
123123
124124
125125#define PICO_PENX   1
r249157r249158
130130public:
131131   pico_base_state(const machine_config &mconfig, device_type type, const char *tag)
132132      : md_cons_state(mconfig, type, tag),
133      m_upd7759(*this, "7759"),
133      m_sega_315_5641_pcm(*this, "315_5641"),
134134      m_io_page(*this, "PAGE"),
135135      m_io_pad(*this, "PAD"),
136136      m_io_penx(*this, "PENX"),
137137      m_io_peny(*this, "PENY")
138138   { }
139139
140   optional_device<upd7759_device> m_upd7759;
140   optional_device<sega_315_5641_pcm_device> m_sega_315_5641_pcm;
141141
142142   required_ioport m_io_page;
143143   required_ioport m_io_pad;
r249157r249158
251251
252252      case 8: // toy story 2 checks this for 0x3f (is that 'empty'?)
253253         /* Returns free bytes left in the PCM FIFO buffer */
254         retdata = 0x3f;
254         retdata = m_sega_315_5641_pcm->get_fifo_space();
255255         break;
256256      case 9:
257257      /*
258258         For reads, if bit 15 is cleared, it means PCM is 'busy' or
259259         something like that, as games sometimes wait for it to become 1.
260260      */
261         return (m_upd7759->busy_r()^1) << 15;
261         //   return (m_upd7759->busy_r()^1) << 15;
262         // The BUSY bit stays 1 as long as some PCM sound is playing.
263         // SMPS drivers check 800012 [byte] and clear the "prevent music PCM" byte when the READY bit gets set.
264         // If this is done incorrectly, the voices in Sonic Gameworld (J) are muted by the music's PCM drums.
265         return m_sega_315_5641_pcm->busy_r() << 15;
262266
263267
264268      case 7:
r249157r249158
279283WRITE_LINE_MEMBER(pico_base_state::sound_cause_irq)
280284{
281285//  printf("sound irq\n");
282   /* upd7759 callback */
286   /* sega_315_5641_pcm callback */
283287   m_maincpu->set_input_line(3, HOLD_LINE);
284288}
285289
r249157r249158
289293
290294   switch (offset)
291295   {
292      case 0x12/2: // guess
293         m_upd7759->reset_w(0);
294         m_upd7759->start_w(0);
295         m_upd7759->reset_w(1);
296         m_upd7759->start_w(1);
296      case 0x10/2:
297         if (mem_mask & 0xFF00)
298            m_sega_315_5641_pcm->port_w(space, 0, (data >> 8) & 0xFF);
299         if (mem_mask & 0x00FF)
300            m_sega_315_5641_pcm->port_w(space, 0, (data >> 0) & 0xFF);
301         break;
302       case 0x12/2: // guess
303         // Note about uPD7759 lines:
304         //   reset line: 1 - normal, 1->0 - reset chip, 0 - playback disabled
305         //   start line: 0->1 - start playback
306         if (mem_mask & 0xFF00)
307         {
308            // I assume that:
309            // value 8000 resets the FIFO? (always used with low reset line)
310            // value 0800 maps to the uPD7759's reset line (0 = reset, 1 = normal)
311            // value 4000 maps to the uPD7759's start line (0->1 = start)
312            m_sega_315_5641_pcm->reset_w((data >> 8) & 0x08);
313            m_sega_315_5641_pcm->start_w((data >> 8) & 0x40);
314            if (data & 0x4000)
315            {
316               // Somewhere between "Reset Off" and the first sample data,
317               // we need to send a few commands to make the sample stream work.
318               // Doing that when rising the "start" line seems to work fine.
319               m_sega_315_5641_pcm->port_w(space, 0, 0xFF);   // "Last Sample" value (must be >= 0x10)
320               m_sega_315_5641_pcm->port_w(space, 0, 0x00);   // Dummy 1
321               m_sega_315_5641_pcm->port_w(space, 0, 0x00);   // Addr MSB
322               m_sega_315_5641_pcm->port_w(space, 0, 0x00);   // Addr LSB
323            }
324         }
325         
326     
327         /*m_sega_315_5641_pcm->reset_w(0);
328         m_sega_315_5641_pcm->start_w(0);
329         m_sega_315_5641_pcm->reset_w(1);
330         m_sega_315_5641_pcm->start_w(1);
297331
298         if (mem_mask&0x00ff) m_upd7759->port_w(space,0,data&0xff);
299         if (mem_mask&0xff00) m_upd7759->port_w(space,0,(data>>8)&0xff);
332         if (mem_mask&0x00ff) m_sega_315_5641_pcm->port_w(space,0,data&0xff);
333         if (mem_mask&0xff00) m_sega_315_5641_pcm->port_w(space,0,(data>>8)&0xff);*/
300334
301335         break;
302336   }
r249157r249158
356390   MCFG_CPU_PROGRAM_MAP(pico_mem)
357391
358392   MCFG_DEVICE_REMOVE("genesis_snd_z80")
393   MCFG_DEVICE_REMOVE("ymsnd")
359394
360395   MCFG_MACHINE_START_OVERRIDE( pico_state, pico )
361396   MCFG_MACHINE_RESET_OVERRIDE( pico_base_state, ms_megadriv )
r249157r249158
363398   MCFG_PICO_CARTRIDGE_ADD("picoslot", pico_cart, NULL)
364399   MCFG_SOFTWARE_LIST_ADD("cart_list","pico")
365400
366   MCFG_SOUND_ADD("7759", UPD7759, UPD7759_STANDARD_CLOCK)
401   MCFG_SOUND_ADD("315_5641", SEGA_315_5641_PCM, UPD7759_STANDARD_CLOCK*2)
367402   MCFG_UPD7759_DRQ_CALLBACK(WRITELINE(pico_state,sound_cause_irq))
368   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.48)
369   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.48)
403   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.16)
404   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.16)
370405MACHINE_CONFIG_END
371406
372407static MACHINE_CONFIG_START( picopal, pico_state )
r249157r249158
376411   MCFG_CPU_PROGRAM_MAP(pico_mem)
377412
378413   MCFG_DEVICE_REMOVE("genesis_snd_z80")
414   MCFG_DEVICE_REMOVE("ymsnd")
379415
380416   MCFG_MACHINE_START_OVERRIDE( pico_state, pico )
381417   MCFG_MACHINE_RESET_OVERRIDE( pico_base_state, ms_megadriv )
r249157r249158
383419   MCFG_PICO_CARTRIDGE_ADD("picoslot", pico_cart, NULL)
384420   MCFG_SOFTWARE_LIST_ADD("cart_list","pico")
385421
386   MCFG_SOUND_ADD("7759", UPD7759, UPD7759_STANDARD_CLOCK)
422   MCFG_SOUND_ADD("315_5641", SEGA_315_5641_PCM, UPD7759_STANDARD_CLOCK*2)
387423   MCFG_UPD7759_DRQ_CALLBACK(WRITELINE(pico_state,sound_cause_irq))
388   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.48)
389   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.48)
424   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.16)
425   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.16)
390426MACHINE_CONFIG_END
391427
392428
r249157r249158
552588   m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa15000, 0xa150ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a15),(base_md_cart_slot_device*)m_picocart), write16_delegate(FUNC(base_md_cart_slot_device::write_a15),(base_md_cart_slot_device*)m_picocart));
553589   m_maincpu->space(AS_PROGRAM).install_write_handler(0xa14000, 0xa14003, write16_delegate(FUNC(base_md_cart_slot_device::write_tmss_bank),(base_md_cart_slot_device*)m_picocart));
554590
555   m_upd7759->reset_w(0);
556   m_upd7759->start_w(0);
557   m_upd7759->reset_w(1);
558   m_upd7759->start_w(1);
591   m_sega_315_5641_pcm->reset_w(0);
592   m_sega_315_5641_pcm->start_w(0);
593   m_sega_315_5641_pcm->reset_w(1);
594   m_sega_315_5641_pcm->start_w(1);
559595
560596}
561597
r249157r249158
566602   MCFG_CPU_PROGRAM_MAP(copera_mem)
567603
568604   MCFG_DEVICE_REMOVE("genesis_snd_z80")
605   MCFG_DEVICE_REMOVE("ymsnd")
569606
570607   MCFG_MACHINE_START_OVERRIDE( copera_state, copera )
571608   MCFG_MACHINE_RESET_OVERRIDE( pico_base_state, ms_megadriv )
r249157r249158
573610   MCFG_COPERA_CARTRIDGE_ADD("coperaslot", copera_cart, NULL)
574611   MCFG_SOFTWARE_LIST_ADD("cart_list","copera")
575612
576   MCFG_SOUND_ADD("7759", UPD7759, UPD7759_STANDARD_CLOCK)
613   MCFG_SOUND_ADD("315_5641", SEGA_315_5641_PCM, UPD7759_STANDARD_CLOCK)
577614   MCFG_UPD7759_DRQ_CALLBACK(WRITELINE(copera_state,sound_cause_irq))
578   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.48)
579   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.48)
615   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.16)
616   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.16)
580617MACHINE_CONFIG_END
581618
582619


Previous 199869 Revisions Next


© 1997-2024 The MAME Team