blob: a2cdf1ddc69fa1b34dabe06914b88f1ba93f14d1 (
plain) (
tree)
|
|
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/***************************************************************************
Cyberball 68000 sound simulator
****************************************************************************/
#include "emu.h"
#include "machine/atarigen.h"
#include "includes/cyberbal.h"
void cyberbal_state::cyberbal_sound_reset()
{
/* reset the sound system */
membank("soundbank")->set_entry(0);
m_fast_68k_int = m_io_68k_int = 0;
m_sound_data_from_68k = m_sound_data_from_6502 = 0;
m_sound_data_from_68k_ready = m_sound_data_from_6502_ready = 0;
}
/*************************************
*
* 6502 Sound Interface
*
*************************************/
READ8_MEMBER(cyberbal_state::special_port3_r)
{
int temp = ioport("jsa:JSAII")->read();
if (!(ioport("IN0")->read() & 0x8000)) temp ^= 0x80;
if (m_soundcomm->main_to_sound_ready()) temp ^= 0x40;
if (m_soundcomm->sound_to_main_ready()) temp ^= 0x20;
return temp;
}
READ8_MEMBER(cyberbal_state::sound_6502_stat_r)
{
int temp = 0xff;
if (m_sound_data_from_6502_ready) temp ^= 0x80;
if (m_sound_data_from_68k_ready) temp ^= 0x40;
return temp;
}
WRITE8_MEMBER(cyberbal_state::sound_bank_select_w)
{
membank("soundbank")->set_entry((data >> 6) & 3);
machine().bookkeeping().coin_counter_w(1, (data >> 5) & 1);
machine().bookkeeping().coin_counter_w(0, (data >> 4) & 1);
m_daccpu->set_input_line(INPUT_LINE_RESET, (data & 0x08) ? CLEAR_LINE : ASSERT_LINE);
m_ymsnd->reset_w(BIT(data, 0));
}
READ8_MEMBER(cyberbal_state::sound_68k_6502_r)
{
m_sound_data_from_68k_ready = 0;
return m_sound_data_from_68k;
}
WRITE8_MEMBER(cyberbal_state::sound_68k_6502_w)
{
m_sound_data_from_6502 = data;
m_sound_data_from_6502_ready = 1;
if (!m_io_68k_int)
{
m_io_68k_int = 1;
update_sound_68k_interrupts();
}
}
/*************************************
*
* 68000 Sound Interface
*
*************************************/
void cyberbal_state::update_sound_68k_interrupts()
{
m_daccpu->set_input_line(6, m_fast_68k_int ? ASSERT_LINE : CLEAR_LINE);
m_daccpu->set_input_line(2, m_io_68k_int ? ASSERT_LINE : CLEAR_LINE);
}
INTERRUPT_GEN_MEMBER(cyberbal_state::sound_68k_irq_gen)
{
if (!m_fast_68k_int)
{
m_fast_68k_int = 1;
update_sound_68k_interrupts();
}
}
WRITE16_MEMBER(cyberbal_state::io_68k_irq_ack_w)
{
if (m_io_68k_int)
{
m_io_68k_int = 0;
update_sound_68k_interrupts();
}
}
READ16_MEMBER(cyberbal_state::sound_68k_r)
{
int temp = (m_sound_data_from_6502 << 8) | 0xff;
m_sound_data_from_6502_ready = 0;
if (m_sound_data_from_6502_ready) temp ^= 0x08;
if (m_sound_data_from_68k_ready) temp ^= 0x04;
return temp;
}
WRITE16_MEMBER(cyberbal_state::sound_68k_w)
{
if (ACCESSING_BITS_8_15)
{
m_sound_data_from_68k = (data >> 8) & 0xff;
m_sound_data_from_68k_ready = 1;
}
}
WRITE16_MEMBER(cyberbal_state::sound_68k_dac_w)
{
//int clip = BIT(data, 15);
//int off0b = BIT(data, 13) | BIT(data, 14);
//int off4b = BIT(data, 13) & BIT(data, 14);
uint16 sample = ((data >> 3) & 0x800) | ((data >> 2) & 0x7ff);
if (offset & 8)
m_ldac->write(sample);
else
m_rdac->write(sample);
if (m_fast_68k_int)
{
m_fast_68k_int = 0;
update_sound_68k_interrupts();
}
}
|