summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/audio/starwars.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/audio/starwars.c')
-rw-r--r--trunk/src/mame/audio/starwars.c152
1 files changed, 152 insertions, 0 deletions
diff --git a/trunk/src/mame/audio/starwars.c b/trunk/src/mame/audio/starwars.c
new file mode 100644
index 00000000000..21aac934084
--- /dev/null
+++ b/trunk/src/mame/audio/starwars.c
@@ -0,0 +1,152 @@
+/***************************************************************************
+
+ Atari Star Wars hardware
+
+ This file is Copyright Steve Baines.
+ Modified by Frank Palazzolo for sound support
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cpu/m6809/m6809.h"
+#include "sound/tms5220.h"
+#include "includes/starwars.h"
+
+
+
+
+
+SOUND_START( starwars )
+{
+ starwars_state *state = machine.driver_data<starwars_state>();
+ state->m_riot = machine.device("riot");
+}
+
+
+/*************************************
+ *
+ * RIOT interfaces
+ *
+ *************************************/
+
+static READ8_DEVICE_HANDLER( r6532_porta_r )
+{
+ /* Configured as follows: */
+ /* d7 (in) Main Ready Flag */
+ /* d6 (in) Sound Ready Flag */
+ /* d5 (out) Mute Speech */
+ /* d4 (in) Not Sound Self Test */
+ /* d3 (out) Hold Main CPU in Reset? */
+ /* + enable delay circuit? */
+ /* d2 (in) TMS5220 Not Ready */
+ /* d1 (out) TMS5220 Not Read */
+ /* d0 (out) TMS5220 Not Write */
+ /* Note: bit 4 is always set to avoid sound self test */
+ UINT8 olddata = riot6532_porta_in_get(device);
+
+ return (olddata & 0xc0) | 0x10 | (tms5220_readyq_r(device->machine().device("tms")) << 2);
+}
+
+
+static WRITE8_DEVICE_HANDLER( r6532_porta_w )
+{
+ /* handle 5220 read */
+ tms5220_rsq_w(device, (data & 2)>>1);
+ /* handle 5220 write */
+ tms5220_wsq_w(device, (data & 1)>>0);
+}
+
+
+static WRITE_LINE_DEVICE_HANDLER( snd_interrupt )
+{
+ cputag_set_input_line(device->machine(), "audiocpu", M6809_IRQ_LINE, state);
+}
+
+
+const riot6532_interface starwars_riot6532_intf =
+{
+ DEVCB_HANDLER(r6532_porta_r),
+ DEVCB_DEVICE_HANDLER("tms", tms5220_status_r),
+ DEVCB_DEVICE_HANDLER("tms", r6532_porta_w),
+ DEVCB_DEVICE_HANDLER("tms", tms5220_data_w),
+ DEVCB_LINE(snd_interrupt)
+};
+
+
+
+
+/*************************************
+ *
+ * Sound CPU to/from main CPU
+ *
+ *************************************/
+
+static TIMER_CALLBACK( sound_callback )
+{
+ starwars_state *state = machine.driver_data<starwars_state>();
+ riot6532_porta_in_set(state->m_riot, 0x40, 0x40);
+ state->m_main_data = param;
+ machine.scheduler().boost_interleave(attotime::zero, attotime::from_usec(100));
+}
+
+
+READ8_HANDLER( starwars_sin_r )
+{
+ starwars_state *state = space->machine().driver_data<starwars_state>();
+ riot6532_porta_in_set(state->m_riot, 0x00, 0x80);
+ return state->m_sound_data;
+}
+
+
+WRITE8_HANDLER( starwars_sout_w )
+{
+ space->machine().scheduler().synchronize(FUNC(sound_callback), data);
+}
+
+
+
+/*************************************
+ *
+ * Main CPU to/from source CPU
+ *
+ *************************************/
+
+READ8_HANDLER( starwars_main_read_r )
+{
+ starwars_state *state = space->machine().driver_data<starwars_state>();
+ riot6532_porta_in_set(state->m_riot, 0x00, 0x40);
+ return state->m_main_data;
+}
+
+
+READ8_HANDLER( starwars_main_ready_flag_r )
+{
+ starwars_state *state = space->machine().driver_data<starwars_state>();
+ return riot6532_porta_in_get(state->m_riot) & 0xc0; /* only upper two flag bits mapped */
+}
+
+static TIMER_CALLBACK( main_callback )
+{
+ starwars_state *state = machine.driver_data<starwars_state>();
+ if (riot6532_porta_in_get(state->m_riot) & 0x80)
+ logerror("Sound data not read %x\n",state->m_sound_data);
+
+ riot6532_porta_in_set(state->m_riot, 0x80, 0x80);
+ state->m_sound_data = param;
+ machine.scheduler().boost_interleave(attotime::zero, attotime::from_usec(100));
+}
+
+WRITE8_HANDLER( starwars_main_wr_w )
+{
+ space->machine().scheduler().synchronize(FUNC(main_callback), data);
+}
+
+
+WRITE8_HANDLER( starwars_soundrst_w )
+{
+ starwars_state *state = space->machine().driver_data<starwars_state>();
+ riot6532_porta_in_set(state->m_riot, 0x00, 0xc0);
+
+ /* reset sound CPU here */
+ cputag_set_input_line(space->machine(), "audiocpu", INPUT_LINE_RESET, PULSE_LINE);
+}