cyberbal: Convert sound board into JSA-derived device

This commit is contained in:
AJR 2020-04-20 12:26:19 -04:00
parent f5666165ba
commit d4cdfa7665
5 changed files with 435 additions and 292 deletions

332
src/mame/audio/atarisac.cpp Normal file
View File

@ -0,0 +1,332 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/***************************************************************************
atarisac.cpp
Functions to emulate the Atari "SAC" audio board
***************************************************************************/
#include "emu.h"
#include "audio/atarisac.h"
#include "cpu/m68000/m68000.h"
#include "sound/volt_reg.h"
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
DEFINE_DEVICE_TYPE(ATARI_SAC, atari_sac_device, "atarisac", "Atari SAC Sound Board")
//**************************************************************************
// MEMORY MAPS
//**************************************************************************
/*************************************
*
* Sound CPU memory handlers
*
*************************************/
void atari_sac_device::sac_6502_map(address_map &map)
{
map(0x0000, 0x1fff).ram();
map(0x2000, 0x2001).mirror(0x7fe).rw(m_ym2151, FUNC(ym2151_device::read), FUNC(ym2151_device::write));
map(0x2800, 0x2800).mirror(0x3f9).w(m_datin, FUNC(generic_latch_8_device::write));
map(0x2802, 0x2802).mirror(0x3f9).rw(m_soundcomm, FUNC(atari_sound_comm_device::sound_irq_ack_r), FUNC(atari_sound_comm_device::sound_irq_ack_w));
map(0x2804, 0x2804).mirror(0x3f9).w(m_soundcomm, FUNC(atari_sound_comm_device::sound_response_w));
map(0x2806, 0x2806).mirror(0x3f9).w(FUNC(atari_sac_device::wrio_w));
map(0x2c00, 0x2c00).mirror(0x3f9).r(m_soundcomm, FUNC(atari_sound_comm_device::sound_command_r));
map(0x2c02, 0x2c02).mirror(0x3f9).r(FUNC(atari_sac_device::rdio_r));
map(0x2c04, 0x2c04).mirror(0x3f9).r(m_datout, FUNC(generic_latch_8_device::read));
map(0x2c06, 0x2c06).mirror(0x3f9).r(FUNC(atari_sac_device::pstat_r));
map(0x3000, 0x3fff).bankr("cpubank");
map(0x4000, 0xffff).rom();
}
/*************************************
*
* 68000 Sound CPU memory handlers
*
*************************************/
void atari_sac_device::sac_68k_map(address_map &map)
{
map.global_mask(0x87ffff);
map(0x000000, 0x03ffff).rom();
map(0x860000, 0x860001).mirror(0x187fe).r(FUNC(atari_sac_device::rdp8_r));
map(0x860800, 0x860800).mirror(0x187fe).w(m_datout, FUNC(generic_latch_8_device::write));
map(0x861000, 0x861000).mirror(0x187fe).w(m_datin, FUNC(generic_latch_8_device::acknowledge_w));
map(0x861800, 0x861801).mirror(0x187ee).select(0x10).w(FUNC(atari_sac_device::dac_w));
map(0x864000, 0x867fff).mirror(0x18000).ram(); // 8Kx8x2
}
//**************************************************************************
// I/O PORT DEFINITIONS
//**************************************************************************
INPUT_PORTS_START( sac_ioports )
PORT_START("SAC")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN4 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN3 )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("soundcomm", atari_sound_comm_device, sound_to_main_ready) // output buffer full
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER("soundcomm", atari_sound_comm_device, main_to_sound_ready) // input buffer full
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_DEVICE_MEMBER(DEVICE_SELF, atari_sac_device, main_test_read_line) // self test
INPUT_PORTS_END
//**************************************************************************
// SAC-SPECIFIC IMPLEMENTATION
//**************************************************************************
//-------------------------------------------------
// atari_sac_device: Constructor
//-------------------------------------------------
atari_sac_device::atari_sac_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: atari_jsa_base_device(mconfig, ATARI_SAC, tag, owner, clock, 2)
, m_daccpu(*this, "dac")
, m_datin(*this, "datin")
, m_datout(*this, "datout")
, m_rdac(*this, "rdac")
, m_ldac(*this, "ldac")
, m_inputs(*this, "SAC")
, m_68k_reset(false)
, m_10k_int(false)
{
}
//-------------------------------------------------
// rdio_r: Handle reads from the general I/O
// port on a SAC board
//-------------------------------------------------
u8 atari_sac_device::rdio_r()
{
//
// 0x80 = self test
// 0x40 = NMI line state (active low)
// 0x20 = sound output full
// 0x10 = +5V
// 0x08 = coin 4
// 0x04 = coin 3
// 0x02 = coin 2
// 0x01 = coin 1
//
u8 result = m_inputs->read();
if (!m_test_read_cb())
result ^= 0x80;
return result;
}
//-------------------------------------------------
// wrio_w: Handle writes to the general I/O
// port on a SAC board
//-------------------------------------------------
void atari_sac_device::wrio_w(u8 data)
{
//
// 0xc0 = bank address
// 0x20 = coin counter 2
// 0x10 = coin counter 1
// 0x08 = 68K reset (active low)
// 0x06 = not used
// 0x01 = YM2151 reset (active low)
//
// update the bank
m_cpu_bank->set_entry(BIT(data, 6, 2));
// coin counters
machine().bookkeeping().coin_counter_w(1, BIT(data, 5));
machine().bookkeeping().coin_counter_w(0, BIT(data, 4));
// reset the 68K
m_68k_reset = !BIT(data, 3);
m_daccpu->set_input_line(INPUT_LINE_RESET, BIT(data, 3) ? CLEAR_LINE : ASSERT_LINE);
// reset the YM2151
m_ym2151->reset_w(BIT(data, 0));
}
//-------------------------------------------------
// pstat_r: Check internal communications status
// from the 6502 side
//-------------------------------------------------
u8 atari_sac_device::pstat_r()
{
int temp = 0xff;
if (m_datin->pending_r()) temp ^= 0x80;
if (m_datout->pending_r()) temp ^= 0x40;
if (m_68k_reset) temp ^= 0x20;
return temp;
}
//-------------------------------------------------
// int_10k_gen: Generate 10kHz interrupt for
// driving the DAC
//-------------------------------------------------
INTERRUPT_GEN_MEMBER(atari_sac_device::int_10k_gen)
{
if (!m_10k_int)
{
m_10k_int = true;
m_daccpu->set_input_line(M68K_IRQ_6, ASSERT_LINE);
}
}
//-------------------------------------------------
// rdp8_r: Read data sent by the 6502 and check
// communications status
//-------------------------------------------------
u16 atari_sac_device::rdp8_r()
{
int temp = (m_datin->read() << 8) | 0xff;
if (m_datin->pending_r()) temp ^= 0x08;
if (m_datout->pending_r()) temp ^= 0x04;
return temp;
}
//-------------------------------------------------
// dac_w: Write a sample to one of the DAC
// channels
//-------------------------------------------------
void atari_sac_device::dac_w(offs_t offset, u16 data)
{
//int clip = BIT(data, 15);
//int off0b = BIT(data, 13) | BIT(data, 14);
//int off4b = BIT(data, 13) & BIT(data, 14);
u16 sample = ((data >> 3) & 0x800) | ((data >> 2) & 0x7ff);
if (offset & 8)
m_ldac->write(sample);
else
m_rdac->write(sample);
if (m_10k_int)
{
m_10k_int = false;
m_daccpu->set_input_line(M68K_IRQ_6, CLEAR_LINE);
}
}
//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
void atari_sac_device::device_add_mconfig(machine_config &config)
{
// basic machine hardware
M6502(config, m_jsacpu, 14.318181_MHz_XTAL/8);
m_jsacpu->set_addrmap(AS_PROGRAM, &atari_sac_device::sac_6502_map);
m_jsacpu->set_periodic_int("soundcomm", FUNC(atari_sound_comm_device::sound_irq_gen), attotime::from_hz(ATARI_CLOCK_14MHz/4/4/16/16/14));
M68000(config, m_daccpu, 14.318181_MHz_XTAL/2);
m_daccpu->set_addrmap(AS_PROGRAM, &atari_sac_device::sac_68k_map);
m_daccpu->set_periodic_int(FUNC(atari_sac_device::int_10k_gen), attotime::from_hz(10000));
// TODO: determine exact frequency (controlled by a PAL16R4)
GENERIC_LATCH_8(config, m_datin);
m_datin->data_pending_callback().set_inputline(m_daccpu, M68K_IRQ_4);
m_datin->set_separate_acknowledge(true);
GENERIC_LATCH_8(config, m_datout);
// sound hardware
ATARI_SOUND_COMM(config, m_soundcomm, m_jsacpu)
.int_callback().set(FUNC(atari_sac_device::main_int_write_line));
YM2151(config, m_ym2151, 14.318181_MHz_XTAL/4);
m_ym2151->irq_handler().set(m_soundcomm, FUNC(atari_sound_comm_device::ym2151_irq_gen));
m_ym2151->port_write_handler().set(FUNC(atari_sac_device::ym2151_port_w));
m_ym2151->add_route(0, *this, 0.60, AUTO_ALLOC_INPUT, 0);
m_ym2151->add_route(1, *this, 0.60, AUTO_ALLOC_INPUT, 1);
// FIXME: there is actually only one DAC (plus some analog switches)
AM6012(config, m_rdac).add_route(ALL_OUTPUTS, *this, 0.5, AUTO_ALLOC_INPUT, 1); // AM6012.6j
AM6012(config, m_ldac).add_route(ALL_OUTPUTS, *this, 0.5, AUTO_ALLOC_INPUT, 0); // AM6012.6j
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
}
//-------------------------------------------------
// device_input_ports - return a pointer to
// the device's I/O ports
//-------------------------------------------------
ioport_constructor atari_sac_device::device_input_ports() const
{
return INPUT_PORTS_NAME( sac_ioports );
}
//-------------------------------------------------
// device_start: Start up the device
//-------------------------------------------------
void atari_sac_device::device_start()
{
// call the parent
atari_jsa_base_device::device_start();
// save states
save_item(NAME(m_68k_reset));
save_item(NAME(m_10k_int));
}
//-------------------------------------------------
// device_reset: Reset the device
//-------------------------------------------------
void atari_sac_device::device_reset()
{
// call the parent
atari_jsa_base_device::device_reset();
// hold 68K in reset
m_68k_reset = true;
m_daccpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
}
//-------------------------------------------------
// update_all_volumes: Update volumes for all
// chips
//-------------------------------------------------
void atari_sac_device::update_all_volumes()
{
// TODO: CT1 and CT2 control LPFs on left and right channels
}

79
src/mame/audio/atarisac.h Normal file
View File

@ -0,0 +1,79 @@
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/***************************************************************************
atarisac.h
Functions to emulate the Atari "SAC" audio board
***************************************************************************/
#ifndef MAME_AUDIO_ATARI_SAC_H
#define MAME_AUDIO_ATARI_SAC_H
#pragma once
#include "audio/atarijsa.h"
#include "machine/gen_latch.h"
#include "sound/dac.h"
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
DECLARE_DEVICE_TYPE(ATARI_SAC, atari_sac_device)
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> atari_sac_device
class atari_sac_device : public atari_jsa_base_device
{
public:
// construction/destruction
atari_sac_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
protected:
// device level overrides
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
virtual void device_start() override;
virtual void device_reset() override;
// internal helpers
virtual void update_all_volumes() override;
private:
// read/write handlers
u8 rdio_r();
void wrio_w(u8 data);
u8 pstat_r();
u16 rdp8_r();
void dac_w(offs_t offset, u16 data);
// misc. helpers
INTERRUPT_GEN_MEMBER(int_10k_gen);
// address maps
void sac_6502_map(address_map &map);
void sac_68k_map(address_map &map);
// devices
required_device<cpu_device> m_daccpu;
required_device<generic_latch_8_device> m_datin;
required_device<generic_latch_8_device> m_datout;
required_device<dac_word_interface> m_rdac;
required_device<dac_word_interface> m_ldac;
required_ioport m_inputs;
// internal state
bool m_68k_reset;
bool m_10k_int;
};
#endif // MAME_AUDIO_ATARI_SAC_H

View File

@ -1,153 +0,0 @@
// 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();
}
}

View File

@ -65,15 +65,6 @@ void cyberbal_state::video_int_ack_w(uint16_t data)
void cyberbal_state::machine_start()
{
cyberbal_base_state::machine_start();
save_item(NAME(m_fast_68k_int));
save_item(NAME(m_io_68k_int));
save_item(NAME(m_sound_data_from_68k));
save_item(NAME(m_sound_data_from_6502));
save_item(NAME(m_sound_data_from_68k_ready));
save_item(NAME(m_sound_data_from_6502_ready));
membank("soundbank")->configure_entries(0, 4, memregion("audiocpu")->base(), 0x1000);
}
@ -81,8 +72,6 @@ void cyberbal_state::machine_reset()
{
cyberbal_base_state::machine_reset();
cyberbal_sound_reset();
/* Extra CPU (second M68k) doesn't run until reset */
m_extracpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
}
@ -133,12 +122,12 @@ void cyberbal_state::main_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0xfc0000, 0xfc0fff).rw("eeprom", FUNC(eeprom_parallel_28xx_device::read), FUNC(eeprom_parallel_28xx_device::write)).umask16(0x00ff);
map(0xfc8000, 0xfcffff).r(m_soundcomm, FUNC(atari_sound_comm_device::main_response_r)).umask16(0xff00);
map(0xfc8000, 0xfcffff).r(m_sac, FUNC(atari_sac_device::main_response_r)).umask16(0xff00);
map(0xfd0000, 0xfd1fff).w("eeprom", FUNC(eeprom_parallel_28xx_device::unlock_write16));
map(0xfd2000, 0xfd3fff).w(m_soundcomm, FUNC(atari_sound_comm_device::sound_reset_w));
map(0xfd2000, 0xfd3fff).w(m_sac, FUNC(atari_sac_device::sound_reset_w));
map(0xfd4000, 0xfd5fff).w("watchdog", FUNC(watchdog_timer_device::reset16_w));
map(0xfd6000, 0xfd7fff).w(FUNC(cyberbal_state::p2_reset_w));
map(0xfd8000, 0xfd9fff).w(m_soundcomm, FUNC(atari_sound_comm_device::main_command_w)).umask16(0xff00);
map(0xfd8000, 0xfd9fff).w(m_sac, FUNC(atari_sac_device::main_command_w)).umask16(0xff00);
map(0xfe0000, 0xfe0fff).portr("IN0");
map(0xfe1000, 0xfe1fff).portr("IN1");
map(0xfe8000, 0xfe8fff).ram().w("rpalette", FUNC(palette_device::write16)).share("rpalette");
@ -185,48 +174,6 @@ void cyberbal_state::extra_map(address_map &map)
/*************************************
*
* Sound CPU memory handlers
*
*************************************/
void cyberbal_state::sound_map(address_map &map)
{
map(0x0000, 0x1fff).ram();
map(0x2000, 0x2001).rw(m_ymsnd, FUNC(ym2151_device::read), FUNC(ym2151_device::write));
map(0x2800, 0x2801).w(FUNC(cyberbal_state::sound_68k_6502_w));
map(0x2802, 0x2803).rw(m_soundcomm, FUNC(atari_sound_comm_device::sound_irq_ack_r), FUNC(atari_sound_comm_device::sound_irq_ack_w));
map(0x2804, 0x2805).w(m_soundcomm, FUNC(atari_sound_comm_device::sound_response_w));
map(0x2806, 0x2807).w(FUNC(cyberbal_state::sound_bank_select_w));
map(0x2c00, 0x2c01).r(m_soundcomm, FUNC(atari_sound_comm_device::sound_command_r));
map(0x2c02, 0x2c03).r(FUNC(cyberbal_state::special_port3_r));
map(0x2c04, 0x2c05).r(FUNC(cyberbal_state::sound_68k_6502_r));
map(0x2c06, 0x2c07).r(FUNC(cyberbal_state::sound_6502_stat_r));
map(0x3000, 0x3fff).bankr("soundbank");
map(0x4000, 0xffff).rom();
}
/*************************************
*
* 68000 Sound CPU memory handlers
*
*************************************/
void cyberbal_state::sound_68k_map(address_map &map)
{
map(0x000000, 0x03ffff).rom();
map(0xff8000, 0xff87ff).r(FUNC(cyberbal_state::sound_68k_r));
map(0xff8800, 0xff8fff).w(FUNC(cyberbal_state::sound_68k_w));
map(0xff9000, 0xff97ff).w(FUNC(cyberbal_state::io_68k_irq_ack_w));
map(0xff9800, 0xff9fff).w(FUNC(cyberbal_state::sound_68k_dac_w));
map(0xfff000, 0xffffff).ram();
}
/*************************************
*
* 2-player main CPU memory handlers
@ -271,7 +218,7 @@ static INPUT_PORTS_START( cyberbal )
PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4)
PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_ATARI_COMM_MAIN_TO_SOUND_READY("soundcomm")
PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_ATARI_JSA_MAIN_TO_SOUND_READY("sac")
PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(3)
PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(3)
PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(3)
@ -300,17 +247,6 @@ static INPUT_PORTS_START( cyberbal )
PORT_START("IN2") /* fake port for screen switching */
PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED )
/* 2008-06 FP: I tag this as JSAII (even if it's not) to simplify cyberbal_special_port3_r */
PORT_START("jsa:JSAII") /* audio board port */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN4 )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN3 )
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_CUSTOM ) /* output buffer full */
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_CUSTOM ) /* input buffer full */
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_CUSTOM ) /* self test */
INPUT_PORTS_END
@ -408,17 +344,9 @@ void cyberbal_state::cyberbal_base(machine_config &config)
M68000(config, m_maincpu, ATARI_CLOCK_14MHz/2);
m_maincpu->set_addrmap(AS_PROGRAM, &cyberbal_state::main_map);
M6502(config, m_audiocpu, ATARI_CLOCK_14MHz/8);
m_audiocpu->set_addrmap(AS_PROGRAM, &cyberbal_state::sound_map);
m_audiocpu->set_periodic_int("soundcomm", FUNC(atari_sound_comm_device::sound_irq_gen), attotime::from_hz(ATARI_CLOCK_14MHz/4/4/16/16/14));
M68000(config, m_extracpu, ATARI_CLOCK_14MHz/2);
m_extracpu->set_addrmap(AS_PROGRAM, &cyberbal_state::extra_map);
M68000(config, m_daccpu, ATARI_CLOCK_14MHz/2);
m_daccpu->set_addrmap(AS_PROGRAM, &cyberbal_state::sound_68k_map);
m_daccpu->set_periodic_int(FUNC(cyberbal_state::sound_68k_irq_gen), attotime::from_hz(10000));
config.set_maximum_quantum(attotime::from_hz(600));
TIMER(config, "scantimer").configure_scanline(FUNC(cyberbal_state::scanline_update), m_lscreen, 0, 8);
@ -465,23 +393,14 @@ void cyberbal_state::cyberbal_base(machine_config &config)
m_rscreen->set_palette("rpalette");
/* sound hardware */
ATARI_SOUND_COMM(config, m_soundcomm, "audiocpu")
.int_callback().set_inputline("maincpu", M68K_IRQ_1);
SPEAKER(config, "lspeaker").front_left();
SPEAKER(config, "rspeaker").front_right();
YM2151(config, m_ymsnd, ATARI_CLOCK_14MHz/4);
m_ymsnd->irq_handler().set("soundcomm", FUNC(atari_sound_comm_device::ym2151_irq_gen));
m_ymsnd->add_route(0, "lspeaker", 0.60);
m_ymsnd->add_route(1, "rspeaker", 0.60);
AM6012(config, m_rdac, 0).add_route(ALL_OUTPUTS, "rspeaker", 0.5); // AM6012.6j
AM6012(config, m_ldac, 0).add_route(ALL_OUTPUTS, "lspeaker", 0.5); // AM6012.6j
voltage_regulator_device &vref(VOLTAGE_REGULATOR(config, "vref", 0));
vref.add_route(0, "rdac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "rdac", -1.0, DAC_VREF_NEG_INPUT);
vref.add_route(0, "ldac", 1.0, DAC_VREF_POS_INPUT);
vref.add_route(0, "ldac", -1.0, DAC_VREF_NEG_INPUT);
ATARI_SAC(config, m_sac);
m_sac->main_int_cb().set_inputline(m_maincpu, M68K_IRQ_1);
m_sac->test_read_cb().set_ioport("IN0").bit(15);
m_sac->add_route(0, "lspeaker", 1.0);
m_sac->add_route(1, "rspeaker", 1.0);
}
void cyberbal_state::cyberbal(machine_config &config)
@ -554,7 +473,7 @@ ROM_START( cyberbal )
ROM_LOAD16_BYTE( "136064-4123.1m", 0x000000, 0x010000, CRC(fb872740) SHA1(15e6721d466fe56d7c97c6801e214b32803a0a0d) )
ROM_LOAD16_BYTE( "136064-4124.1kl", 0x000001, 0x010000, CRC(87babad9) SHA1(acdc6b5976445e203de19eb03697e307fe6da77d) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for 6502 code */
ROM_REGION( 0x10000, "sac:cpu", 0 ) /* 64k for 6502 code */
ROM_LOAD( "136064-2131.2f", 0x000000, 0x010000, CRC(bd7e3d84) SHA1(f87878042fc79fa3883136b31ac15ddc22c6023c) )
ROM_REGION( 0x40000, "extra", 0 ) /* 4*64k for 68000 code */
@ -563,7 +482,7 @@ ROM_START( cyberbal )
ROM_LOAD16_BYTE( "136064-1129.1cd", 0x020000, 0x010000, CRC(db11d2f0) SHA1(da9f49af533cbc732b17699040c7930070a90644) )
ROM_LOAD16_BYTE( "136064-1130.3b", 0x020001, 0x010000, CRC(fd86b8aa) SHA1(46310efed762632ed176a08aaec41e48aad41cc1) )
ROM_REGION16_BE( 0x40000, "dac", 0 ) /* 256k for 68000 sound code */
ROM_REGION16_BE( 0x40000, "sac:dac", 0 ) /* 256k for 68000 sound code */
ROM_LOAD16_BYTE( "136064-1132.3cd", 0x000000, 0x010000, CRC(ca5ce8d8) SHA1(69dc83d43d8c9dc7ce3207e70f48fcfc5ddda0cc) )
ROM_LOAD16_BYTE( "136064-1133.1b", 0x000001, 0x010000, CRC(ffeb8746) SHA1(0d8d28b2d997ff3cf01b4ef25b75fa5a69754af4) )
ROM_LOAD16_BYTE( "136064-1134.1cd", 0x020000, 0x010000, CRC(bcbd4c00) SHA1(f0bfcdf0b5491e15872b543e99b834ae384cbf18) )
@ -614,7 +533,7 @@ ROM_START( cyberbal2 )
ROM_LOAD16_BYTE( "136064-2123.1m", 0x000000, 0x010000, CRC(502676e8) SHA1(c0f1f1ce50d3df21cb81244268faef6c303cdfab) )
ROM_LOAD16_BYTE( "136064-2124.1kl", 0x000001, 0x010000, CRC(30f55915) SHA1(ab93ec46f282ab9a0cd47c989537a7e036975e3f) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for 6502 code */
ROM_REGION( 0x10000, "sac:cpu", 0 ) /* 64k for 6502 code */
ROM_LOAD( "136064-2131.2f", 0x000000, 0x010000, CRC(bd7e3d84) SHA1(f87878042fc79fa3883136b31ac15ddc22c6023c) )
ROM_REGION( 0x40000, "extra", 0 ) /* 4*64k for 68000 code */
@ -623,7 +542,7 @@ ROM_START( cyberbal2 )
ROM_LOAD16_BYTE( "136064-1129.1cd", 0x020000, 0x010000, CRC(db11d2f0) SHA1(da9f49af533cbc732b17699040c7930070a90644) )
ROM_LOAD16_BYTE( "136064-1130.3b", 0x020001, 0x010000, CRC(fd86b8aa) SHA1(46310efed762632ed176a08aaec41e48aad41cc1) )
ROM_REGION16_BE( 0x40000, "dac", 0 ) /* 256k for 68000 sound code */
ROM_REGION16_BE( 0x40000, "sac:dac", 0 ) /* 256k for 68000 sound code */
ROM_LOAD16_BYTE( "136064-1132.3cd", 0x000000, 0x010000, CRC(ca5ce8d8) SHA1(69dc83d43d8c9dc7ce3207e70f48fcfc5ddda0cc) )
ROM_LOAD16_BYTE( "136064-1133.1b", 0x000001, 0x010000, CRC(ffeb8746) SHA1(0d8d28b2d997ff3cf01b4ef25b75fa5a69754af4) )
ROM_LOAD16_BYTE( "136064-1134.1cd", 0x020000, 0x010000, CRC(bcbd4c00) SHA1(f0bfcdf0b5491e15872b543e99b834ae384cbf18) )
@ -667,7 +586,7 @@ ROM_START( cyberbal1 ) /* loose chips from upgrade, cannot verify any rev 2 grap
ROM_LOAD16_BYTE( "136064-1123.1m", 0x000000, 0x010000, CRC(ba01fcdc) SHA1(d0283d68450cb758942df20762e12442687eab78) )
ROM_LOAD16_BYTE( "136064-1124.1kl", 0x000001, 0x010000, CRC(d0617f65) SHA1(7c641a2c709ecf40f6977abd94f6320e13faf61b) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for 6502 code */
ROM_REGION( 0x10000, "sac:cpu", 0 ) /* 64k for 6502 code */
ROM_LOAD( "136064-2131.2f", 0x000000, 0x010000, CRC(bd7e3d84) SHA1(f87878042fc79fa3883136b31ac15ddc22c6023c) ) /* this rev 2 chip was among the loose rev 1 chips */
ROM_REGION( 0x40000, "extra", 0 ) /* 4*64k for 68000 code */
@ -676,7 +595,7 @@ ROM_START( cyberbal1 ) /* loose chips from upgrade, cannot verify any rev 2 grap
ROM_LOAD16_BYTE( "136064-1129.1cd", 0x020000, 0x010000, CRC(db11d2f0) SHA1(da9f49af533cbc732b17699040c7930070a90644) )
ROM_LOAD16_BYTE( "136064-1130.3b", 0x020001, 0x010000, CRC(fd86b8aa) SHA1(46310efed762632ed176a08aaec41e48aad41cc1) )
ROM_REGION16_BE( 0x40000, "dac", 0 ) /* 256k for 68000 sound code */
ROM_REGION16_BE( 0x40000, "sac:dac", 0 ) /* 256k for 68000 sound code */
ROM_LOAD16_BYTE( "136064-1132.3cd", 0x000000, 0x010000, CRC(ca5ce8d8) SHA1(69dc83d43d8c9dc7ce3207e70f48fcfc5ddda0cc) )
ROM_LOAD16_BYTE( "136064-1133.1b", 0x000001, 0x010000, CRC(ffeb8746) SHA1(0d8d28b2d997ff3cf01b4ef25b75fa5a69754af4) )
ROM_LOAD16_BYTE( "136064-1134.1cd", 0x020000, 0x010000, CRC(bcbd4c00) SHA1(f0bfcdf0b5491e15872b543e99b834ae384cbf18) )
@ -720,7 +639,7 @@ ROM_START( cyberbalp )
ROM_LOAD16_BYTE( "136064-0123.1m", 0x000000, 0x010000, CRC(59bac810) SHA1(d4742b2b554c2ad62a2ea7152db3f06a06cddd67) )
ROM_LOAD16_BYTE( "136064-0124.1kl", 0x000001, 0x010000, CRC(e48e6dd3) SHA1(4d45bc66c0a3eb1174db7f19c5dee54dabad68f3) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for 6502 code */
ROM_REGION( 0x10000, "sac:cpu", 0 ) /* 64k for 6502 code */
ROM_LOAD( "136064-0131.2f", 0x000000, 0x010000, CRC(c72b71ce) SHA1(6d3d8f437cf55ccaaa4490daa69f402902944686) )
ROM_REGION( 0x40000, "extra", 0 ) /* 4*64k for 68000 code */
@ -729,7 +648,7 @@ ROM_START( cyberbalp )
ROM_LOAD16_BYTE( "136064-1129.1cd", 0x020000, 0x010000, CRC(db11d2f0) SHA1(da9f49af533cbc732b17699040c7930070a90644) )
ROM_LOAD16_BYTE( "136064-1130.3b", 0x020001, 0x010000, CRC(fd86b8aa) SHA1(46310efed762632ed176a08aaec41e48aad41cc1) )
ROM_REGION16_BE( 0x40000, "dac", 0 ) /* 256k for 68000 sound code */
ROM_REGION16_BE( 0x40000, "sac:dac", 0 ) /* 256k for 68000 sound code */
ROM_LOAD16_BYTE( "136064-0132.3cd", 0x000000, 0x010000, CRC(392a442c) SHA1(e108456167f433808b452edb3351d283b5cf7a50) )
ROM_LOAD16_BYTE( "136064-0133.1b", 0x000001, 0x010000, CRC(a0a11cf9) SHA1(b28a379cb49d051b6ccff877255409e1231d3030) )
ROM_LOAD16_BYTE( "136064-1134.1cd", 0x020000, 0x010000, CRC(bcbd4c00) SHA1(f0bfcdf0b5491e15872b543e99b834ae384cbf18) )
@ -971,7 +890,7 @@ ROM_START( cyberbalt )
ROM_LOAD16_BYTE( "136073-2009.3m", 0x020000, 0x010000, CRC(88bfc6dd) SHA1(ac2a67c8b4dbae62497236d624d333992195c218) )
ROM_LOAD16_BYTE( "136073-2010.3kl", 0x020001, 0x010000, CRC(3a121f29) SHA1(ebd088187abb863f2a632812811479dca7e31802) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for 6502 code */
ROM_REGION( 0x10000, "sac:cpu", 0 ) /* 64k for 6502 code */
ROM_LOAD( "136073-1029.2f", 0x000000, 0x010000, CRC(afee87e1) SHA1(da5e91167c68eecd2cb4436ac64cda14e5f6eae7) )
ROM_REGION( 0x40000, "extra", 0 )
@ -980,7 +899,7 @@ ROM_START( cyberbalt )
ROM_LOAD16_BYTE( "136073-1013.1cd", 0x020000, 0x010000, CRC(11d287c9) SHA1(a25095ab29a7103f2bf02d656414d9dab0b79215) )
ROM_LOAD16_BYTE( "136073-1014.3b", 0x020001, 0x010000, CRC(be15db42) SHA1(f3b1a676106e9956f62d3f36fbb1f849695ff771) )
ROM_REGION16_BE( 0x40000, "dac", 0 ) /* 256k for 68000 sound code */
ROM_REGION16_BE( 0x40000, "sac:dac", 0 ) /* 256k for 68000 sound code */
ROM_LOAD16_BYTE( "136064-1132.3cd", 0x000000, 0x010000, CRC(ca5ce8d8) SHA1(69dc83d43d8c9dc7ce3207e70f48fcfc5ddda0cc) )
ROM_LOAD16_BYTE( "136064-1133.1b", 0x000001, 0x010000, CRC(ffeb8746) SHA1(0d8d28b2d997ff3cf01b4ef25b75fa5a69754af4) )
ROM_LOAD16_BYTE( "136064-1134.1cd", 0x020000, 0x010000, CRC(bcbd4c00) SHA1(f0bfcdf0b5491e15872b543e99b834ae384cbf18) )
@ -1022,7 +941,7 @@ ROM_START( cyberbalt1 )
ROM_LOAD16_BYTE( "136073-1009.3m", 0x020000, 0x010000, CRC(3933e089) SHA1(4bd453bddabeafd07d193a1bc8ac0792e7aa99c3) )
ROM_LOAD16_BYTE( "136073-1010.3kl", 0x020001, 0x010000, CRC(e7a7cae8) SHA1(91e0c6a1b0c138a0e6a599011518fe10df44e76e) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for 6502 code */
ROM_REGION( 0x10000, "sac:cpu", 0 ) /* 64k for 6502 code */
ROM_LOAD( "136073-1029.2f", 0x000000, 0x010000, CRC(afee87e1) SHA1(da5e91167c68eecd2cb4436ac64cda14e5f6eae7) )
ROM_REGION( 0x40000, "extra", 0 )
@ -1031,7 +950,7 @@ ROM_START( cyberbalt1 )
ROM_LOAD16_BYTE( "136073-1013.1cd", 0x020000, 0x010000, CRC(11d287c9) SHA1(a25095ab29a7103f2bf02d656414d9dab0b79215) )
ROM_LOAD16_BYTE( "136073-1014.3b", 0x020001, 0x010000, CRC(be15db42) SHA1(f3b1a676106e9956f62d3f36fbb1f849695ff771) )
ROM_REGION16_BE( 0x40000, "dac", 0 ) /* 256k for 68000 sound code */
ROM_REGION16_BE( 0x40000, "sac:dac", 0 ) /* 256k for 68000 sound code */
ROM_LOAD16_BYTE( "136064-1132.3cd", 0x000000, 0x010000, CRC(ca5ce8d8) SHA1(69dc83d43d8c9dc7ce3207e70f48fcfc5ddda0cc) )
ROM_LOAD16_BYTE( "136064-1133.1b", 0x000001, 0x010000, CRC(ffeb8746) SHA1(0d8d28b2d997ff3cf01b4ef25b75fa5a69754af4) )
ROM_LOAD16_BYTE( "136064-1134.1cd", 0x020000, 0x010000, CRC(bcbd4c00) SHA1(f0bfcdf0b5491e15872b543e99b834ae384cbf18) )

View File

@ -12,12 +12,10 @@
#include "machine/atarigen.h"
#include "audio/atarijsa.h"
#include "audio/atarisac.h"
#include "video/atarimo.h"
#include "cpu/m68000/m68000.h"
#include "cpu/m6502/m6502.h"
#include "machine/timer.h"
#include "sound/dac.h"
#include "sound/ym2151.h"
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
@ -90,13 +88,8 @@ class cyberbal_state : public cyberbal_base_state
public:
cyberbal_state(const machine_config &mconfig, device_type type, const char *tag) :
cyberbal_base_state(mconfig, type, tag),
m_audiocpu(*this, "audiocpu"),
m_extracpu(*this, "extra"),
m_daccpu(*this, "dac"),
m_rdac(*this, "rdac"),
m_ldac(*this, "ldac"),
m_soundcomm(*this, "soundcomm"),
m_ymsnd(*this, "ymsnd"),
m_sac(*this, "sac"),
m_playfield2(*this, "playfield2"),
m_alpha2(*this, "alpha2"),
m_mob2(*this, "mob2"),
@ -121,25 +114,9 @@ protected:
uint32_t screen_update_cyberbal_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_cyberbal_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
// sound-related
DECLARE_READ8_MEMBER(special_port3_r);
DECLARE_READ8_MEMBER(sound_6502_stat_r);
DECLARE_WRITE8_MEMBER(sound_bank_select_w);
DECLARE_READ8_MEMBER(sound_68k_6502_r);
DECLARE_WRITE8_MEMBER(sound_68k_6502_w);
DECLARE_WRITE16_MEMBER(io_68k_irq_ack_w);
DECLARE_READ16_MEMBER(sound_68k_r);
DECLARE_WRITE16_MEMBER(sound_68k_w);
DECLARE_WRITE16_MEMBER(sound_68k_dac_w);
INTERRUPT_GEN_MEMBER(sound_68k_irq_gen);
void cyberbal_sound_reset();
void update_sound_68k_interrupts();
// memory maps
void main_map(address_map &map);
void extra_map(address_map &map);
void sound_map(address_map &map);
void sound_68k_map(address_map &map);
private:
DECLARE_WRITE_LINE_MEMBER(video_int_write_line);
@ -147,13 +124,8 @@ private:
TIMER_DEVICE_CALLBACK_MEMBER(scanline_update);
required_device<m6502_device> m_audiocpu;
required_device<cpu_device> m_extracpu;
required_device<cpu_device> m_daccpu;
required_device<dac_word_interface> m_rdac;
required_device<dac_word_interface> m_ldac;
required_device<atari_sound_comm_device> m_soundcomm;
required_device<ym2151_device> m_ymsnd;
required_device<atari_sac_device> m_sac;
required_device<tilemap_device> m_playfield2;
required_device<tilemap_device> m_alpha2;
required_device<atari_motion_objects_device> m_mob2;
@ -161,12 +133,6 @@ private:
required_device<screen_device> m_lscreen;
required_device<screen_device> m_rscreen;
uint8_t m_fast_68k_int;
uint8_t m_io_68k_int;
uint8_t m_sound_data_from_68k;
uint8_t m_sound_data_from_6502;
uint8_t m_sound_data_from_68k_ready;
uint8_t m_sound_data_from_6502_ready;
};
#endif // MAME_INCLUDES_CYBERBAL_H