mirror of
https://github.com/holub/mame
synced 2025-06-06 12:53:46 +03:00
balsente.cpp: Separate emulation (and ROM) of 6VB audio board from driver
This commit is contained in:
parent
0e6bff870e
commit
61324bebc8
@ -2708,6 +2708,8 @@ files {
|
||||
MAME_DIR .. "src/mame/audio/midway.h",
|
||||
MAME_DIR .. "src/mame/audio/csd.cpp",
|
||||
MAME_DIR .. "src/mame/audio/csd.h",
|
||||
MAME_DIR .. "src/mame/audio/sente6vb.cpp",
|
||||
MAME_DIR .. "src/mame/audio/sente6vb.h",
|
||||
}
|
||||
|
||||
createMAMEProjects(_target, _subtarget, "namco")
|
||||
|
526
src/mame/audio/sente6vb.cpp
Normal file
526
src/mame/audio/sente6vb.cpp
Normal file
@ -0,0 +1,526 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Aaron Giles
|
||||
/***************************************************************************
|
||||
|
||||
Bally/Sente 6VB audio board emulation
|
||||
|
||||
This serial audio board appears to be based on the Sequential Circuits
|
||||
Six-Trak synthesizer.
|
||||
|
||||
The later revision of this board replaces the 8253-5 PIT and much
|
||||
associated logic with a ST1001 custom gate array.
|
||||
|
||||
****************************************************************************
|
||||
|
||||
Memory map
|
||||
|
||||
****************************************************************************
|
||||
|
||||
========================================================================
|
||||
Z80 CPU
|
||||
========================================================================
|
||||
0000-1FFF R xxxxxxxx Program ROM
|
||||
2000-3FFF R/W xxxxxxxx Option RAM/ROM (assumed to be RAM for now)
|
||||
4000-5FFF R/W xxxxxxxx Program RAM
|
||||
6000-6001 W xxxxxxxx 6850 UART output (to main board)
|
||||
E000-E001 R xxxxxxxx 6850 UART input (from main board)
|
||||
========================================================================
|
||||
0000-0003 R/W xxxxxxxx 8253 counter chip I/O
|
||||
0008 R ------xx Counter state
|
||||
R ------x- State of counter #0 OUT signal (active high)
|
||||
R -------x State of flip-flop feeding counter #0 (active low)
|
||||
0008 W --xxxxxx Counter control
|
||||
W --x----- NMI enable (1=enabled, 0=disabled/clear)
|
||||
W ---x---- CLEAR on flip-flop feeding counter #0 (active low)
|
||||
W ----x--- Input of flip-flop feeding counter #0
|
||||
W -----x-- PRESET on flip-flop feeding counter #0 (active low)
|
||||
W ------x- GATE signal for counter #0 (active high)
|
||||
W -------x Audio enable
|
||||
000A W --xxxxxx DAC data latch (upper 6 bits)
|
||||
000B W xxxxxx-- DAC data latch (lower 6 bits)
|
||||
000C W -----xxx CEM3394 register select
|
||||
000E W --xxxxxx CEM3394 chip enable (active high)
|
||||
W --x----- CEM3394 chip 0 enable
|
||||
W ---x---- CEM3394 chip 1 enable
|
||||
W ----x--- CEM3394 chip 2 enable
|
||||
W -----x-- CEM3394 chip 3 enable
|
||||
W ------x- CEM3394 chip 4 enable
|
||||
W -------x CEM3394 chip 5 enable
|
||||
========================================================================
|
||||
Interrupts:
|
||||
INT generated by counter #2 OUT signal on 8253
|
||||
NMI generated by 6850 UART
|
||||
========================================================================
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "audio/sente6vb.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/clock.h"
|
||||
#include "speaker.h"
|
||||
|
||||
|
||||
#define LOG_CEM_WRITES 0
|
||||
|
||||
DEFINE_DEVICE_TYPE(SENTE6VB, sente6vb_device, "sente6vb", "Bally Sente 6VB Audio Board")
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Sound CPU memory handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void sente6vb_device::mem_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x1fff).rom().region("audiocpu", 0);
|
||||
map(0x2000, 0x5fff).ram();
|
||||
map(0x6000, 0x6001).mirror(0x1ffe).w(m_uart, FUNC(acia6850_device::write));
|
||||
map(0xe000, 0xe001).mirror(0x1ffe).r(m_uart, FUNC(acia6850_device::read));
|
||||
}
|
||||
|
||||
|
||||
void sente6vb_device::io_map(address_map &map)
|
||||
{
|
||||
map.global_mask(0xff);
|
||||
map(0x00, 0x03).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
|
||||
map(0x08, 0x0f).r(FUNC(sente6vb_device::counter_state_r));
|
||||
map(0x08, 0x09).w(FUNC(sente6vb_device::counter_control_w));
|
||||
map(0x0a, 0x0b).w(FUNC(sente6vb_device::dac_data_w));
|
||||
map(0x0c, 0x0d).w(FUNC(sente6vb_device::register_addr_w));
|
||||
map(0x0e, 0x0f).w(FUNC(sente6vb_device::chip_select_w));
|
||||
}
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Device configuration
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void sente6vb_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
Z80(config, m_audiocpu, 8_MHz_XTAL / 2);
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &sente6vb_device::mem_map);
|
||||
m_audiocpu->set_addrmap(AS_IO, &sente6vb_device::io_map);
|
||||
|
||||
ACIA6850(config, m_uart, 0);
|
||||
m_uart->txd_handler().set([this] (int state) { m_send_cb(state); });
|
||||
m_uart->irq_handler().set([this] (int state) { m_uint = bool(state); });
|
||||
|
||||
clock_device &uartclock(CLOCK(config, "uartclock", 8_MHz_XTAL / 16)); // 500 kHz
|
||||
uartclock.signal_handler().set(FUNC(sente6vb_device::uart_clock_w));
|
||||
uartclock.signal_handler().append(m_uart, FUNC(acia6850_device::write_txc));
|
||||
uartclock.signal_handler().append(m_uart, FUNC(acia6850_device::write_rxc));
|
||||
|
||||
TIMER(config, m_counter_0_timer, 0).configure_generic(timer_device::expired_delegate(FUNC(sente6vb_device::clock_counter_0_ff), this));
|
||||
|
||||
PIT8253(config, m_pit, 0);
|
||||
m_pit->out_handler<0>().set(FUNC(sente6vb_device::counter_0_set_out));
|
||||
m_pit->out_handler<2>().set_inputline(m_audiocpu, INPUT_LINE_IRQ0);
|
||||
m_pit->set_clk<1>(8_MHz_XTAL / 4);
|
||||
m_pit->set_clk<2>(8_MHz_XTAL / 4);
|
||||
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
for (auto &cem_device : m_cem_device)
|
||||
{
|
||||
CEM3394(config, cem_device, 0);
|
||||
cem_device->set_vco_zero_freq(431.894);
|
||||
cem_device->set_filter_zero_freq(1300.0);
|
||||
cem_device->add_route(ALL_OUTPUTS, "mono", 0.90);
|
||||
}
|
||||
|
||||
m_cem_device[0]->set_ext_input_callback(FUNC(sente6vb_device::noise_gen_0), this);
|
||||
m_cem_device[1]->set_ext_input_callback(FUNC(sente6vb_device::noise_gen_1), this);
|
||||
m_cem_device[2]->set_ext_input_callback(FUNC(sente6vb_device::noise_gen_2), this);
|
||||
m_cem_device[3]->set_ext_input_callback(FUNC(sente6vb_device::noise_gen_3), this);
|
||||
m_cem_device[4]->set_ext_input_callback(FUNC(sente6vb_device::noise_gen_4), this);
|
||||
m_cem_device[5]->set_ext_input_callback(FUNC(sente6vb_device::noise_gen_5), this);
|
||||
}
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* ROM definition
|
||||
*
|
||||
*************************************/
|
||||
|
||||
ROM_START( sente6vb )
|
||||
ROM_REGION( 0x2000, "audiocpu", 0 )
|
||||
ROM_LOAD( "8002-10 9-25-84.5", 0x0000, 0x2000, CRC(4dd0a525) SHA1(f0c447adc5b67917851a9df978df851247e75c43) )
|
||||
ROM_END
|
||||
|
||||
|
||||
const tiny_rom_entry *sente6vb_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME(sente6vb);
|
||||
}
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Device initialization
|
||||
*
|
||||
*************************************/
|
||||
|
||||
sente6vb_device::sente6vb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, SENTE6VB, tag, owner, clock)
|
||||
, m_pit(*this, "pit")
|
||||
, m_counter_0_timer(*this, "8253_0_timer")
|
||||
, m_cem_device(*this, "cem%u", 1U)
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_uart(*this, "uart")
|
||||
, m_send_cb(*this)
|
||||
, m_clock_out_cb(*this)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void sente6vb_device::device_start()
|
||||
{
|
||||
// create the polynomial tables
|
||||
poly17_init();
|
||||
|
||||
m_send_cb.resolve_safe();
|
||||
m_clock_out_cb.resolve_safe();
|
||||
m_uart->write_cts(0);
|
||||
m_uart->write_dcd(0);
|
||||
|
||||
save_item(NAME(m_counter_control));
|
||||
save_item(NAME(m_counter_0_ff));
|
||||
save_item(NAME(m_counter_0_out));
|
||||
save_item(NAME(m_counter_0_timer_active));
|
||||
|
||||
save_item(NAME(m_dac_value));
|
||||
save_item(NAME(m_dac_register));
|
||||
save_item(NAME(m_chip_select));
|
||||
|
||||
save_item(NAME(m_uint));
|
||||
|
||||
save_item(NAME(m_noise_position));
|
||||
}
|
||||
|
||||
|
||||
void sente6vb_device::device_reset()
|
||||
{
|
||||
// reset the manual counter 0 clock
|
||||
m_counter_control = 0x00;
|
||||
m_counter_0_ff = false;
|
||||
m_counter_0_out = false;
|
||||
m_counter_0_timer_active = false;
|
||||
m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
|
||||
|
||||
// reset the CEM3394 I/O states
|
||||
m_dac_value = 0;
|
||||
m_dac_register = 0;
|
||||
m_chip_select = 0x3f;
|
||||
|
||||
// reset the noise generator
|
||||
memset(m_noise_position, 0, sizeof(m_noise_position));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* MM5837 noise generator
|
||||
*
|
||||
* NOTE: this is stolen straight from
|
||||
* POKEY.c
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void sente6vb_device::poly17_init()
|
||||
{
|
||||
uint32_t i, x = 0;
|
||||
uint8_t *p;
|
||||
|
||||
// allocate memory
|
||||
p = m_poly17;
|
||||
|
||||
// generate the polynomial
|
||||
for (i = 0; i < POLY17_SIZE; i++)
|
||||
{
|
||||
// store new values
|
||||
*p++ = x & 1;
|
||||
|
||||
// calculate next bit
|
||||
x = ((x << POLY17_SHL) + (x >> POLY17_SHR) + POLY17_ADD) & POLY17_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline void sente6vb_device::noise_gen_chip(int chip, int count, short *buffer)
|
||||
{
|
||||
// noise generator runs at 100kHz
|
||||
uint32_t step = (100000 << 14) / cem3394_device::SAMPLE_RATE;
|
||||
uint32_t noise_counter = m_noise_position[chip];
|
||||
|
||||
while (count--)
|
||||
{
|
||||
*buffer++ = m_poly17[(noise_counter >> 14) & POLY17_SIZE] << 12;
|
||||
noise_counter += step;
|
||||
}
|
||||
|
||||
// remember the noise position
|
||||
m_noise_position[chip] = noise_counter;
|
||||
}
|
||||
|
||||
CEM3394_EXT_INPUT(sente6vb_device::noise_gen_0) { noise_gen_chip(0, count, buffer); }
|
||||
CEM3394_EXT_INPUT(sente6vb_device::noise_gen_1) { noise_gen_chip(1, count, buffer); }
|
||||
CEM3394_EXT_INPUT(sente6vb_device::noise_gen_2) { noise_gen_chip(2, count, buffer); }
|
||||
CEM3394_EXT_INPUT(sente6vb_device::noise_gen_3) { noise_gen_chip(3, count, buffer); }
|
||||
CEM3394_EXT_INPUT(sente6vb_device::noise_gen_4) { noise_gen_chip(4, count, buffer); }
|
||||
CEM3394_EXT_INPUT(sente6vb_device::noise_gen_5) { noise_gen_chip(5, count, buffer); }
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* 6850 UART communications
|
||||
*
|
||||
*************************************/
|
||||
|
||||
WRITE_LINE_MEMBER(sente6vb_device::rec_w)
|
||||
{
|
||||
m_uart->write_rxd(state);
|
||||
}
|
||||
|
||||
|
||||
WRITE_LINE_MEMBER(sente6vb_device::uart_clock_w)
|
||||
{
|
||||
if (state && BIT(m_counter_control, 5))
|
||||
m_audiocpu->set_input_line(INPUT_LINE_NMI, m_uint ? ASSERT_LINE : CLEAR_LINE);
|
||||
|
||||
m_clock_out_cb(!state);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Sound CPU counter 0 emulation
|
||||
*
|
||||
*************************************/
|
||||
|
||||
WRITE_LINE_MEMBER(sente6vb_device::counter_0_set_out)
|
||||
{
|
||||
// OUT on counter 0 is hooked to the GATE line on counter 1 through an inverter
|
||||
m_pit->write_gate1(!state);
|
||||
|
||||
// remember the out state
|
||||
m_counter_0_out = state;
|
||||
}
|
||||
|
||||
|
||||
WRITE_LINE_MEMBER(sente6vb_device::set_counter_0_ff)
|
||||
{
|
||||
// the flip/flop output is inverted, so if we went high to low, that's a clock
|
||||
m_pit->write_clk0(!state);
|
||||
|
||||
// remember the new state
|
||||
m_counter_0_ff = state;
|
||||
}
|
||||
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(sente6vb_device::clock_counter_0_ff)
|
||||
{
|
||||
// clock the D value through the flip-flop
|
||||
set_counter_0_ff(BIT(m_counter_control, 3));
|
||||
}
|
||||
|
||||
|
||||
void sente6vb_device::update_counter_0_timer()
|
||||
{
|
||||
double maxfreq = 0.0;
|
||||
int i;
|
||||
|
||||
// if there's already a timer, remove it
|
||||
if (m_counter_0_timer_active)
|
||||
m_counter_0_timer->reset();
|
||||
m_counter_0_timer_active = false;
|
||||
|
||||
// find the counter with the maximum frequency
|
||||
// this is used to calibrate the timers at startup
|
||||
for (i = 0; i < 6; i++)
|
||||
if (m_cem_device[i]->get_parameter(cem3394_device::FINAL_GAIN) < 10.0)
|
||||
{
|
||||
double tempfreq;
|
||||
|
||||
// if the filter resonance is high, then they're calibrating the filter frequency
|
||||
if (m_cem_device[i]->get_parameter(cem3394_device::FILTER_RESONANCE) > 0.9)
|
||||
tempfreq = m_cem_device[i]->get_parameter(cem3394_device::FILTER_FREQENCY);
|
||||
|
||||
// otherwise, they're calibrating the VCO frequency
|
||||
else
|
||||
tempfreq = m_cem_device[i]->get_parameter(cem3394_device::VCO_FREQUENCY);
|
||||
|
||||
if (tempfreq > maxfreq) maxfreq = tempfreq;
|
||||
}
|
||||
|
||||
// reprime the timer
|
||||
if (maxfreq > 0.0)
|
||||
{
|
||||
m_counter_0_timer_active = true;
|
||||
m_counter_0_timer->adjust(attotime::from_hz(maxfreq), 0, attotime::from_hz(maxfreq));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Sound CPU counter handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
READ8_MEMBER(sente6vb_device::counter_state_r)
|
||||
{
|
||||
// bit D0 is the inverse of the flip-flop state
|
||||
int result = !m_counter_0_ff;
|
||||
|
||||
// bit D1 is the OUT value from counter 0
|
||||
if (m_counter_0_out) result |= 0x02;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(sente6vb_device::counter_control_w)
|
||||
{
|
||||
uint8_t diff_counter_control = m_counter_control ^ data;
|
||||
|
||||
// set the new global value
|
||||
m_counter_control = data;
|
||||
|
||||
// bit D0 enables/disables audio
|
||||
if (BIT(diff_counter_control, 0))
|
||||
{
|
||||
for (auto & elem : m_cem_device)
|
||||
elem->set_output_gain(0, BIT(data, 0) ? 1.0 : 0);
|
||||
}
|
||||
|
||||
// bit D1 is hooked to counter 0's gate
|
||||
if (BIT(diff_counter_control, 1))
|
||||
{
|
||||
// if we gate on, start a pulsing timer to clock it
|
||||
if (BIT(data, 1) && !m_counter_0_timer_active)
|
||||
{
|
||||
update_counter_0_timer();
|
||||
}
|
||||
|
||||
// if we gate off, remove the timer
|
||||
else if (!BIT(data, 1) && m_counter_0_timer_active)
|
||||
{
|
||||
m_counter_0_timer->reset();
|
||||
m_counter_0_timer_active = false;
|
||||
}
|
||||
}
|
||||
|
||||
// set the actual gate
|
||||
m_pit->write_gate0(BIT(data, 1));
|
||||
|
||||
// bits D2 and D4 control the clear/reset flags on the flip-flop that feeds counter 0
|
||||
if (!BIT(data, 4))
|
||||
set_counter_0_ff(0);
|
||||
else if (!BIT(data, 2))
|
||||
set_counter_0_ff(1);
|
||||
|
||||
// bit 5 clears the NMI interrupt
|
||||
if (BIT(diff_counter_control, 5) && !BIT(data, 5))
|
||||
m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* CEM3394 Interfaces
|
||||
*
|
||||
*************************************/
|
||||
|
||||
WRITE8_MEMBER(sente6vb_device::chip_select_w)
|
||||
{
|
||||
static constexpr uint8_t register_map[8] =
|
||||
{
|
||||
cem3394_device::VCO_FREQUENCY,
|
||||
cem3394_device::FINAL_GAIN,
|
||||
cem3394_device::FILTER_RESONANCE,
|
||||
cem3394_device::FILTER_FREQENCY,
|
||||
cem3394_device::MIXER_BALANCE,
|
||||
cem3394_device::MODULATION_AMOUNT,
|
||||
cem3394_device::PULSE_WIDTH,
|
||||
cem3394_device::WAVE_SELECT
|
||||
};
|
||||
|
||||
double voltage = (double)m_dac_value * (8.0 / 4096.0) - 4.0;
|
||||
int diffchip = data ^ m_chip_select, i;
|
||||
int reg = register_map[m_dac_register];
|
||||
|
||||
// remember the new select value
|
||||
m_chip_select = data;
|
||||
|
||||
// check all six chip enables
|
||||
for (i = 0; i < 6; i++)
|
||||
if ((diffchip & (1 << i)) && (data & (1 << i)))
|
||||
{
|
||||
#if LOG_CEM_WRITES
|
||||
double temp = 0;
|
||||
|
||||
// remember the previous value
|
||||
temp =
|
||||
#endif
|
||||
m_cem_device[i]->get_parameter(reg);
|
||||
|
||||
// set the voltage
|
||||
m_cem_device[i]->set_voltage(reg, voltage);
|
||||
|
||||
// only log changes
|
||||
#if LOG_CEM_WRITES
|
||||
if (temp != m_cem_device[i]->get_parameter(reg))
|
||||
{
|
||||
static const char *const names[] =
|
||||
{
|
||||
"VCO_FREQUENCY",
|
||||
"FINAL_GAIN",
|
||||
"FILTER_RESONANCE",
|
||||
"FILTER_FREQENCY",
|
||||
"MIXER_BALANCE",
|
||||
"MODULATION_AMOUNT",
|
||||
"PULSE_WIDTH",
|
||||
"WAVE_SELECT"
|
||||
};
|
||||
logerror("s%04X: CEM#%d:%s=%f\n", m_audiocpu->pcbase(), i, names[m_dac_register], voltage);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// if a timer for counter 0 is running, recompute
|
||||
if (m_counter_0_timer_active)
|
||||
update_counter_0_timer();
|
||||
}
|
||||
|
||||
|
||||
|
||||
WRITE8_MEMBER(sente6vb_device::dac_data_w)
|
||||
{
|
||||
// LSB or MSB?
|
||||
if (offset & 1)
|
||||
m_dac_value = (m_dac_value & 0xfc0) | ((data >> 2) & 0x03f);
|
||||
else
|
||||
m_dac_value = (m_dac_value & 0x03f) | ((data << 6) & 0xfc0);
|
||||
|
||||
// if there are open channels, force the values in
|
||||
if ((m_chip_select & 0x3f) != 0x3f)
|
||||
{
|
||||
uint8_t temp = m_chip_select;
|
||||
chip_select_w(space, 0, 0x3f);
|
||||
chip_select_w(space, 0, temp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(sente6vb_device::register_addr_w)
|
||||
{
|
||||
m_dac_register = data & 7;
|
||||
}
|
99
src/mame/audio/sente6vb.h
Normal file
99
src/mame/audio/sente6vb.h
Normal file
@ -0,0 +1,99 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Aaron Giles
|
||||
/***************************************************************************
|
||||
|
||||
Bally/Sente 6VB audio board emulation
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef MAME_AUDIO_SENTE6VB_H
|
||||
#define MAME_AUDIO_SENTE6VB_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "machine/6850acia.h"
|
||||
#include "machine/pit8253.h"
|
||||
#include "machine/timer.h"
|
||||
#include "sound/cem3394.h"
|
||||
|
||||
|
||||
#define POLY17_BITS 17
|
||||
#define POLY17_SIZE ((1 << POLY17_BITS) - 1)
|
||||
#define POLY17_SHL 7
|
||||
#define POLY17_SHR 10
|
||||
#define POLY17_ADD 0x18000
|
||||
|
||||
|
||||
class sente6vb_device : public device_t
|
||||
{
|
||||
public:
|
||||
sente6vb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
|
||||
|
||||
auto send_cb() { return m_send_cb.bind(); }
|
||||
auto clock_out_cb() { return m_clock_out_cb.bind(); }
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(rec_w);
|
||||
|
||||
protected:
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
private:
|
||||
DECLARE_READ8_MEMBER(counter_state_r);
|
||||
DECLARE_WRITE8_MEMBER(counter_control_w);
|
||||
DECLARE_WRITE8_MEMBER(chip_select_w);
|
||||
DECLARE_WRITE8_MEMBER(dac_data_w);
|
||||
DECLARE_WRITE8_MEMBER(register_addr_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(uart_clock_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(counter_0_set_out);
|
||||
|
||||
void update_counter_0_timer();
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(clock_counter_0_ff);
|
||||
void poly17_init();
|
||||
DECLARE_WRITE_LINE_MEMBER(set_counter_0_ff);
|
||||
inline void noise_gen_chip(int chip, int count, short *buffer);
|
||||
CEM3394_EXT_INPUT(noise_gen_0);
|
||||
CEM3394_EXT_INPUT(noise_gen_1);
|
||||
CEM3394_EXT_INPUT(noise_gen_2);
|
||||
CEM3394_EXT_INPUT(noise_gen_3);
|
||||
CEM3394_EXT_INPUT(noise_gen_4);
|
||||
CEM3394_EXT_INPUT(noise_gen_5);
|
||||
|
||||
void mem_map(address_map &map);
|
||||
void io_map(address_map &map);
|
||||
|
||||
required_device<pit8253_device> m_pit;
|
||||
required_device<timer_device> m_counter_0_timer;
|
||||
required_device_array<cem3394_device, 6> m_cem_device;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
required_device<acia6850_device> m_uart;
|
||||
|
||||
devcb_write_line m_send_cb;
|
||||
devcb_write_line m_clock_out_cb;
|
||||
|
||||
// manually clocked counter 0 states
|
||||
uint8_t m_counter_control;
|
||||
bool m_counter_0_ff;
|
||||
bool m_counter_0_out;
|
||||
bool m_counter_0_timer_active;
|
||||
|
||||
// random number generator states
|
||||
uint8_t m_poly17[POLY17_SIZE + 1];
|
||||
|
||||
// CEM3394 DAC control states
|
||||
uint16_t m_dac_value;
|
||||
uint8_t m_dac_register;
|
||||
uint8_t m_chip_select;
|
||||
|
||||
// sound CPU 6850 states
|
||||
bool m_uint;
|
||||
|
||||
// noise generator states
|
||||
uint32_t m_noise_position[6];
|
||||
};
|
||||
|
||||
DECLARE_DEVICE_TYPE(SENTE6VB, sente6vb_device)
|
||||
|
||||
#endif // MAME_AUDIO_SENTE6VB_H
|
@ -68,7 +68,7 @@
|
||||
****************************************************************************
|
||||
|
||||
========================================================================
|
||||
CPU #1
|
||||
68A09E CPU
|
||||
========================================================================
|
||||
0000-007F R/W xxxxxxxx Sprite RAM (32 entries x 4 bytes)
|
||||
R/W x------- (0: Vertical flip)
|
||||
@ -127,42 +127,6 @@
|
||||
========================================================================
|
||||
|
||||
|
||||
========================================================================
|
||||
CPU #2
|
||||
========================================================================
|
||||
0000-1FFF R xxxxxxxx Program ROM
|
||||
2000-3FFF R/W xxxxxxxx Option RAM/ROM (assumed to be RAM for now)
|
||||
4000-5FFF R/W xxxxxxxx Program RAM
|
||||
6000-6001 W xxxxxxxx 6850 UART output (to main board)
|
||||
E000-E001 R xxxxxxxx 6850 UART input (from main board)
|
||||
========================================================================
|
||||
0000-0003 R/W xxxxxxxx 8253 counter chip I/O
|
||||
0008 R ------xx Counter state
|
||||
R ------x- State of counter #0 OUT signal (active high)
|
||||
R -------x State of flip-flop feeding counter #0 (active low)
|
||||
0008 W --xxxxxx Counter control
|
||||
W --x----- NMI enable (1=enabled, 0=disabled/clear)
|
||||
W ---x---- CLEAR on flip-flop feeding counter #0 (active low)
|
||||
W ----x--- Input of flip-flop feeding counter #0
|
||||
W -----x-- PRESET on flip-flop feeding counter #0 (active low)
|
||||
W ------x- GATE signal for counter #0 (active high)
|
||||
W -------x Audio enable
|
||||
000A W --xxxxxx DAC data latch (upper 6 bits)
|
||||
000B W xxxxxx-- DAC data latch (lower 6 bits)
|
||||
000C W -----xxx CEM3394 register select
|
||||
000E W --xxxxxx CEM3394 chip enable (active high)
|
||||
W --x----- CEM3394 chip 0 enable
|
||||
W ---x---- CEM3394 chip 1 enable
|
||||
W ----x--- CEM3394 chip 2 enable
|
||||
W -----x-- CEM3394 chip 3 enable
|
||||
W ------x- CEM3394 chip 4 enable
|
||||
W -------x CEM3394 chip 5 enable
|
||||
========================================================================
|
||||
Interrupts:
|
||||
INT generated by counter #2 OUT signal on 8253
|
||||
NMI generated by 6850 UART
|
||||
========================================================================
|
||||
|
||||
========================================================================
|
||||
Shrike SHM
|
||||
Many thanks to Owen Rubin and Brian Deuel ( http://www.atarimuseum.com/orubin/ ) for their time,
|
||||
@ -247,12 +211,11 @@ DIP locations verified for:
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "cpu/m6809/m6809.h"
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "machine/clock.h"
|
||||
#include "machine/watchdog.h"
|
||||
#include "audio/sente6vb.h"
|
||||
#include "machine/z80ctc.h"
|
||||
#include "sound/ay8910.h"
|
||||
#include "sound/msm5205.h"
|
||||
#include "sound/cem3394.h"
|
||||
#include "speaker.h"
|
||||
|
||||
#include "stocker.lh"
|
||||
@ -311,27 +274,6 @@ void balsente_state::cpu1_smudge_map(address_map &map)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void balsente_state::cpu2_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x1fff).rom();
|
||||
map(0x2000, 0x5fff).ram();
|
||||
map(0x6000, 0x6001).mirror(0x1ffe).w("audiouart", FUNC(acia6850_device::write));
|
||||
map(0xe000, 0xe001).mirror(0x1ffe).r("audiouart", FUNC(acia6850_device::read));
|
||||
}
|
||||
|
||||
|
||||
void balsente_state::cpu2_io_map(address_map &map)
|
||||
{
|
||||
map.global_mask(0xff);
|
||||
map(0x00, 0x03).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write));
|
||||
map(0x08, 0x0f).r(FUNC(balsente_state::counter_state_r));
|
||||
map(0x08, 0x09).w(FUNC(balsente_state::counter_control_w));
|
||||
map(0x0a, 0x0b).w(FUNC(balsente_state::dac_data_w));
|
||||
map(0x0c, 0x0d).w(FUNC(balsente_state::register_addr_w));
|
||||
map(0x0e, 0x0f).w(FUNC(balsente_state::chip_select_w));
|
||||
}
|
||||
|
||||
|
||||
// TODO: banking (Trivial hardware from Maibesa)
|
||||
void balsente_state::cpu2_triviamb_map(address_map &map)
|
||||
{
|
||||
@ -1343,38 +1285,16 @@ void balsente_state::balsente(machine_config &config)
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &balsente_state::cpu1_map);
|
||||
m_maincpu->set_vblank_int("screen", FUNC(balsente_state::update_analog_inputs));
|
||||
|
||||
Z80(config, m_audiocpu, 8_MHz_XTAL / 2); /* xtal verified but not speed */
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &balsente_state::cpu2_map);
|
||||
m_audiocpu->set_addrmap(AS_IO, &balsente_state::cpu2_io_map);
|
||||
|
||||
ACIA6850(config, m_acia, 0);
|
||||
m_acia->txd_handler().set(m_audiouart, FUNC(acia6850_device::write_rxd));
|
||||
m_acia->txd_handler().set("audio6vb", FUNC(sente6vb_device::rec_w));
|
||||
m_acia->irq_handler().set_inputline(m_maincpu, M6809_FIRQ_LINE);
|
||||
|
||||
ACIA6850(config, m_audiouart, 0);
|
||||
m_audiouart->txd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
|
||||
m_audiouart->irq_handler().set([this] (int state) { m_uint = bool(state); });
|
||||
|
||||
clock_device &uartclock(CLOCK(config, "uartclock", 8_MHz_XTAL / 16)); // 500 kHz
|
||||
uartclock.signal_handler().set(FUNC(balsente_state::uint_propagate_w));
|
||||
uartclock.signal_handler().append(m_audiouart, FUNC(acia6850_device::write_txc));
|
||||
uartclock.signal_handler().append(m_audiouart, FUNC(acia6850_device::write_rxc));
|
||||
uartclock.signal_handler().append(m_acia, FUNC(acia6850_device::write_txc)).invert();
|
||||
uartclock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc)).invert();
|
||||
|
||||
X2212(config, "nov0").set_auto_save(true); // system NOVRAM
|
||||
X2212(config, "nov1").set_auto_save(true); // cart NOVRAM
|
||||
|
||||
WATCHDOG_TIMER(config, "watchdog");
|
||||
|
||||
TIMER(config, m_scanline_timer, 0).configure_generic(timer_device::expired_delegate(FUNC(balsente_state::interrupt_timer), this));
|
||||
TIMER(config, m_counter_0_timer, 0).configure_generic(timer_device::expired_delegate(FUNC(balsente_state::clock_counter_0_ff), this));
|
||||
|
||||
PIT8253(config, m_pit, 0);
|
||||
m_pit->out_handler<0>().set(FUNC(balsente_state::counter_0_set_out));
|
||||
m_pit->out_handler<2>().set_inputline(m_audiocpu, INPUT_LINE_IRQ0);
|
||||
m_pit->set_clk<1>(8_MHz_XTAL / 4);
|
||||
m_pit->set_clk<2>(8_MHz_XTAL / 4);
|
||||
|
||||
LS259(config, m_outlatch); // U9H
|
||||
// these outputs are generally used to control the various lamps
|
||||
@ -1399,43 +1319,10 @@ void balsente_state::balsente(machine_config &config)
|
||||
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
CEM3394(config, m_cem_device[0], 0);
|
||||
m_cem_device[0]->set_ext_input_callback(FUNC(balsente_state::noise_gen_0), this);
|
||||
m_cem_device[0]->set_vco_zero_freq(431.894);
|
||||
m_cem_device[0]->set_filter_zero_freq(1300.0);
|
||||
m_cem_device[0]->add_route(ALL_OUTPUTS, "mono", 0.90);
|
||||
|
||||
CEM3394(config, m_cem_device[1], 0);
|
||||
m_cem_device[1]->set_ext_input_callback(FUNC(balsente_state::noise_gen_1), this);
|
||||
m_cem_device[1]->set_vco_zero_freq(431.894);
|
||||
m_cem_device[1]->set_filter_zero_freq(1300.0);
|
||||
m_cem_device[1]->add_route(ALL_OUTPUTS, "mono", 0.90);
|
||||
|
||||
CEM3394(config, m_cem_device[2], 0);
|
||||
m_cem_device[2]->set_ext_input_callback(FUNC(balsente_state::noise_gen_2), this);
|
||||
m_cem_device[2]->set_vco_zero_freq(431.894);
|
||||
m_cem_device[2]->set_filter_zero_freq(1300.0);
|
||||
m_cem_device[2]->add_route(ALL_OUTPUTS, "mono", 0.90);
|
||||
|
||||
CEM3394(config, m_cem_device[3], 0);
|
||||
m_cem_device[3]->set_ext_input_callback(FUNC(balsente_state::noise_gen_3), this);
|
||||
m_cem_device[3]->set_vco_zero_freq(431.894);
|
||||
m_cem_device[3]->set_filter_zero_freq(1300.0);
|
||||
m_cem_device[3]->add_route(ALL_OUTPUTS, "mono", 0.90);
|
||||
|
||||
CEM3394(config, m_cem_device[4], 0);
|
||||
m_cem_device[4]->set_ext_input_callback(FUNC(balsente_state::noise_gen_4), this);
|
||||
m_cem_device[4]->set_vco_zero_freq(431.894);
|
||||
m_cem_device[4]->set_filter_zero_freq(1300.0);
|
||||
m_cem_device[4]->add_route(ALL_OUTPUTS, "mono", 0.90);
|
||||
|
||||
CEM3394(config, m_cem_device[5], 0);
|
||||
m_cem_device[5]->set_ext_input_callback(FUNC(balsente_state::noise_gen_5), this);
|
||||
m_cem_device[5]->set_vco_zero_freq(431.894);
|
||||
m_cem_device[5]->set_filter_zero_freq(1300.0);
|
||||
m_cem_device[5]->add_route(ALL_OUTPUTS, "mono", 0.90);
|
||||
sente6vb_device &audio6vb(SENTE6VB(config, "audio6vb"));
|
||||
audio6vb.send_cb().set(m_acia, FUNC(acia6850_device::write_rxd));
|
||||
audio6vb.clock_out_cb().set(m_acia, FUNC(acia6850_device::write_txc));
|
||||
audio6vb.clock_out_cb().append(m_acia, FUNC(acia6850_device::write_rxc));
|
||||
}
|
||||
|
||||
|
||||
@ -1465,6 +1352,7 @@ void balsente_state::triviamb(machine_config &config)
|
||||
balsente(config);
|
||||
|
||||
// sound PCB has: 2x Z80CTC, 2x AY8910A, 1x M5205, 1x 8MHz XTAL (divisor unknown for every device)
|
||||
Z80(config, m_audiocpu, 8_MHz_XTAL / 2);
|
||||
m_audiocpu->set_addrmap(AS_PROGRAM, &balsente_state::cpu2_triviamb_map);
|
||||
m_audiocpu->set_addrmap(AS_IO, &balsente_state::cpu2_triviamb_io_map);
|
||||
|
||||
@ -1476,12 +1364,8 @@ void balsente_state::triviamb(machine_config &config)
|
||||
|
||||
MSM5205(config, "msm", 384000).add_route(ALL_OUTPUTS, "mono", 0.90);
|
||||
|
||||
config.device_remove("cem1");
|
||||
config.device_remove("cem2");
|
||||
config.device_remove("cem3");
|
||||
config.device_remove("cem4");
|
||||
config.device_remove("cem5");
|
||||
config.device_remove("cem6");
|
||||
m_acia->txd_handler().set_nop();
|
||||
config.device_remove("audiovb");
|
||||
}
|
||||
|
||||
/*************************************
|
||||
@ -1494,16 +1378,10 @@ void balsente_state::triviamb(machine_config &config)
|
||||
ROM_REGION( 0x00104, "motherbrd_pals", 0) /* Motherboard PAL's */ \
|
||||
ROM_LOAD( "u01508001100b.u20f", 0x00000, 0x00104, CRC(2d2e2102) SHA1(de094f9955d6085f1714f1aa7c71e1f047e96c5f) ) /* PAL16L8, dumped from Board 007-8001-01-0C Rev C1 */
|
||||
|
||||
#define SOUNDBOARD_ROMS \
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for Z80 */ \
|
||||
ROM_LOAD( "8002-10 9-25-84.5", 0x00000, 0x2000, CRC(4dd0a525) SHA1(f0c447adc5b67917851a9df978df851247e75c43) )
|
||||
|
||||
ROM_START( sentetst )
|
||||
ROM_REGION( 0x40000, "maincpu", 0 ) /* 64k for code for the first CPU, plus 128k of banked ROMs */
|
||||
ROM_LOAD( "sdiagef.bin", 0x2e000, 0x2000, CRC(2a39fc53) SHA1(04ea68bfad455cc928e57390eba5597c38bbab69) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "sdiaggr0.bin", 0x00000, 0x2000, CRC(5e0ff62a) SHA1(3f0ebebb2f58530af7fac57a4780dfb37ef1ee1d) )
|
||||
|
||||
@ -1522,8 +1400,6 @@ ROM_START( cshift )
|
||||
ROM_LOAD( "cs-cd.bin", 0x2c000, 0x2000, CRC(f555a0b2) SHA1(49668f8363fdcec4686ec80bf2e99003cd11e2c1) )
|
||||
ROM_LOAD( "cs-ef.bin", 0x2e000, 0x2000, CRC(368b1ce3) SHA1(8003ef99adcb26feb42e1b0945b1185e438582b2) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "cs-gr0.bin", 0x00000, 0x2000, CRC(67f9d3b3) SHA1(4f3f80e4272b20611206636b6ccb627087efd0c3) )
|
||||
ROM_LOAD( "cs-gr1.bin", 0x02000, 0x2000, CRC(78973d50) SHA1(de7891ef47c277d733d9b4810d68621718644655) )
|
||||
@ -1546,8 +1422,6 @@ ROM_START( gghost )
|
||||
ROM_LOAD( "ggh-cd.bin", 0x2c000, 0x2000, CRC(d3d75f84) SHA1(f19f99ea05ad5b7e4b0485e80d7b6a329b8ef4d8) )
|
||||
ROM_LOAD( "ggh-ef.bin", 0x2e000, 0x2000, CRC(a02b4243) SHA1(f242fc017c9ae1997409825c34e8f5c6e6a0615e) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "ggh-gr0.bin", 0x00000, 0x2000, CRC(03515526) SHA1(bceb7c8c3aa4c39b6cf1b976c5765c920399fe31) )
|
||||
ROM_LOAD( "ggh-gr1.bin", 0x02000, 0x2000, CRC(b4293435) SHA1(5e2b96c19c4f5c63a5afa2de504d29fe64a4c908) )
|
||||
@ -1568,8 +1442,6 @@ ROM_START( hattrick )
|
||||
ROM_LOAD( "rom-cd.u3a", 0x2c000, 0x2000, CRC(fc44f36c) SHA1(227d0c93c579d743b615b1fa6da56128e8202e51) )
|
||||
ROM_LOAD( "rom-ef.u2a", 0x2e000, 0x2000, CRC(d8f910fb) SHA1(b74a305dd848c7bf574e4b0aa32147b8d5c89e9e) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "rom-gr0.u9b", 0x00000, 0x2000, CRC(9f41baba) SHA1(fa817a8e4d2f7b86a2294132e3991f7b6d8cb11a) )
|
||||
ROM_LOAD( "rom-gr1.u8b", 0x02000, 0x2000, CRC(951f08c9) SHA1(059a575dd35cd8e822e12ac2606b47b6272bbb41) )
|
||||
@ -1584,8 +1456,6 @@ ROM_START( teamht )
|
||||
ROM_LOAD( "hattrk.u7a", 0x14000, 0x4000, CRC(5f2a0b24) SHA1(da1950a7e11014e47438a7c5831433390c1b1fd3) )
|
||||
ROM_LOAD( "hattrk.u1a", 0x2c000, 0x4000, CRC(6c6cf2be) SHA1(80e82ae4bd129000e74c4a5fd06d2109d5417e39) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "hattrk.u6b", 0x00000, 0x4000, CRC(6e299728) SHA1(f10fc020fdf8f61d059ac57306b0353ac7dbfb24) )
|
||||
|
||||
@ -1604,8 +1474,6 @@ ROM_START( otwalls )
|
||||
ROM_LOAD( "otw-cd.bin", 0x2c000, 0x2000, CRC(8e2d15ab) SHA1(8043fdf637de7752e8d42554ebad2e155a6f5939) )
|
||||
ROM_LOAD( "otw-ef.bin", 0x2e000, 0x2000, CRC(57eab299) SHA1(475d800c03d6b2786bd23861d61dc113b837a585) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "otw-gr0.bin", 0x00000, 0x2000, CRC(210bad3c) SHA1(703769c6a569b17f2ad18441da7de0237be4721e) )
|
||||
ROM_LOAD( "otw-gr1.bin", 0x02000, 0x2000, CRC(13e6aaa5) SHA1(ac8b9d16d2159d4a578d8fa988b59c058c5efc88) )
|
||||
@ -1629,8 +1497,6 @@ ROM_START( snakepit )
|
||||
ROM_LOAD( "spit-cd.bin", 0x2c000, 0x2000, CRC(54095cbb) SHA1(a43b78b2876359a29ecb2f169c876a0026375ea2) )
|
||||
ROM_LOAD( "spit-ef.bin", 0x2e000, 0x2000, CRC(5f836a66) SHA1(cc3c11003f9e49cac10c0296ab6d156e5677d0f8) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "spit-gr0.bin", 0x00000, 0x2000, CRC(f77fd85d) SHA1(f8e69d1d0030412d6129a8ebfee40b3f1f189d8d) )
|
||||
ROM_LOAD( "spit-gr1.bin", 0x02000, 0x2000, CRC(3ad10334) SHA1(1d82a7948fbee627c80a9e03ade90e57972a6a31) )
|
||||
@ -1654,8 +1520,6 @@ ROM_START( snakepit2 )
|
||||
ROM_LOAD( "cd.bin", 0x2c000, 0x2000, CRC(f357172e) SHA1(822012360526459e85196692e4cb408fe25fb1cc) )
|
||||
ROM_LOAD( "ef.bin", 0x2e000, 0x2000, CRC(5e9d1de2) SHA1(5a04c4444aed9c2677fc85ad733fec69398403d6) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr0.bin", 0x00000, 0x2000, CRC(f77fd85d) SHA1(f8e69d1d0030412d6129a8ebfee40b3f1f189d8d) )
|
||||
ROM_LOAD( "gr1.bin", 0x02000, 0x2000, CRC(3ad10334) SHA1(1d82a7948fbee627c80a9e03ade90e57972a6a31) )
|
||||
@ -1677,8 +1541,6 @@ ROM_START( snakjack )
|
||||
ROM_LOAD( "rom-cd.u3a", 0x2c000, 0x2000, CRC(7b44ca4c) SHA1(8697055da489fcf0244dc94fe5393418a8003bf7) )
|
||||
ROM_LOAD( "rom-ef.u1a", 0x2e000, 0x2000, CRC(f5309b38) SHA1(864f759dc6822b548742140b7ea2ea2aba43beba) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "rom-gr0.u9b", 0x00000, 0x2000, CRC(3e64b5d5) SHA1(ab681eabb4f8e5b946c288ffb8df0624c0473d82) )
|
||||
ROM_LOAD( "rom-gr1.u8b", 0x02000, 0x2000, CRC(b3b8baee) SHA1(b37638784a3903f2dcd698104da75b4ab59e8257) )
|
||||
@ -1699,8 +1561,6 @@ ROM_START( stocker )
|
||||
ROM_LOAD( "ab23.u7a", 0x14000, 0x4000, CRC(48e432c2) SHA1(af87009089a3e83fab5c935696edbbf2a15215f9) )
|
||||
ROM_LOAD( "cd6ef.u1a",0x2c000, 0x4000, CRC(83e6e5c9) SHA1(f0e38a95cb2ea385a587f330c48fc787db0cc65e) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr01.u6b", 0x00000, 0x4000, CRC(2e66ac35) SHA1(c65b4991a88f8359c85f904f66a7fe73330aface) )
|
||||
ROM_LOAD( "gr23.u5b", 0x04000, 0x4000, CRC(6fa43631) SHA1(7000907b914bf851b09811e3736af8c02e1aeda9) )
|
||||
@ -1722,9 +1582,6 @@ ROM_START( stocker )
|
||||
ROM_LOAD( "stkr-cd.bin", 0x2c000, 0x2000, BAD_DUMP CRC(53dbc4e5) SHA1(e389978b5472174681fa180c6a2edf49903a6514) ) // 1 bad byte
|
||||
ROM_LOAD( "stkr-ef.bin", 0x2e000, 0x2000, BAD_DUMP CRC(cdcf46bc) SHA1(8b1e801dab1efed002d484135264998d255dc041) ) // 1 bad byte
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for Z80 */
|
||||
ROM_LOAD( "sentesnd", 0x00000, 0x2000, CRC(4dd0a525) SHA1(f0c447adc5b67917851a9df978df851247e75c43) )
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "stkr-gr0.bin", 0x00000, 0x2000, CRC(76d5694c) SHA1(e2b155fc7178886eb37a532d961b99b8c864397c) )
|
||||
ROM_LOAD( "stkr-gr1.bin", 0x02000, 0x2000, CRC(4a5cc00b) SHA1(9ce46ed94e715a5997998aee6377baf2869ab3a6) )
|
||||
@ -1749,8 +1606,6 @@ ROM_START( triviag1 )
|
||||
ROM_LOAD( "tpg1-cd.bin", 0x2c000, 0x2000, CRC(35c9b9c2) SHA1(aac57022098656dac99bf9ceeaa2bf9a3d139986) )
|
||||
ROM_LOAD( "tpg1-ef.bin", 0x2e000, 0x2000, CRC(64878342) SHA1(dd93d64b3fe351a9d2bd4c473ecefde58f0b0041) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "tpg1-gr0.bin", 0x00000, 0x2000, CRC(20c9217a) SHA1(79ef058633149da8d2835405954ac31c661bf660) )
|
||||
ROM_LOAD( "tpg1-gr1.bin", 0x02000, 0x2000, CRC(d7f44504) SHA1(804dbc4c006b20bdb01bdf02754e0d98f6fbacbe) )
|
||||
@ -1773,8 +1628,6 @@ ROM_START( trivia12 )
|
||||
ROM_LOAD( "cd.u3a", 0x2c000, 0x2000, CRC(12d870ba) SHA1(b86a8cbf8037df78437056f5ff57e7b8b5e4c94e) )
|
||||
ROM_LOAD( "ef.u2a", 0x2e000, 0x2000, CRC(d902ee28) SHA1(18e3c96e1ac50f847d1b9f4f868f19e074d147ff) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr0.u9b", 0x00000, 0x2000, CRC(20c9217a) SHA1(79ef058633149da8d2835405954ac31c661bf660) )
|
||||
ROM_LOAD( "gr1.u8b", 0x02000, 0x2000, CRC(d7f44504) SHA1(804dbc4c006b20bdb01bdf02754e0d98f6fbacbe) )
|
||||
@ -1796,8 +1649,6 @@ ROM_START( triviag2 )
|
||||
ROM_LOAD( "cd45.bin", 0x28000, 0x4000, CRC(fc9c752a) SHA1(239507fb5d75e86aca295978aab1dd4514d8d761) )
|
||||
ROM_LOAD( "cd6ef.bin", 0x2c000, 0x4000, CRC(23b56fb8) SHA1(9ac726de69e4b374886a3542829745f7477d7556) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr01.bin", 0x00000, 0x4000, CRC(6829de8e) SHA1(4ec494883ba358f2ac7ce8d5a623a2f34b5bc843) )
|
||||
ROM_LOAD( "gr23.bin", 0x04000, 0x4000, CRC(89398700) SHA1(771ee04baa9a31d435a6234490105878713e7845) )
|
||||
@ -1816,8 +1667,6 @@ ROM_START( triviasp )
|
||||
ROM_LOAD( "allsport.3a", 0x28000, 0x4000, CRC(e45d09d6) SHA1(8bde18d25f8bd1056e42672d428473be23eab260) )
|
||||
ROM_LOAD( "allsport.1a", 0x2c000, 0x4000, CRC(8bb3e831) SHA1(ecc8fb0f2143e3ea03bb52773cc0a81d4dcc742d) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr01.bin", 0x00000, 0x4000, CRC(6829de8e) SHA1(4ec494883ba358f2ac7ce8d5a623a2f34b5bc843) )
|
||||
ROM_LOAD( "gr23.bin", 0x04000, 0x4000, CRC(89398700) SHA1(771ee04baa9a31d435a6234490105878713e7845) )
|
||||
@ -1836,8 +1685,6 @@ ROM_START( triviayp )
|
||||
ROM_LOAD( "cd45.bin", 0x28000, 0x4000, CRC(ac45809e) SHA1(1151c4e55f21a7e2eb8e163ac782b4449af84cdc) )
|
||||
ROM_LOAD( "cd6ef.bin", 0x2c000, 0x4000, CRC(a008059f) SHA1(45e4cfc259e801a189ec19fdc58135dbbbe130ea) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr01.bin", 0x00000, 0x4000, CRC(6829de8e) SHA1(4ec494883ba358f2ac7ce8d5a623a2f34b5bc843) )
|
||||
ROM_LOAD( "gr23.bin", 0x04000, 0x4000, CRC(89398700) SHA1(771ee04baa9a31d435a6234490105878713e7845) )
|
||||
@ -1856,8 +1703,6 @@ ROM_START( triviabb )
|
||||
ROM_LOAD( "cd45.u2a", 0x28000, 0x4000, CRC(07fd88ff) SHA1(c3168ecf6562e09790c4f18cdd91c7a347223323) )
|
||||
ROM_LOAD( "cd6ef.u1a", 0x2c000, 0x4000, CRC(2d03f241) SHA1(986ca6ea20c306e83ae88acc2d6837c7ed5fe351) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr01.u6b", 0x00000, 0x4000, CRC(6829de8e) SHA1(4ec494883ba358f2ac7ce8d5a623a2f34b5bc843) )
|
||||
ROM_LOAD( "gr23.u5b", 0x04000, 0x4000, CRC(89398700) SHA1(771ee04baa9a31d435a6234490105878713e7845) )
|
||||
@ -1880,8 +1725,6 @@ ROM_START( triviaes )
|
||||
ROM_LOAD( "tp_a6.bin", 0x28000, 0x04000, CRC(421c1a29) SHA1(3e0de8734a39fb887aff40e89cb0936d4cacf9a5) )
|
||||
ROM_LOAD( "tp_a3.bin", 0x2c000, 0x04000, CRC(c6254f46) SHA1(47f3d05d0c31983ed1576f91fa193fe58e80bb60) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "tp_gr3.bin", 0x00000, 0x4000, CRC(6829de8e) SHA1(4ec494883ba358f2ac7ce8d5a623a2f34b5bc843) )
|
||||
ROM_LOAD( "tp_gr2.bin", 0x04000, 0x4000, CRC(89398700) SHA1(771ee04baa9a31d435a6234490105878713e7845) )
|
||||
@ -1901,7 +1744,7 @@ ROM_START( triviaes2 )
|
||||
ROM_LOAD( "tpe-2cdef.u1a", 0x24000, 0x04000, CRC(22f9e1b4) SHA1(f5f5d9dadcd12f8e8f3a715854243f6da8678c23) )
|
||||
ROM_LOAD( "tpe-2ab45.u6a", 0x28000, 0x04000, CRC(cf48b8eb) SHA1(f63590bcdd7e17d85f4f490640785e8828358f93) )
|
||||
|
||||
SOUNDBOARD_ROMS // 2764 labeled with handwritten 'PANEA'
|
||||
// 2764 on sound board labeled with handwritten 'PANEA'
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) // all 27128
|
||||
ROM_LOAD( "tpegr01.u6b", 0x00000, 0x4000, CRC(6829de8e) SHA1(4ec494883ba358f2ac7ce8d5a623a2f34b5bc843) )
|
||||
@ -1918,8 +1761,6 @@ ROM_START( gimeabrk )
|
||||
ROM_LOAD( "ab45.u6a", 0x18000, 0x4000, CRC(5dca4f33) SHA1(aa45d5a960491c85f332f22cffe61999fe3db826) )
|
||||
ROM_LOAD( "cd6ef.u1a", 0x2c000, 0x4000, CRC(5e2b3510) SHA1(e3501b9bd73bc724aee0436700625bd2af94f72d) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr01.u6b", 0x00000, 0x4000, CRC(e3cdc476) SHA1(2f17c3f84767850d45192dfb507dd2716ecadc20) )
|
||||
ROM_LOAD( "gr23.u5b", 0x04000, 0x4000, CRC(0555d9c0) SHA1(da0d1f207ad056b2d82a5ad6382372066883d161) )
|
||||
@ -1940,8 +1781,6 @@ ROM_START( grudge )
|
||||
|
||||
ROM_LOAD( "gm-5a.bin", 0x38000, 0x8000, CRC(1de8dd2e) SHA1(6b538dcf35105bca1ae1bb5387a08b4d1d4f410c) ) // same as 2a, not being used, confirmed as identical on PCB
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gm-6a.bin", 0x00000, 0x8000, CRC(b9681f53) SHA1(bb0c516408f1769e018f0ec8707786d4d1e9ef7e) )
|
||||
|
||||
@ -1955,9 +1794,6 @@ ROM_START( grudgep )
|
||||
ROM_LOAD( "grudge.cd0", 0x20000, 0x8000, CRC(e51db1f2) SHA1(57fc0f1df358dd6ea982dcbe9c3f79b3f072be53) )
|
||||
ROM_LOAD( "grudge.cd4", 0x28000, 0x8000, CRC(6b60e47e) SHA1(5a399942d4ef9b7349fffd07c07092b667cf6247) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for Z80 */
|
||||
ROM_LOAD( "sentesnd", 0x00000, 0x2000, CRC(4dd0a525) SHA1(f0c447adc5b67917851a9df978df851247e75c43) )
|
||||
|
||||
ROM_REGION( 0x8000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "grudge.gr0", 0x00000, 0x8000, CRC(b9681f53) SHA1(bb0c516408f1769e018f0ec8707786d4d1e9ef7e) )
|
||||
|
||||
@ -1972,8 +1808,6 @@ ROM_START( minigolf )
|
||||
ROM_LOAD( "ab67.u5a", 0x1c000, 0x4000, CRC(6a311c9a) SHA1(b0409e5f4bd3bf898b8701561aac6dbbc28417bd) )
|
||||
ROM_LOAD( "1a-ver2", 0x20000, 0x10000, CRC(60b6cd58) SHA1(f79bf2d1f6c4e63f666073c5ecb22604c1ab57d8) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr01.u6b", 0x00000, 0x4000, CRC(8e24d594) SHA1(d35329fb78f90ec478418917aa1ef06d0967e6f8) )
|
||||
ROM_LOAD( "gr23.u5b", 0x04000, 0x4000, CRC(3bf355ef) SHA1(691df25b35b00e21ad09d17a21fe98a353aa3dda) )
|
||||
@ -1995,8 +1829,6 @@ ROM_START( minigolf2 )
|
||||
ROM_LOAD( "cd23.u3a", 0x24000, 0x4000, CRC(52279801) SHA1(d8de92c296d5c91db3bea7a0093260158961036e) )
|
||||
ROM_LOAD( "cd6ef.u1a", 0x2c000, 0x4000, CRC(34c64f4c) SHA1(ce55f5f6ebddcacf20cb78fb738b5f569b531b61) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr01.u6b", 0x00000, 0x4000, CRC(8e24d594) SHA1(d35329fb78f90ec478418917aa1ef06d0967e6f8) )
|
||||
ROM_LOAD( "gr23.u5b", 0x04000, 0x4000, CRC(3bf355ef) SHA1(691df25b35b00e21ad09d17a21fe98a353aa3dda) )
|
||||
@ -2020,8 +1852,6 @@ ROM_START( toggle )
|
||||
ROM_LOAD( "tgle-cd.bin", 0x2c000, 0x2000, CRC(0a2bb949) SHA1(350dc782fc21640794c6ecb502554cb693adbb7d) )
|
||||
ROM_LOAD( "tgle-ef.bin", 0x2e000, 0x2000, CRC(3ec10804) SHA1(ae719081e8114ccc23c6b24c7fe904a11fbdd992) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "tgle-gr0.bin", 0x00000, 0x2000, CRC(0e0e5d0e) SHA1(363858ce08767f8a9b8eaec56405377cdd74b178) )
|
||||
ROM_LOAD( "tgle-gr1.bin", 0x02000, 0x2000, CRC(3b141ad2) SHA1(72430fd616adbc72d86a5f10672572a31bed0b5d) )
|
||||
@ -2049,8 +1879,6 @@ ROM_START( nametune )
|
||||
ROM_LOAD( "nttcd6ef.bin", 0x2c000, 0x4000, CRC(0459e6f8) SHA1(7dbdbfa8f2e9e3956af926f5f782b8d3c3334099) )
|
||||
ROM_CONTINUE( 0x5c000, 0x4000 )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "nttgr0.bin", 0x00000, 0x8000, CRC(6b75bb4b) SHA1(e7131d112fb0b36985c5b6383700f55728a1c4fd) )
|
||||
|
||||
@ -2076,8 +1904,6 @@ ROM_START( nametune2 )
|
||||
ROM_LOAD( "cd 6 ef.u1a", 0x2c000, 0x4000, CRC(e73c7cda) SHA1(c6f751923d0c7930db2e173f680674759f94c8bb) )
|
||||
ROM_CONTINUE( 0x5c000, 0x4000 )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr 0.u3c", 0x00000, 0x8000, CRC(a0121b80) SHA1(ba38e9b738baac85fa33ae3751d02cb223fa3e65) )
|
||||
|
||||
@ -2105,8 +1931,6 @@ ROM_START( nstocker )
|
||||
ROM_LOAD( "cd45.u2a", 0x28000, 0x4000, CRC(9bb292fe) SHA1(6fc7abcc110c2cf7399d11a478cfdadb3439b6ab) )
|
||||
ROM_LOAD( "cd6ef.u1a", 0x2c000, 0x4000, CRC(e77c1aea) SHA1(9e2e595530cb15c634a6052c773ff5d998c0c828) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr01.u4c", 0x00000, 0x4000, CRC(fd0c38be) SHA1(b9e12e76f44f2b2b3ca6a57c58f0cbb019b1971f) )
|
||||
ROM_LOAD( "gr23.u3c", 0x04000, 0x4000, CRC(35d4433e) SHA1(399d04c2a29d993f77d0d5c2d62915081d4a85dd) )
|
||||
@ -2136,8 +1960,6 @@ ROM_START( nstocker2 )
|
||||
ROM_LOAD( "cd45.u2a", 0x28000, 0x4000, CRC(9bb292fe) SHA1(6fc7abcc110c2cf7399d11a478cfdadb3439b6ab) )
|
||||
ROM_LOAD( "cd6ef.u1a", 0x2c000, 0x4000, CRC(c77d2302) SHA1(2b0956a7d6bdff5e4f77084149a9528fb07154dc) ) // sldh
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr01.u4c", 0x00000, 0x4000, CRC(fd0c38be) SHA1(b9e12e76f44f2b2b3ca6a57c58f0cbb019b1971f) )
|
||||
ROM_LOAD( "gr23.u3c", 0x04000, 0x4000, CRC(35d4433e) SHA1(399d04c2a29d993f77d0d5c2d62915081d4a85dd) )
|
||||
@ -2164,8 +1986,6 @@ ROM_START( sfootbal )
|
||||
ROM_LOAD( "ab45.u6a", 0x18000, 0x4000, CRC(91ad42c5) SHA1(0b6fc3ed3a633c825809668d49f209c130f3e978) )
|
||||
ROM_LOAD( "cd6ef.u1a", 0x2c000, 0x4000, CRC(bf80bb1a) SHA1(2b70b36d946c36e3f354c7edfd3e34784ffce406) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr01.u4c", 0x00000, 0x4000, CRC(e3108d35) SHA1(05b7f1a1a18d7f72a3d3f6102cb8ab42421b7366) )
|
||||
ROM_LOAD( "gr23.u3c", 0x04000, 0x4000, CRC(5c5af726) SHA1(04cdd476e6689d17273659fb1fe0ca642edbe5a8) )
|
||||
@ -2185,8 +2005,6 @@ ROM_START( spiker )
|
||||
ROM_LOAD( "ab23.u7a", 0x14000, 0x4000, CRC(3be87edf) SHA1(0d4f1ff501d5d865abc3906f6b232ec04586d3dc) )
|
||||
ROM_LOAD( "cd6ef.u1a", 0x2c000, 0x4000, CRC(f2c73ece) SHA1(4fc108823102fd17c5b7d9be1a0c76667788ba1a) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr01.u4c", 0x00000, 0x4000, CRC(0caa6e3e) SHA1(ce6765d44e444d24129ec99f04a41a866a32eee2) )
|
||||
ROM_LOAD( "gr23.u3c", 0x04000, 0x4000, CRC(970c81f6) SHA1(f22189e172a795d115597feb48ccbc04be3859b9) )
|
||||
@ -2205,8 +2023,6 @@ ROM_START( spiker2 ) /* Spiker U.R. 5/5/86 */
|
||||
ROM_LOAD( "ab23.u7a", 0x14000, 0x4000, CRC(ffb23288) SHA1(3458e486794f6c936d15e837be0f419027b01311) ) // sldh
|
||||
ROM_LOAD( "cd6ef.u1a", 0x2c000, 0x4000, CRC(7f04774d) SHA1(c49ac3aa86425cdbab9877fc253999329bb99a49) ) // sldh
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr01.u4c", 0x00000, 0x4000, CRC(1228b7a3) SHA1(70a207714ba7bc4f4dbc492768480afa424b31c0) ) // sldh
|
||||
ROM_LOAD( "gr23.u3c", 0x04000, 0x4000, CRC(970c81f6) SHA1(f22189e172a795d115597feb48ccbc04be3859b9) )
|
||||
@ -2225,8 +2041,6 @@ ROM_START( spiker3 ) /* Spiker U.R. 6/9/86 */
|
||||
ROM_LOAD( "ab23.u7a", 0x14000, 0x4000, CRC(3be87edf) SHA1(0d4f1ff501d5d865abc3906f6b232ec04586d3dc) )
|
||||
ROM_LOAD( "cd6ef.u1a", 0x2c000, 0x4000, CRC(5b5a6d86) SHA1(a173637991601adc87f0fc8fd1ee9102f5fb2b81) ) // sldh
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr01.u4c", 0x00000, 0x4000, CRC(0caa6e3e) SHA1(ce6765d44e444d24129ec99f04a41a866a32eee2) )
|
||||
ROM_LOAD( "gr23.u3c", 0x04000, 0x4000, CRC(970c81f6) SHA1(f22189e172a795d115597feb48ccbc04be3859b9) )
|
||||
@ -2248,8 +2062,6 @@ ROM_START( stompin )
|
||||
ROM_LOAD( "cd 23.u3a", 0x24000, 0x4000, CRC(52b29048) SHA1(e0873137201ad9b2e87a17dd68046e88dbeeb5e1) )
|
||||
ROM_LOAD( "cd 6 ef.u1a", 0x2c000, 0x4000, CRC(b880961a) SHA1(11700af516517b7176a840fd5a8fd5ed0fb9bd6e) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr 01.u4c", 0x00000, 0x4000, CRC(14ffdd1e) SHA1(4528548c07789f9dca2cabd2c64ea1ff8f36a99e) )
|
||||
ROM_LOAD( "gr 23.u3c", 0x04000, 0x4000, CRC(761abb80) SHA1(a1278e93a4fa66cc4d347954dd45121120da568d) )
|
||||
@ -2270,8 +2082,6 @@ ROM_START( rescraid )
|
||||
ROM_LOAD( "cd 8.a16", 0x20000, 0x8000, CRC(90917a43) SHA1(3abd68d0c147ed792ace41f701c04bc225efede4) )
|
||||
ROM_LOAD( "cd 12.a18", 0x28000, 0x8000, CRC(0450e9d7) SHA1(b5d0a79d1bac3596d241f80ac4e3e13c98d28709) )
|
||||
|
||||
SOUNDBOARD_ROMS
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr 0.a5", 0x00000, 0x8000, CRC(e0dfc133) SHA1(0b120b4410098d8db26b5819043d4fe7c426b948) )
|
||||
ROM_LOAD( "gr 4.a7", 0x08000, 0x8000, CRC(952ade30) SHA1(f065368f645616d6d84be469ba45a9afa8788eda) )
|
||||
@ -2294,9 +2104,6 @@ ROM_START( rescraida )
|
||||
ROM_LOAD( "cd8-sa.a16", 0x20000, 0x8000, CRC(9dfb50c2) SHA1(24280b48106cbcedeb6d7b10f951db906a123819) )
|
||||
ROM_LOAD( "cd12-sa.a18", 0x28000, 0x8000, CRC(18c62613) SHA1(a55b4b948805bdd5d1e8c8ff803826a7bbfa383e) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for Z80 */
|
||||
ROM_LOAD( "sentesnd", 0x00000, 0x2000, CRC(4dd0a525) SHA1(f0c447adc5b67917851a9df978df851247e75c43) )
|
||||
|
||||
ROM_REGION( 0x10000, "gfx1", 0 ) /* up to 64k of sprites */
|
||||
ROM_LOAD( "gr0.a5", 0x00000, 0x8000, CRC(e0dfc133) SHA1(0b120b4410098d8db26b5819043d4fe7c426b948) )
|
||||
ROM_LOAD( "gr4.a7", 0x08000, 0x8000, CRC(952ade30) SHA1(f065368f645616d6d84be469ba45a9afa8788eda) )
|
||||
@ -2321,9 +2128,6 @@ ROM_START( shrike )
|
||||
ROM_LOAD( "savgu21.bin", 0x2c000, 0x2000, CRC(c22b93e1) SHA1(15d3925abb3e7e928925f5781f228d1bc0dfe31c) )
|
||||
ROM_LOAD( "savgu36.bin", 0x2e000, 0x2000, CRC(28431c4a) SHA1(522df8224c559f51c36d2bc01c189b019fabc5eb) )
|
||||
|
||||
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for Z80 */
|
||||
ROM_LOAD( "sentesnd", 0x00000, 0x2000, CRC(4dd0a525) SHA1(f0c447adc5b67917851a9df978df851247e75c43) )
|
||||
|
||||
ROM_REGION( 0x4000, "68k", 0 ) /* 16k for M68000 */
|
||||
ROM_LOAD16_BYTE( "savgu22.bin", 0x00000, 0x2000, CRC(c7787162) SHA1(52d8d148206c6ceb9c28ba747b301121a7790802) )
|
||||
ROM_LOAD16_BYTE( "savgu24.bin", 0x00001, 0x2000, CRC(a9105ca8) SHA1(1a94a052a4a8d221e1eafec0cd5b0ada6f1987f4) )
|
||||
|
@ -13,11 +13,9 @@
|
||||
#pragma once
|
||||
|
||||
#include "machine/6850acia.h"
|
||||
#include "machine/pit8253.h"
|
||||
#include "machine/timer.h"
|
||||
#include "machine/x2212.h"
|
||||
#include "machine/74259.h"
|
||||
#include "sound/cem3394.h"
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
|
||||
@ -45,9 +43,6 @@ public:
|
||||
balsente_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_scanline_timer(*this, "scan_timer")
|
||||
, m_pit(*this, "pit")
|
||||
, m_counter_0_timer(*this, "8253_0_timer")
|
||||
, m_cem_device(*this, "cem%u", 1U)
|
||||
, m_spriteram(*this, "spriteram")
|
||||
, m_videoram(*this, "videoram")
|
||||
, m_shrike_io(*this, "shrike_io")
|
||||
@ -60,7 +55,6 @@ public:
|
||||
, m_outlatch(*this, "outlatch")
|
||||
, m_novram(*this, "nov%u", 0U)
|
||||
, m_acia(*this, "acia")
|
||||
, m_audiouart(*this, "audiouart")
|
||||
, m_generic_paletteram_8(*this, "paletteram")
|
||||
{ }
|
||||
|
||||
@ -111,14 +105,8 @@ private:
|
||||
DECLARE_READ8_MEMBER(novram_8bit_r);
|
||||
DECLARE_WRITE8_MEMBER(novram_8bit_w);
|
||||
DECLARE_WRITE8_MEMBER(acia_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(uint_propagate_w);
|
||||
DECLARE_READ8_MEMBER(adc_data_r);
|
||||
DECLARE_WRITE8_MEMBER(adc_select_w);
|
||||
DECLARE_READ8_MEMBER(counter_state_r);
|
||||
DECLARE_WRITE8_MEMBER(counter_control_w);
|
||||
DECLARE_WRITE8_MEMBER(chip_select_w);
|
||||
DECLARE_WRITE8_MEMBER(dac_data_w);
|
||||
DECLARE_WRITE8_MEMBER(register_addr_w);
|
||||
DECLARE_WRITE8_MEMBER(spiker_expand_w);
|
||||
DECLARE_READ8_MEMBER(spiker_expand_r);
|
||||
DECLARE_READ8_MEMBER(grudge_steering_r);
|
||||
@ -128,9 +116,7 @@ private:
|
||||
DECLARE_READ16_MEMBER(shrike_io_68k_r);
|
||||
DECLARE_READ8_MEMBER(teamht_extra_r);
|
||||
DECLARE_WRITE8_MEMBER(teamht_multiplex_select_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(counter_0_set_out);
|
||||
|
||||
void update_counter_0_timer();
|
||||
DECLARE_WRITE8_MEMBER(videoram_w);
|
||||
DECLARE_WRITE8_MEMBER(palette_select_w);
|
||||
DECLARE_WRITE8_MEMBER(paletteram_w);
|
||||
@ -144,32 +130,21 @@ private:
|
||||
TIMER_CALLBACK_MEMBER(irq_off);
|
||||
TIMER_CALLBACK_MEMBER(adc_finished);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(interrupt_timer);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(clock_counter_0_ff);
|
||||
void draw_one_sprite(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *sprite);
|
||||
void poly17_init();
|
||||
DECLARE_WRITE_LINE_MEMBER(set_counter_0_ff);
|
||||
void update_grudge_steering();
|
||||
void expand_roms(uint8_t cd_rom_mask);
|
||||
inline void config_shooter_adc(uint8_t shooter, uint8_t adc_shift);
|
||||
inline void noise_gen_chip(int chip, int count, short *buffer);
|
||||
CEM3394_EXT_INPUT(noise_gen_0);
|
||||
CEM3394_EXT_INPUT(noise_gen_1);
|
||||
CEM3394_EXT_INPUT(noise_gen_2);
|
||||
CEM3394_EXT_INPUT(noise_gen_3);
|
||||
CEM3394_EXT_INPUT(noise_gen_4);
|
||||
CEM3394_EXT_INPUT(noise_gen_5);
|
||||
|
||||
void cpu1_base_map(address_map &map);
|
||||
void cpu1_map(address_map &map);
|
||||
void cpu1_smudge_map(address_map &map);
|
||||
void cpu2_io_map(address_map &map);
|
||||
void cpu2_map(address_map &map);
|
||||
void cpu2_triviamb_io_map(address_map &map);
|
||||
void cpu2_triviamb_map(address_map &map);
|
||||
void shrike68k_map(address_map &map);
|
||||
|
||||
required_device<timer_device> m_scanline_timer;
|
||||
required_device<pit8253_device> m_pit;
|
||||
|
||||
|
||||
/* global data */
|
||||
uint8_t m_shooter;
|
||||
@ -177,33 +152,13 @@ private:
|
||||
uint8_t m_shooter_y;
|
||||
uint8_t m_adc_shift;
|
||||
|
||||
/* manually clocked counter 0 states */
|
||||
uint8_t m_counter_control;
|
||||
bool m_counter_0_ff;
|
||||
bool m_counter_0_out;
|
||||
required_device<timer_device> m_counter_0_timer;
|
||||
bool m_counter_0_timer_active;
|
||||
|
||||
/* random number generator states */
|
||||
uint8_t m_poly17[POLY17_SIZE + 1];
|
||||
uint8_t m_rand17[POLY17_SIZE + 1];
|
||||
|
||||
/* ADC I/O states */
|
||||
int8_t m_analog_input_data[4];
|
||||
uint8_t m_adc_value;
|
||||
|
||||
/* CEM3394 DAC control states */
|
||||
uint16_t m_dac_value;
|
||||
uint8_t m_dac_register;
|
||||
uint8_t m_chip_select;
|
||||
|
||||
/* sound CPU 6850 states */
|
||||
bool m_uint;
|
||||
|
||||
/* noise generator states */
|
||||
uint32_t m_noise_position[6];
|
||||
required_device_array<cem3394_device, 6> m_cem_device;
|
||||
|
||||
/* game-specific states */
|
||||
uint8_t m_nstocker_bits;
|
||||
uint8_t m_spiker_expand_color;
|
||||
@ -226,14 +181,13 @@ private:
|
||||
optional_shared_ptr<uint16_t> m_shrike_io;
|
||||
optional_shared_ptr<uint16_t> m_shrike_shared;
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
optional_device<cpu_device> m_audiocpu;
|
||||
optional_device<cpu_device> m_68k;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
required_device<ls259_device> m_outlatch;
|
||||
required_device_array<x2212_device, 2> m_novram;
|
||||
required_device<acia6850_device> m_acia;
|
||||
required_device<acia6850_device> m_audiouart;
|
||||
required_shared_ptr<uint8_t> m_generic_paletteram_8;
|
||||
};
|
||||
|
||||
|
@ -11,11 +11,8 @@
|
||||
#include "emu.h"
|
||||
#include "cpu/m6809/m6809.h"
|
||||
#include "includes/balsente.h"
|
||||
#include "sound/cem3394.h"
|
||||
|
||||
|
||||
#define LOG_CEM_WRITES 0
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Interrupt handling
|
||||
@ -69,29 +66,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(balsente_state::interrupt_timer)
|
||||
|
||||
void balsente_state::machine_start()
|
||||
{
|
||||
/* create the polynomial tables */
|
||||
poly17_init();
|
||||
|
||||
m_acia->write_cts(0);
|
||||
m_acia->write_dcd(0);
|
||||
m_audiouart->write_cts(0);
|
||||
m_audiouart->write_dcd(0);
|
||||
|
||||
save_item(NAME(m_counter_control));
|
||||
save_item(NAME(m_counter_0_ff));
|
||||
save_item(NAME(m_counter_0_out));
|
||||
save_item(NAME(m_counter_0_timer_active));
|
||||
|
||||
save_item(NAME(m_analog_input_data));
|
||||
save_item(NAME(m_adc_value));
|
||||
|
||||
save_item(NAME(m_dac_value));
|
||||
save_item(NAME(m_dac_register));
|
||||
save_item(NAME(m_chip_select));
|
||||
|
||||
save_item(NAME(m_uint));
|
||||
|
||||
save_item(NAME(m_noise_position));
|
||||
|
||||
save_item(NAME(m_nstocker_bits));
|
||||
save_item(NAME(m_spiker_expand_color));
|
||||
@ -104,31 +80,17 @@ void balsente_state::machine_start()
|
||||
|
||||
void balsente_state::machine_reset()
|
||||
{
|
||||
int numbanks;
|
||||
|
||||
/* reset the manual counter 0 clock */
|
||||
m_counter_control = 0x00;
|
||||
m_counter_0_ff = false;
|
||||
m_counter_0_out = false;
|
||||
m_counter_0_timer_active = false;
|
||||
m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
|
||||
/* create the polynomial tables */
|
||||
poly17_init();
|
||||
|
||||
/* reset the ADC states */
|
||||
m_adc_value = 0;
|
||||
|
||||
/* reset the CEM3394 I/O states */
|
||||
m_dac_value = 0;
|
||||
m_dac_register = 0;
|
||||
m_chip_select = 0x3f;
|
||||
|
||||
/* reset game-specific states */
|
||||
m_grudge_steering_result = 0;
|
||||
|
||||
/* reset the noise generator */
|
||||
memset(m_noise_position, 0, sizeof(m_noise_position));
|
||||
|
||||
/* point the banks to bank 0 */
|
||||
numbanks = (memregion("maincpu")->bytes() > 0x40000) ? 16 : 8;
|
||||
int numbanks = (memregion("maincpu")->bytes() > 0x40000) ? 16 : 8;
|
||||
membank("bank1")->configure_entries(0, numbanks, &memregion("maincpu")->base()[0x10000], 0x6000);
|
||||
membank("bank2")->configure_entries(0, numbanks, &memregion("maincpu")->base()[0x12000], 0x6000);
|
||||
membank("bank1")->set_entry(0);
|
||||
@ -143,7 +105,7 @@ void balsente_state::machine_reset()
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* MM5837 noise generator
|
||||
* Hardware random numbers
|
||||
*
|
||||
* NOTE: this is stolen straight from
|
||||
* POKEY.c
|
||||
@ -153,17 +115,15 @@ void balsente_state::machine_reset()
|
||||
void balsente_state::poly17_init()
|
||||
{
|
||||
uint32_t i, x = 0;
|
||||
uint8_t *p, *r;
|
||||
uint8_t *r;
|
||||
|
||||
/* allocate memory */
|
||||
p = m_poly17;
|
||||
r = m_rand17;
|
||||
|
||||
/* generate the polynomial */
|
||||
for (i = 0; i < POLY17_SIZE; i++)
|
||||
{
|
||||
/* store new values */
|
||||
*p++ = x & 1;
|
||||
*r++ = x >> 3;
|
||||
|
||||
/* calculate next bit */
|
||||
@ -171,37 +131,6 @@ void balsente_state::poly17_init()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline void balsente_state::noise_gen_chip(int chip, int count, short *buffer)
|
||||
{
|
||||
/* noise generator runs at 100kHz */
|
||||
uint32_t step = (100000 << 14) / cem3394_device::SAMPLE_RATE;
|
||||
uint32_t noise_counter = m_noise_position[chip];
|
||||
|
||||
while (count--)
|
||||
{
|
||||
*buffer++ = m_poly17[(noise_counter >> 14) & POLY17_SIZE] << 12;
|
||||
noise_counter += step;
|
||||
}
|
||||
|
||||
/* remember the noise position */
|
||||
m_noise_position[chip] = noise_counter;
|
||||
}
|
||||
|
||||
CEM3394_EXT_INPUT(balsente_state::noise_gen_0) { noise_gen_chip(0, count, buffer); }
|
||||
CEM3394_EXT_INPUT(balsente_state::noise_gen_1) { noise_gen_chip(1, count, buffer); }
|
||||
CEM3394_EXT_INPUT(balsente_state::noise_gen_2) { noise_gen_chip(2, count, buffer); }
|
||||
CEM3394_EXT_INPUT(balsente_state::noise_gen_3) { noise_gen_chip(3, count, buffer); }
|
||||
CEM3394_EXT_INPUT(balsente_state::noise_gen_4) { noise_gen_chip(4, count, buffer); }
|
||||
CEM3394_EXT_INPUT(balsente_state::noise_gen_5) { noise_gen_chip(5, count, buffer); }
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Hardware random numbers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
WRITE8_MEMBER(balsente_state::random_reset_w)
|
||||
{
|
||||
/* reset random number generator */
|
||||
@ -333,12 +262,6 @@ WRITE8_MEMBER(balsente_state::acia_w)
|
||||
m_acia->write(space, offset, (BIT(offset, 0) && data == 0xe0) ? 0 : data);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(balsente_state::uint_propagate_w)
|
||||
{
|
||||
if (state && BIT(m_counter_control, 5))
|
||||
m_audiocpu->set_input_line(INPUT_LINE_NMI, m_uint ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
@ -437,236 +360,6 @@ WRITE8_MEMBER(balsente_state::teamht_multiplex_select_w)
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Sound CPU counter 0 emulation
|
||||
*
|
||||
*************************************/
|
||||
|
||||
WRITE_LINE_MEMBER(balsente_state::counter_0_set_out)
|
||||
{
|
||||
/* OUT on counter 0 is hooked to the GATE line on counter 1 through an inverter */
|
||||
m_pit->write_gate1(!state);
|
||||
|
||||
/* remember the out state */
|
||||
m_counter_0_out = state;
|
||||
}
|
||||
|
||||
|
||||
WRITE_LINE_MEMBER(balsente_state::set_counter_0_ff)
|
||||
{
|
||||
/* the flip/flop output is inverted, so if we went high to low, that's a clock */
|
||||
m_pit->write_clk0(!state);
|
||||
|
||||
/* remember the new state */
|
||||
m_counter_0_ff = state;
|
||||
}
|
||||
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(balsente_state::clock_counter_0_ff)
|
||||
{
|
||||
/* clock the D value through the flip-flop */
|
||||
set_counter_0_ff(BIT(m_counter_control, 3));
|
||||
}
|
||||
|
||||
|
||||
void balsente_state::update_counter_0_timer()
|
||||
{
|
||||
double maxfreq = 0.0;
|
||||
int i;
|
||||
|
||||
/* if there's already a timer, remove it */
|
||||
if (m_counter_0_timer_active)
|
||||
m_counter_0_timer->reset();
|
||||
m_counter_0_timer_active = false;
|
||||
|
||||
/* find the counter with the maximum frequency */
|
||||
/* this is used to calibrate the timers at startup */
|
||||
for (i = 0; i < 6; i++)
|
||||
if (m_cem_device[i]->get_parameter(cem3394_device::FINAL_GAIN) < 10.0)
|
||||
{
|
||||
double tempfreq;
|
||||
|
||||
/* if the filter resonance is high, then they're calibrating the filter frequency */
|
||||
if (m_cem_device[i]->get_parameter(cem3394_device::FILTER_RESONANCE) > 0.9)
|
||||
tempfreq = m_cem_device[i]->get_parameter(cem3394_device::FILTER_FREQENCY);
|
||||
|
||||
/* otherwise, they're calibrating the VCO frequency */
|
||||
else
|
||||
tempfreq = m_cem_device[i]->get_parameter(cem3394_device::VCO_FREQUENCY);
|
||||
|
||||
if (tempfreq > maxfreq) maxfreq = tempfreq;
|
||||
}
|
||||
|
||||
/* reprime the timer */
|
||||
if (maxfreq > 0.0)
|
||||
{
|
||||
m_counter_0_timer_active = true;
|
||||
m_counter_0_timer->adjust(attotime::from_hz(maxfreq), 0, attotime::from_hz(maxfreq));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Sound CPU counter handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
READ8_MEMBER(balsente_state::counter_state_r)
|
||||
{
|
||||
/* bit D0 is the inverse of the flip-flop state */
|
||||
int result = !m_counter_0_ff;
|
||||
|
||||
/* bit D1 is the OUT value from counter 0 */
|
||||
if (m_counter_0_out) result |= 0x02;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(balsente_state::counter_control_w)
|
||||
{
|
||||
uint8_t diff_counter_control = m_counter_control ^ data;
|
||||
|
||||
/* set the new global value */
|
||||
m_counter_control = data;
|
||||
|
||||
/* bit D0 enables/disables audio */
|
||||
if (BIT(diff_counter_control, 0))
|
||||
{
|
||||
for (auto & elem : m_cem_device)
|
||||
elem->set_output_gain(0, BIT(data, 0) ? 1.0 : 0);
|
||||
}
|
||||
|
||||
/* bit D1 is hooked to counter 0's gate */
|
||||
if (BIT(diff_counter_control, 1))
|
||||
{
|
||||
/* if we gate on, start a pulsing timer to clock it */
|
||||
if (BIT(data, 1) && !m_counter_0_timer_active)
|
||||
{
|
||||
update_counter_0_timer();
|
||||
}
|
||||
|
||||
/* if we gate off, remove the timer */
|
||||
else if (!BIT(data, 1) && m_counter_0_timer_active)
|
||||
{
|
||||
m_counter_0_timer->reset();
|
||||
m_counter_0_timer_active = false;
|
||||
}
|
||||
}
|
||||
|
||||
/* set the actual gate */
|
||||
m_pit->write_gate0(BIT(data, 1));
|
||||
|
||||
/* bits D2 and D4 control the clear/reset flags on the flip-flop that feeds counter 0 */
|
||||
if (!BIT(data, 4))
|
||||
set_counter_0_ff(0);
|
||||
else if (!BIT(data, 2))
|
||||
set_counter_0_ff(1);
|
||||
|
||||
/* bit 5 clears the NMI interrupt */
|
||||
if (BIT(diff_counter_control, 5) && !BIT(data, 5))
|
||||
m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* CEM3394 Interfaces
|
||||
*
|
||||
*************************************/
|
||||
|
||||
WRITE8_MEMBER(balsente_state::chip_select_w)
|
||||
{
|
||||
static constexpr uint8_t register_map[8] =
|
||||
{
|
||||
cem3394_device::VCO_FREQUENCY,
|
||||
cem3394_device::FINAL_GAIN,
|
||||
cem3394_device::FILTER_RESONANCE,
|
||||
cem3394_device::FILTER_FREQENCY,
|
||||
cem3394_device::MIXER_BALANCE,
|
||||
cem3394_device::MODULATION_AMOUNT,
|
||||
cem3394_device::PULSE_WIDTH,
|
||||
cem3394_device::WAVE_SELECT
|
||||
};
|
||||
|
||||
double voltage = (double)m_dac_value * (8.0 / 4096.0) - 4.0;
|
||||
int diffchip = data ^ m_chip_select, i;
|
||||
int reg = register_map[m_dac_register];
|
||||
|
||||
/* remember the new select value */
|
||||
m_chip_select = data;
|
||||
|
||||
/* check all six chip enables */
|
||||
for (i = 0; i < 6; i++)
|
||||
if ((diffchip & (1 << i)) && (data & (1 << i)))
|
||||
{
|
||||
#if LOG_CEM_WRITES
|
||||
double temp = 0;
|
||||
|
||||
/* remember the previous value */
|
||||
temp =
|
||||
#endif
|
||||
m_cem_device[i]->get_parameter(reg);
|
||||
|
||||
/* set the voltage */
|
||||
m_cem_device[i]->set_voltage(reg, voltage);
|
||||
|
||||
/* only log changes */
|
||||
#if LOG_CEM_WRITES
|
||||
if (temp != m_cem_device[i]->get_parameter(reg))
|
||||
{
|
||||
static const char *const names[] =
|
||||
{
|
||||
"VCO_FREQUENCY",
|
||||
"FINAL_GAIN",
|
||||
"FILTER_RESONANCE",
|
||||
"FILTER_FREQENCY",
|
||||
"MIXER_BALANCE",
|
||||
"MODULATION_AMOUNT",
|
||||
"PULSE_WIDTH",
|
||||
"WAVE_SELECT"
|
||||
};
|
||||
logerror("s%04X: CEM#%d:%s=%f\n", m_audiocpu->pcbase(), i, names[m_dac_register], voltage);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* if a timer for counter 0 is running, recompute */
|
||||
if (m_counter_0_timer_active)
|
||||
update_counter_0_timer();
|
||||
}
|
||||
|
||||
|
||||
|
||||
WRITE8_MEMBER(balsente_state::dac_data_w)
|
||||
{
|
||||
/* LSB or MSB? */
|
||||
if (offset & 1)
|
||||
m_dac_value = (m_dac_value & 0xfc0) | ((data >> 2) & 0x03f);
|
||||
else
|
||||
m_dac_value = (m_dac_value & 0x03f) | ((data << 6) & 0xfc0);
|
||||
|
||||
/* if there are open channels, force the values in */
|
||||
if ((m_chip_select & 0x3f) != 0x3f)
|
||||
{
|
||||
uint8_t temp = m_chip_select;
|
||||
chip_select_w(space, 0, 0x3f);
|
||||
chip_select_w(space, 0, temp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(balsente_state::register_addr_w)
|
||||
{
|
||||
m_dac_register = data & 7;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Game-specific handlers
|
||||
|
Loading…
Reference in New Issue
Block a user