Previous 199869 Revisions Next

r40644 Tuesday 8th September, 2015 at 14:09:43 UTC by David Haywood
Sega Pico PCM improvements [ValleyBell]

as the pull request seems to have gone dead I refactored his changes into a new device derived from the 7759 rather than adding the Fifo into the 7759 (due to Aaron saying it doesn't exist there)

it's possible the custom chip that Pico uses has said logic built in somehow as it's not a plain 7759 afaik.
[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
r249155r249156
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
r0r249156
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
r0r249156
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
r249155r249156
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),
r249155r249156
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
r249155r249156
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
r249155r249156
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:
r249155r249156
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
r249155r249156
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
r249155r249156
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;
r249155r249156
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:
r249155r249156
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
r249155r249156
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   }
r249155r249156
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 )
r249155r249156
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 )
r249155r249156
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 )
r249155r249156
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
r249155r249156
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
r249155r249156
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 )
r249155r249156
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