mirror of
https://github.com/holub/mame
synced 2025-04-25 09:50:04 +03:00
williams.cpp : Cleanups (#3660)
* williams.cpp : Reduce runtime tag lookups, Add input_merger for interrupts, Reduce duplicates, Fix naming, Device'd palette for williams_state/blaster_state games, Split spdball Address map audio/williams.cpp : Reduce runtime tag lookups, Cleanup duplicates * williams.cpp : output_finder
This commit is contained in:
parent
5d4a34c9d2
commit
afb2f40678
@ -76,6 +76,7 @@ williams_cvsd_sound_device::williams_cvsd_sound_device(const machine_config &mco
|
||||
m_cpu(*this, "cpu"),
|
||||
m_pia(*this, "pia"),
|
||||
m_hc55516(*this, "cvsd"),
|
||||
m_rombank(*this, "rombank"),
|
||||
m_talkback(0)
|
||||
{
|
||||
}
|
||||
@ -118,7 +119,7 @@ WRITE_LINE_MEMBER(williams_cvsd_sound_device::reset_write)
|
||||
|
||||
WRITE8_MEMBER(williams_cvsd_sound_device::bank_select_w)
|
||||
{
|
||||
membank("rombank")->set_entry(data & 0x0f);
|
||||
m_rombank->set_entry(data & 0x0f);
|
||||
}
|
||||
|
||||
|
||||
@ -214,9 +215,9 @@ void williams_cvsd_sound_device::device_start()
|
||||
// D3 -> A16
|
||||
//
|
||||
offs_t offset = 0x8000 * ((bank >> 2) & 3) + 0x20000 * (bank & 3);
|
||||
membank("rombank")->configure_entry(bank, &rom[0x10000 + offset]);
|
||||
m_rombank->configure_entry(bank, &rom[0x10000 + offset]);
|
||||
}
|
||||
membank("rombank")->set_entry(0);
|
||||
m_rombank->set_entry(0);
|
||||
|
||||
// reset the IRQ state
|
||||
m_pia->ca1_w(1);
|
||||
@ -264,9 +265,10 @@ void williams_cvsd_sound_device::device_timer(emu_timer &timer, device_timer_id
|
||||
williams_narc_sound_device::williams_narc_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, WILLIAMS_NARC_SOUND, tag, owner, clock),
|
||||
device_mixer_interface(mconfig, *this),
|
||||
m_cpu0(*this, "cpu0"),
|
||||
m_cpu1(*this, "cpu1"),
|
||||
m_cpu(*this, "cpu%u", 0U),
|
||||
m_hc55516(*this, "cvsd"),
|
||||
m_masterbank(*this, "masterbank"),
|
||||
m_slavebank(*this, "slavebank"),
|
||||
m_latch(0),
|
||||
m_latch2(0),
|
||||
m_talkback(0),
|
||||
@ -307,18 +309,18 @@ WRITE_LINE_MEMBER(williams_narc_sound_device::reset_write)
|
||||
// going high halts the CPU
|
||||
if (state)
|
||||
{
|
||||
master_bank_select_w(m_cpu0->space(), 0, 0);
|
||||
slave_bank_select_w(m_cpu1->space(), 0, 0);
|
||||
master_bank_select_w(m_cpu[0]->space(), 0, 0);
|
||||
slave_bank_select_w(m_cpu[1]->space(), 0, 0);
|
||||
device_reset();
|
||||
m_cpu0->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
|
||||
m_cpu1->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
|
||||
m_cpu[0]->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
|
||||
m_cpu[1]->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
|
||||
}
|
||||
|
||||
// going low resets and reactivates the CPU
|
||||
else
|
||||
{
|
||||
m_cpu0->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
|
||||
m_cpu1->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
|
||||
m_cpu[0]->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
|
||||
m_cpu[1]->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -330,7 +332,7 @@ WRITE_LINE_MEMBER(williams_narc_sound_device::reset_write)
|
||||
|
||||
WRITE8_MEMBER(williams_narc_sound_device::master_bank_select_w)
|
||||
{
|
||||
membank("masterbank")->set_entry(data & 0x0f);
|
||||
m_masterbank->set_entry(data & 0x0f);
|
||||
}
|
||||
|
||||
|
||||
@ -341,7 +343,7 @@ WRITE8_MEMBER(williams_narc_sound_device::master_bank_select_w)
|
||||
|
||||
WRITE8_MEMBER(williams_narc_sound_device::slave_bank_select_w)
|
||||
{
|
||||
membank("slavebank")->set_entry(data & 0x0f);
|
||||
m_slavebank->set_entry(data & 0x0f);
|
||||
}
|
||||
|
||||
|
||||
@ -352,7 +354,7 @@ WRITE8_MEMBER(williams_narc_sound_device::slave_bank_select_w)
|
||||
|
||||
READ8_MEMBER(williams_narc_sound_device::command_r)
|
||||
{
|
||||
m_cpu0->set_input_line(M6809_IRQ_LINE, CLEAR_LINE);
|
||||
m_cpu[0]->set_input_line(M6809_IRQ_LINE, CLEAR_LINE);
|
||||
m_sound_int_state = 0;
|
||||
return m_latch;
|
||||
}
|
||||
@ -376,7 +378,7 @@ WRITE8_MEMBER(williams_narc_sound_device::command2_w)
|
||||
|
||||
READ8_MEMBER(williams_narc_sound_device::command2_r)
|
||||
{
|
||||
m_cpu1->set_input_line(M6809_FIRQ_LINE, CLEAR_LINE);
|
||||
m_cpu[1]->set_input_line(M6809_FIRQ_LINE, CLEAR_LINE);
|
||||
return m_latch2;
|
||||
}
|
||||
|
||||
@ -533,7 +535,7 @@ void williams_narc_sound_device::device_start()
|
||||
// D3 -> A16
|
||||
//
|
||||
offs_t offset = 0x8000 * (bank & 1) + 0x10000 * ((bank >> 3) & 1) + 0x20000 * ((bank >> 1) & 3);
|
||||
membank("masterbank")->configure_entry(bank, &rom[0x10000 + offset]);
|
||||
m_masterbank->configure_entry(bank, &rom[0x10000 + offset]);
|
||||
}
|
||||
membank("masterupper")->set_base(&rom[0x10000 + 0x4000 + 0x8000 + 0x10000 + 0x20000 * 3]);
|
||||
|
||||
@ -547,7 +549,7 @@ void williams_narc_sound_device::device_start()
|
||||
// D3 -> A16
|
||||
//
|
||||
offs_t offset = 0x8000 * (bank & 1) + 0x10000 * ((bank >> 3) & 1) + 0x20000 * ((bank >> 1) & 3);
|
||||
membank("slavebank")->configure_entry(bank, &rom[0x10000 + offset]);
|
||||
m_slavebank->configure_entry(bank, &rom[0x10000 + offset]);
|
||||
}
|
||||
membank("slaveupper")->set_base(&rom[0x10000 + 0x4000 + 0x8000 + 0x10000 + 0x20000 * 3]);
|
||||
|
||||
@ -568,12 +570,12 @@ void williams_narc_sound_device::device_reset()
|
||||
{
|
||||
// reset interrupt states
|
||||
m_sound_int_state = 0;
|
||||
m_cpu0->set_input_line(M6809_FIRQ_LINE, CLEAR_LINE);
|
||||
m_cpu0->set_input_line(M6809_IRQ_LINE, CLEAR_LINE);
|
||||
m_cpu0->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
|
||||
m_cpu1->set_input_line(M6809_FIRQ_LINE, CLEAR_LINE);
|
||||
m_cpu1->set_input_line(M6809_IRQ_LINE, CLEAR_LINE);
|
||||
m_cpu1->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
|
||||
m_cpu[0]->set_input_line(M6809_FIRQ_LINE, CLEAR_LINE);
|
||||
m_cpu[0]->set_input_line(M6809_IRQ_LINE, CLEAR_LINE);
|
||||
m_cpu[0]->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
|
||||
m_cpu[1]->set_input_line(M6809_FIRQ_LINE, CLEAR_LINE);
|
||||
m_cpu[1]->set_input_line(M6809_IRQ_LINE, CLEAR_LINE);
|
||||
m_cpu[1]->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
@ -587,17 +589,17 @@ void williams_narc_sound_device::device_timer(emu_timer &timer, device_timer_id
|
||||
{
|
||||
case TID_MASTER_COMMAND:
|
||||
m_latch = param & 0xff;
|
||||
m_cpu0->set_input_line(INPUT_LINE_NMI, (param & 0x100) ? CLEAR_LINE : ASSERT_LINE);
|
||||
m_cpu[0]->set_input_line(INPUT_LINE_NMI, (param & 0x100) ? CLEAR_LINE : ASSERT_LINE);
|
||||
if ((param & 0x200) == 0)
|
||||
{
|
||||
m_cpu0->set_input_line(M6809_IRQ_LINE, ASSERT_LINE);
|
||||
m_cpu[0]->set_input_line(M6809_IRQ_LINE, ASSERT_LINE);
|
||||
m_sound_int_state = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case TID_SLAVE_COMMAND:
|
||||
m_latch2 = param & 0xff;
|
||||
m_cpu1->set_input_line(M6809_FIRQ_LINE, ASSERT_LINE);
|
||||
m_cpu[1]->set_input_line(M6809_FIRQ_LINE, ASSERT_LINE);
|
||||
break;
|
||||
|
||||
case TID_SYNC_CLEAR:
|
||||
@ -619,6 +621,8 @@ williams_adpcm_sound_device::williams_adpcm_sound_device(const machine_config &m
|
||||
: device_t(mconfig, WILLIAMS_ADPCM_SOUND, tag, owner, clock),
|
||||
device_mixer_interface(mconfig, *this),
|
||||
m_cpu(*this, "cpu"),
|
||||
m_rombank(*this, "rombank"),
|
||||
m_okibank(*this, "okibank"),
|
||||
m_latch(0),
|
||||
m_talkback(0),
|
||||
m_sound_int_state(0)
|
||||
@ -674,7 +678,7 @@ READ_LINE_MEMBER(williams_adpcm_sound_device::irq_read)
|
||||
|
||||
WRITE8_MEMBER(williams_adpcm_sound_device::bank_select_w)
|
||||
{
|
||||
membank("rombank")->set_entry(data & 0x07);
|
||||
m_rombank->set_entry(data & 0x07);
|
||||
}
|
||||
|
||||
|
||||
@ -685,7 +689,7 @@ WRITE8_MEMBER(williams_adpcm_sound_device::bank_select_w)
|
||||
|
||||
WRITE8_MEMBER(williams_adpcm_sound_device::oki6295_bank_select_w)
|
||||
{
|
||||
membank("okibank")->set_entry(data & 7);
|
||||
m_okibank->set_entry(data & 7);
|
||||
}
|
||||
|
||||
|
||||
@ -776,20 +780,20 @@ void williams_adpcm_sound_device::device_start()
|
||||
{
|
||||
// configure banks
|
||||
uint8_t *rom = memregion("cpu")->base();
|
||||
membank("rombank")->configure_entries(0, 8, &rom[0x10000], 0x8000);
|
||||
m_rombank->configure_entries(0, 8, &rom[0x10000], 0x8000);
|
||||
membank("romupper")->set_base(&rom[0x10000 + 0x4000 + 7 * 0x8000]);
|
||||
|
||||
// expand ADPCM data
|
||||
rom = memregion("oki")->base();
|
||||
// it is assumed that U12 is loaded @ 0x00000 and U13 is loaded @ 0x40000
|
||||
membank("okibank")->configure_entry(0, &rom[0x40000]);
|
||||
membank("okibank")->configure_entry(1, &rom[0x40000]);
|
||||
membank("okibank")->configure_entry(2, &rom[0x20000]);
|
||||
membank("okibank")->configure_entry(3, &rom[0x00000]);
|
||||
membank("okibank")->configure_entry(4, &rom[0xe0000]);
|
||||
membank("okibank")->configure_entry(5, &rom[0xc0000]);
|
||||
membank("okibank")->configure_entry(6, &rom[0xa0000]);
|
||||
membank("okibank")->configure_entry(7, &rom[0x80000]);
|
||||
m_okibank->configure_entry(0, &rom[0x40000]);
|
||||
m_okibank->configure_entry(1, &rom[0x40000]);
|
||||
m_okibank->configure_entry(2, &rom[0x20000]);
|
||||
m_okibank->configure_entry(3, &rom[0x00000]);
|
||||
m_okibank->configure_entry(4, &rom[0xe0000]);
|
||||
m_okibank->configure_entry(5, &rom[0xc0000]);
|
||||
m_okibank->configure_entry(6, &rom[0xa0000]);
|
||||
m_okibank->configure_entry(7, &rom[0x80000]);
|
||||
|
||||
// register for save states
|
||||
save_item(NAME(m_latch));
|
||||
|
@ -65,6 +65,8 @@ private:
|
||||
required_device<pia6821_device> m_pia;
|
||||
required_device<hc55516_device> m_hc55516;
|
||||
|
||||
required_memory_bank m_rombank;
|
||||
|
||||
// internal state
|
||||
uint8_t m_talkback;
|
||||
|
||||
@ -102,7 +104,7 @@ public:
|
||||
void williams_narc_master_map(address_map &map);
|
||||
void williams_narc_slave_map(address_map &map);
|
||||
|
||||
mc6809e_device *get_cpu() { return m_cpu0; }
|
||||
mc6809e_device *get_cpu() { return m_cpu[0]; }
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
@ -121,10 +123,12 @@ private:
|
||||
};
|
||||
|
||||
// devices
|
||||
required_device<mc6809e_device> m_cpu0;
|
||||
required_device<mc6809e_device> m_cpu1;
|
||||
required_device_array<mc6809e_device, 2> m_cpu;
|
||||
required_device<hc55516_device> m_hc55516;
|
||||
|
||||
required_memory_bank m_masterbank;
|
||||
required_memory_bank m_slavebank;
|
||||
|
||||
// internal state
|
||||
uint8_t m_latch;
|
||||
uint8_t m_latch2;
|
||||
@ -177,6 +181,9 @@ private:
|
||||
// devices
|
||||
required_device<mc6809e_device> m_cpu;
|
||||
|
||||
required_memory_bank m_rombank;
|
||||
required_memory_bank m_okibank;
|
||||
|
||||
// internal state
|
||||
uint8_t m_latch;
|
||||
uint8_t m_talkback;
|
||||
|
@ -504,6 +504,7 @@ Reference video: https://www.youtube.com/watch?v=R5OeC6Wc_yI
|
||||
#include "includes/williams.h"
|
||||
|
||||
#include "machine/74157.h"
|
||||
#include "machine/input_merger.h"
|
||||
#include "machine/nvram.h"
|
||||
#include "sound/dac.h"
|
||||
#include "sound/volt_reg.h"
|
||||
@ -537,8 +538,8 @@ void williams_state::defender_bankc000_map(address_map &map)
|
||||
map(0x0010, 0x001f).mirror(0x03e0).w(FUNC(williams_state::defender_video_control_w));
|
||||
map(0x0400, 0x04ff).mirror(0x0300).ram().w(FUNC(williams_state::williams_cmos_w)).share("nvram");
|
||||
map(0x0800, 0x0bff).r(FUNC(williams_state::williams_video_counter_r));
|
||||
map(0x0c00, 0x0c03).mirror(0x03e0).rw(m_pia_1, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0x0c04, 0x0c07).mirror(0x03e0).rw(m_pia_0, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0x0c00, 0x0c03).mirror(0x03e0).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0x0c04, 0x0c07).mirror(0x03e0).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0x1000, 0x9fff).rom().region("maincpu", 0x10000);
|
||||
map(0xa000, 0xffff).noprw();
|
||||
}
|
||||
@ -553,11 +554,11 @@ void williams_state::defender_bankc000_map(address_map &map)
|
||||
|
||||
void williams_state::williams_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x8fff).bankr("bank1").writeonly().share("videoram");
|
||||
map(0x0000, 0x8fff).bankr("mainbank").writeonly().share("videoram");
|
||||
map(0x9000, 0xbfff).ram();
|
||||
map(0xc000, 0xc00f).mirror(0x03f0).writeonly().share("paletteram");
|
||||
map(0xc804, 0xc807).mirror(0x00f0).rw(m_pia_0, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc80c, 0xc80f).mirror(0x00f0).rw(m_pia_1, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc804, 0xc807).mirror(0x00f0).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc80c, 0xc80f).mirror(0x00f0).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc900, 0xc9ff).w(FUNC(williams_state::williams_vram_select_w));
|
||||
map(0xca00, 0xca07).mirror(0x00f8).w(FUNC(williams_state::williams_blitter_w));
|
||||
map(0xcb00, 0xcbff).r(FUNC(williams_state::williams_video_counter_r));
|
||||
@ -576,11 +577,11 @@ void williams_state::williams_map(address_map &map)
|
||||
|
||||
void williams_state::sinistar_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x8fff).bankr("bank1").writeonly().share("videoram");
|
||||
map(0x0000, 0x8fff).bankr("mainbank").writeonly().share("videoram");
|
||||
map(0x9000, 0xbfff).ram();
|
||||
map(0xc000, 0xc00f).mirror(0x03f0).writeonly().share("paletteram");
|
||||
map(0xc804, 0xc807).mirror(0x00f0).rw(m_pia_0, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc80c, 0xc80f).mirror(0x00f0).rw(m_pia_1, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc804, 0xc807).mirror(0x00f0).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc80c, 0xc80f).mirror(0x00f0).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc900, 0xc9ff).w(FUNC(williams_state::sinistar_vram_select_w));
|
||||
map(0xca00, 0xca07).mirror(0x00f8).w(FUNC(williams_state::williams_blitter_w));
|
||||
map(0xcb00, 0xcbff).r(FUNC(williams_state::williams_video_counter_r));
|
||||
@ -592,6 +593,26 @@ void williams_state::sinistar_map(address_map &map)
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Speed Ball memory handlers
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void spdball_state::spdball_map(address_map &map)
|
||||
{
|
||||
williams_map(map);
|
||||
/* install extra input handlers */
|
||||
map(0xc800, 0xc800).portr("AN0");
|
||||
map(0xc801, 0xc801).portr("AN1");
|
||||
map(0xc802, 0xc802).portr("AN2");
|
||||
map(0xc803, 0xc803).portr("AN3");
|
||||
/* add a third PIA */
|
||||
map(0xc808, 0xc80b).mirror(0x00f0).rw(m_pia[3], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Blaster memory handlers
|
||||
@ -600,15 +621,15 @@ void williams_state::sinistar_map(address_map &map)
|
||||
|
||||
void blaster_state::blaster_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x3fff).bankr("bank1").writeonly().share("videoram");
|
||||
map(0x4000, 0x8fff).bankr("bank2").writeonly();
|
||||
map(0x0000, 0x3fff).bankr("mainbank").writeonly().share("videoram");
|
||||
map(0x4000, 0x8fff).bankr("blaster_bankb").writeonly();
|
||||
map(0x9000, 0xbaff).ram();
|
||||
map(0xbb00, 0xbbff).ram().share("blaster_pal0");
|
||||
map(0xbc00, 0xbcff).ram().share("blaster_scan");
|
||||
map(0xbd00, 0xbfff).ram();
|
||||
map(0xc000, 0xc00f).mirror(0x03f0).writeonly().share("paletteram");
|
||||
map(0xc804, 0xc807).mirror(0x00f0).rw(m_pia_0, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc80c, 0xc80f).mirror(0x00f0).rw(m_pia_1, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc804, 0xc807).mirror(0x00f0).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc80c, 0xc80f).mirror(0x00f0).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc900, 0xc93f).w(FUNC(blaster_state::blaster_vram_select_w));
|
||||
map(0xc940, 0xc97f).w(FUNC(blaster_state::blaster_remap_select_w));
|
||||
map(0xc980, 0xc9bf).w(FUNC(blaster_state::blaster_bank_select_w));
|
||||
@ -631,14 +652,14 @@ void blaster_state::blaster_map(address_map &map)
|
||||
void williams2_state::williams2_common_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0xbfff).ram().share("videoram");
|
||||
map(0x0000, 0x7fff).bankr("bank1");
|
||||
map(0x0000, 0x7fff).bankr("mainbank");
|
||||
map(0x8000, 0x87ff).m(m_bank8000, FUNC(address_map_bank_device::amap8));
|
||||
map(0xc000, 0xc7ff).ram().w(FUNC(williams2_state::williams2_tileram_w)).share("williams2_tile");
|
||||
map(0xc800, 0xc87f).w(FUNC(williams2_state::williams2_bank_select_w));
|
||||
map(0xc880, 0xc887).mirror(0x0078).w(FUNC(williams2_state::williams_blitter_w));
|
||||
map(0xc900, 0xc97f).w(FUNC(williams2_state::williams2_watchdog_reset_w));
|
||||
map(0xc980, 0xc983).mirror(0x0070).rw(m_pia_1, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc984, 0xc987).mirror(0x0070).rw(m_pia_0, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc980, 0xc983).mirror(0x0070).rw(m_pia[1], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc984, 0xc987).mirror(0x0070).rw(m_pia[0], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xc98c, 0xc98f).mirror(0x0070).w(FUNC(williams2_state::williams2_7segment_w));
|
||||
map(0xcb00, 0xcb1f).w(FUNC(williams2_state::williams2_fg_select_w));
|
||||
map(0xcb20, 0xcb3f).w(FUNC(williams2_state::williams2_bg_select_w));
|
||||
@ -684,7 +705,7 @@ void williams2_state::williams2_d000_rom_map(address_map &map)
|
||||
void williams_state::defender_sound_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x007f).ram(); /* internal RAM */
|
||||
map(0x0400, 0x0403).mirror(0x8000).rw(m_pia_2, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0x0400, 0x0403).mirror(0x8000).rw(m_pia[2], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xb000, 0xffff).rom();
|
||||
}
|
||||
|
||||
@ -693,7 +714,7 @@ void williams_state::sound_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x007f).ram(); /* internal RAM */
|
||||
map(0x0080, 0x00ff).ram(); /* MC6810 RAM */
|
||||
map(0x0400, 0x0403).mirror(0x8000).rw(m_pia_2, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0x0400, 0x0403).mirror(0x8000).rw(m_pia[2], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xb000, 0xffff).rom();
|
||||
}
|
||||
|
||||
@ -702,7 +723,7 @@ void blaster_state::sound_map_b(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x007f).ram(); /* internal RAM */
|
||||
map(0x0080, 0x00ff).ram(); /* MC6810 RAM */
|
||||
map(0x0400, 0x0403).mirror(0x8000).rw(m_pia_2b, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0x0400, 0x0403).mirror(0x8000).rw(m_pia[3], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xb000, 0xffff).rom();
|
||||
}
|
||||
|
||||
@ -718,7 +739,7 @@ void williams2_state::williams2_sound_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x007f).ram(); /* internal RAM */
|
||||
map(0x0080, 0x00ff).ram(); /* MC6810 RAM */
|
||||
map(0x2000, 0x2003).mirror(0x1ffc).rw(m_pia_2, FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0x2000, 0x2003).mirror(0x1ffc).rw(m_pia[2], FUNC(pia6821_device::read), FUNC(pia6821_device::write));
|
||||
map(0xe000, 0xffff).rom();
|
||||
}
|
||||
|
||||
@ -1445,7 +1466,7 @@ static const gfx_layout williams2_layout =
|
||||
0+2*8+RGN_FRAC(0,3), 4+2*8+RGN_FRAC(0,3), 0+2*8+RGN_FRAC(1,3), 4+2*8+RGN_FRAC(1,3), 0+2*8+RGN_FRAC(2,3), 4+2*8+RGN_FRAC(2,3),
|
||||
0+3*8+RGN_FRAC(0,3), 4+3*8+RGN_FRAC(0,3), 0+3*8+RGN_FRAC(1,3), 4+3*8+RGN_FRAC(1,3), 0+3*8+RGN_FRAC(2,3), 4+3*8+RGN_FRAC(2,3)
|
||||
},
|
||||
{ 0*8, 4*8, 8*8, 12*8, 16*8, 20*8, 24*8, 28*8, 32*8, 36*8, 40*8, 44*8, 48*8, 52*8, 56*8, 60*8 },
|
||||
{ STEP16(0,4*8) },
|
||||
4*16*8
|
||||
};
|
||||
|
||||
@ -1490,6 +1511,9 @@ MACHINE_CONFIG_START(williams_state::williams)
|
||||
|
||||
MCFG_VIDEO_START_OVERRIDE(williams_state,williams)
|
||||
|
||||
MCFG_PALETTE_ADD("palette", 256)
|
||||
MCFG_PALETTE_INIT_OWNER(williams_state,williams)
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "speaker").front_center();
|
||||
MCFG_DEVICE_ADD("dac", MC1408, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) // mc1408.ic6
|
||||
@ -1497,20 +1521,26 @@ MACHINE_CONFIG_START(williams_state::williams)
|
||||
MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
|
||||
|
||||
/* pia */
|
||||
MCFG_DEVICE_ADD(m_pia_0, PIA6821, 0)
|
||||
MCFG_INPUT_MERGER_ANY_HIGH("mainirq")
|
||||
MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE))
|
||||
|
||||
MCFG_INPUT_MERGER_ANY_HIGH("soundirq")
|
||||
MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("soundcpu", M6808_IRQ_LINE))
|
||||
|
||||
MCFG_DEVICE_ADD(m_pia[0], PIA6821, 0)
|
||||
MCFG_PIA_READPA_HANDLER(IOPORT("IN0"))
|
||||
MCFG_PIA_READPB_HANDLER(IOPORT("IN1"))
|
||||
|
||||
MCFG_DEVICE_ADD(m_pia_1, PIA6821, 0)
|
||||
MCFG_DEVICE_ADD(m_pia[1], PIA6821, 0)
|
||||
MCFG_PIA_READPA_HANDLER(IOPORT("IN2"))
|
||||
MCFG_PIA_WRITEPB_HANDLER(WRITE8(*this, williams_state, williams_snd_cmd_w))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, williams_state, williams_main_irq))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE(*this, williams_state, williams_main_irq))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE("mainirq", input_merger_any_high_device, in_w<0>))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE("mainirq", input_merger_any_high_device, in_w<1>))
|
||||
|
||||
MCFG_DEVICE_ADD(m_pia_2, PIA6821, 0)
|
||||
MCFG_DEVICE_ADD(m_pia[2], PIA6821, 0)
|
||||
MCFG_PIA_WRITEPA_HANDLER(WRITE8("dac", dac_byte_interface, data_w))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, williams_state,williams_snd_irq))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE(*this, williams_state,williams_snd_irq))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE("soundirq", input_merger_any_high_device, in_w<0>))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE("soundirq", input_merger_any_high_device, in_w<1>))
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
@ -1577,6 +1607,8 @@ MACHINE_CONFIG_START(spdball_state::spdball)
|
||||
williams(config);
|
||||
|
||||
/* basic machine hardware */
|
||||
MCFG_DEVICE_MODIFY("maincpu")
|
||||
MCFG_DEVICE_PROGRAM_MAP(spdball_map)
|
||||
|
||||
/* pia */
|
||||
MCFG_DEVICE_ADD("pia_3", PIA6821, 0)
|
||||
@ -1692,16 +1724,19 @@ MACHINE_CONFIG_START(blaster_state::blaster)
|
||||
MCFG_74157_A_IN_CB(IOPORT("INP1"))
|
||||
MCFG_74157_B_IN_CB(IOPORT("INP2"))
|
||||
|
||||
MCFG_INPUT_MERGER_ANY_HIGH("soundirq_b")
|
||||
MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("soundcpu_b", M6808_IRQ_LINE))
|
||||
|
||||
MCFG_DEVICE_MODIFY("pia_1")
|
||||
MCFG_PIA_WRITEPB_HANDLER(WRITE8(*this, blaster_state, blaster_snd_cmd_w))
|
||||
|
||||
MCFG_DEVICE_MODIFY("pia_2")
|
||||
MCFG_PIA_WRITEPA_HANDLER(WRITE8("ldac", dac_byte_interface, data_w))
|
||||
|
||||
MCFG_DEVICE_ADD("pia_2b", PIA6821, 0)
|
||||
MCFG_DEVICE_ADD("pia_3", PIA6821, 0)
|
||||
MCFG_PIA_WRITEPA_HANDLER(WRITE8("rdac", dac_byte_interface, data_w))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, blaster_state,williams_snd_irq_b))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE(*this, blaster_state,williams_snd_irq_b))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE("soundirq_b", input_merger_any_high_device, in_w<0>))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE("soundirq_b", input_merger_any_high_device, in_w<1>))
|
||||
|
||||
/* sound hardware */
|
||||
MCFG_DEVICE_REMOVE("speaker")
|
||||
@ -1764,6 +1799,12 @@ MACHINE_CONFIG_START(williams2_state::williams2)
|
||||
MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT)
|
||||
|
||||
/* pia */
|
||||
MCFG_INPUT_MERGER_ANY_HIGH("mainirq")
|
||||
MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", M6809_IRQ_LINE))
|
||||
|
||||
MCFG_INPUT_MERGER_ANY_HIGH("soundirq")
|
||||
MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("soundcpu", M6808_IRQ_LINE))
|
||||
|
||||
MCFG_DEVICE_ADD("pia_0", PIA6821, 0)
|
||||
MCFG_PIA_READPA_HANDLER(IOPORT("IN0"))
|
||||
MCFG_PIA_READPB_HANDLER(IOPORT("IN1"))
|
||||
@ -1772,15 +1813,15 @@ MACHINE_CONFIG_START(williams2_state::williams2)
|
||||
MCFG_PIA_READPA_HANDLER(IOPORT("IN2"))
|
||||
MCFG_PIA_WRITEPB_HANDLER(WRITE8(*this, williams2_state,williams2_snd_cmd_w))
|
||||
MCFG_PIA_CB2_HANDLER(WRITELINE("pia_2", pia6821_device, ca1_w))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, williams_state,williams_main_irq))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE(*this, williams_state,williams_main_irq))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE("mainirq", input_merger_any_high_device, in_w<0>))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE("mainirq", input_merger_any_high_device, in_w<1>))
|
||||
|
||||
MCFG_DEVICE_ADD("pia_2", PIA6821, 0)
|
||||
MCFG_PIA_WRITEPA_HANDLER(WRITE8("pia_1", pia6821_device, portb_w))
|
||||
MCFG_PIA_WRITEPB_HANDLER(WRITE8("dac", dac_byte_interface, data_w))
|
||||
MCFG_PIA_CA2_HANDLER(WRITELINE("pia_1", pia6821_device, cb1_w))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, williams_state,williams_snd_irq))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE(*this, williams_state,williams_snd_irq))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE("soundirq", input_merger_any_high_device, in_w<0>))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE("soundirq", input_merger_any_high_device, in_w<1>))
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
@ -1803,12 +1844,12 @@ MACHINE_CONFIG_START(williams2_state::mysticm)
|
||||
|
||||
/* pia */
|
||||
MCFG_DEVICE_MODIFY("pia_0")
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, williams_state,williams_main_firq))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE(*this, williams2_state,mysticm_main_irq))
|
||||
MCFG_PIA_IRQA_HANDLER(INPUTLINE("maincpu", M6809_FIRQ_LINE))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE("mainirq", input_merger_any_high_device, in_w<0>))
|
||||
|
||||
MCFG_DEVICE_MODIFY("pia_1")
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, williams2_state,mysticm_main_irq))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE(*this, williams2_state,mysticm_main_irq))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE("mainirq", input_merger_any_high_device, in_w<1>))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE("mainirq", input_merger_any_high_device, in_w<2>))
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
@ -1819,17 +1860,19 @@ MACHINE_CONFIG_START(tshoot_state::tshoot)
|
||||
MCFG_DEVICE_MODIFY("maincpu")
|
||||
MCFG_DEVICE_PROGRAM_MAP(williams2_d000_rom_map)
|
||||
|
||||
MCFG_MACHINE_START_OVERRIDE(tshoot_state,tshoot)
|
||||
|
||||
/* pia */
|
||||
MCFG_DEVICE_MODIFY("pia_0")
|
||||
MCFG_PIA_READPA_HANDLER(READ8("mux", ls157_x2_device, output_r))
|
||||
MCFG_PIA_WRITEPB_HANDLER(WRITE8(*this, tshoot_state, lamp_w))
|
||||
MCFG_PIA_CA2_HANDLER(WRITELINE("mux", ls157_x2_device, select_w))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, williams2_state,tshoot_main_irq))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE(*this, williams2_state,tshoot_main_irq))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE("mainirq", input_merger_any_high_device, in_w<0>))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE("mainirq", input_merger_any_high_device, in_w<1>))
|
||||
|
||||
MCFG_DEVICE_MODIFY("pia_1")
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, williams2_state,tshoot_main_irq))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE(*this, williams2_state,tshoot_main_irq))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE("mainirq", input_merger_any_high_device, in_w<2>))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE("mainirq", input_merger_any_high_device, in_w<3>))
|
||||
|
||||
MCFG_DEVICE_MODIFY("pia_2")
|
||||
MCFG_PIA_CB2_HANDLER(WRITELINE(*this, tshoot_state, maxvol_w))
|
||||
@ -1864,8 +1907,8 @@ MACHINE_CONFIG_START(joust2_state::joust2)
|
||||
MCFG_PIA_WRITEPB_HANDLER(WRITE8(*this, joust2_state,joust2_snd_cmd_w))
|
||||
MCFG_PIA_CA2_HANDLER(WRITELINE(*this, joust2_state,joust2_pia_3_cb1_w))
|
||||
MCFG_PIA_CB2_HANDLER(WRITELINE("pia_2", pia6821_device, ca1_w))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE(*this, williams_state,williams_main_irq))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE(*this, williams_state,williams_main_irq))
|
||||
MCFG_PIA_IRQA_HANDLER(WRITELINE("mainirq", input_merger_any_high_device, in_w<0>))
|
||||
MCFG_PIA_IRQB_HANDLER(WRITELINE("mainirq", input_merger_any_high_device, in_w<1>))
|
||||
|
||||
MCFG_DEVICE_ADD("mux", LS157, 0)
|
||||
MCFG_74157_A_IN_CB(IOPORT("INP1"))
|
||||
@ -3242,15 +3285,6 @@ void blaster_state::init_blaster()
|
||||
void spdball_state::driver_init()
|
||||
{
|
||||
CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC1, 0xc000);
|
||||
|
||||
/* add a third PIA */
|
||||
m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xc808, 0xc80b, read8_delegate(FUNC(pia6821_device::read), (pia6821_device*)m_pia_3), write8_delegate(FUNC(pia6821_device::write), (pia6821_device*)m_pia_3));
|
||||
|
||||
/* install extra input handlers */
|
||||
m_maincpu->space(AS_PROGRAM).install_read_port(0xc800, 0xc800, "AN0");
|
||||
m_maincpu->space(AS_PROGRAM).install_read_port(0xc801, 0xc801, "AN1");
|
||||
m_maincpu->space(AS_PROGRAM).install_read_port(0xc802, 0xc802, "AN2");
|
||||
m_maincpu->space(AS_PROGRAM).install_read_port(0xc803, 0xc803, "AN3");
|
||||
}
|
||||
|
||||
|
||||
|
@ -22,20 +22,19 @@
|
||||
class williams_state : public driver_device
|
||||
{
|
||||
public:
|
||||
williams_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag),
|
||||
williams_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
driver_device(mconfig, type, tag),
|
||||
m_nvram(*this, "nvram"),
|
||||
m_videoram(*this, "videoram"),
|
||||
m_mainbank(*this, "mainbank"),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_soundcpu(*this, "soundcpu"),
|
||||
m_bankc000(*this, "bankc000"),
|
||||
m_watchdog(*this, "watchdog"),
|
||||
m_screen(*this, "screen"),
|
||||
m_palette(*this, "palette"),
|
||||
m_generic_paletteram_8(*this, "paletteram"),
|
||||
m_pia_0(*this, "pia_0"),
|
||||
m_pia_1(*this, "pia_1"),
|
||||
m_pia_2(*this, "pia_2") { }
|
||||
m_paletteram(*this, "paletteram"),
|
||||
m_pia(*this, "pia_%u", 0U) { }
|
||||
|
||||
enum
|
||||
{
|
||||
@ -52,6 +51,7 @@ public:
|
||||
|
||||
required_shared_ptr<uint8_t> m_nvram;
|
||||
required_shared_ptr<uint8_t> m_videoram;
|
||||
optional_memory_bank m_mainbank;
|
||||
uint8_t *m_mayday_protection;
|
||||
uint8_t m_blitter_config;
|
||||
uint16_t m_blitter_clip_address;
|
||||
@ -99,27 +99,21 @@ public:
|
||||
DECLARE_WRITE8_MEMBER(playball_snd_cmd_w);
|
||||
DECLARE_READ8_MEMBER(williams_49way_port_0_r);
|
||||
DECLARE_WRITE_LINE_MEMBER(lottofun_coin_lock_w);
|
||||
DECLARE_PALETTE_INIT(williams);
|
||||
|
||||
void state_save_register();
|
||||
void create_palette_lookup();
|
||||
void blitter_init(int blitter_config, const uint8_t *remap_prom);
|
||||
inline void blit_pixel(address_space &space, int dstaddr, int srcdata, int controlbyte);
|
||||
int blitter_core(address_space &space, int sstart, int dstart, int w, int h, int data);
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(williams_main_irq);
|
||||
DECLARE_WRITE_LINE_MEMBER(williams_main_firq);
|
||||
DECLARE_WRITE_LINE_MEMBER(williams_snd_irq);
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_soundcpu;
|
||||
optional_device<address_map_bank_device> m_bankc000;
|
||||
required_device<watchdog_timer_device> m_watchdog;
|
||||
required_device<screen_device> m_screen;
|
||||
optional_device<palette_device> m_palette;
|
||||
optional_shared_ptr<uint8_t> m_generic_paletteram_8;
|
||||
required_device<pia6821_device> m_pia_0;
|
||||
required_device<pia6821_device> m_pia_1;
|
||||
required_device<pia6821_device> m_pia_2;
|
||||
optional_shared_ptr<uint8_t> m_paletteram;
|
||||
optional_device_array<pia6821_device, 4> m_pia;
|
||||
void playball(machine_config &config);
|
||||
void defender(machine_config &config);
|
||||
void sinistar(machine_config &config);
|
||||
@ -138,34 +132,29 @@ public:
|
||||
class spdball_state : public williams_state
|
||||
{
|
||||
public:
|
||||
spdball_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: williams_state(mconfig, type, tag)
|
||||
, m_pia_3(*this, "pia_3")
|
||||
{
|
||||
}
|
||||
spdball_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams_state(mconfig, type, tag) { }
|
||||
|
||||
void driver_init() override;
|
||||
|
||||
void spdball(machine_config &config);
|
||||
|
||||
protected:
|
||||
required_device<pia6821_device> m_pia_3;
|
||||
void spdball_map(address_map &map);
|
||||
};
|
||||
|
||||
class blaster_state : public williams_state
|
||||
{
|
||||
public:
|
||||
blaster_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: williams_state(mconfig, type, tag),
|
||||
blaster_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams_state(mconfig, type, tag),
|
||||
m_soundcpu_b(*this, "soundcpu_b"),
|
||||
m_pia_2b(*this, "pia_2b"),
|
||||
m_blaster_palette_0(*this, "blaster_pal0"),
|
||||
m_blaster_scanline_control(*this, "blaster_scan") { }
|
||||
m_blaster_scanline_control(*this, "blaster_scan"),
|
||||
m_blaster_bankb(*this, "blaster_bankb") { }
|
||||
|
||||
optional_device<cpu_device> m_soundcpu_b;
|
||||
optional_device<pia6821_device> m_pia_2b;
|
||||
required_shared_ptr<uint8_t> m_blaster_palette_0;
|
||||
required_shared_ptr<uint8_t> m_blaster_scanline_control;
|
||||
optional_memory_bank m_blaster_bankb;
|
||||
|
||||
rgb_t m_blaster_color0;
|
||||
uint8_t m_blaster_video_control;
|
||||
@ -178,7 +167,6 @@ public:
|
||||
DECLARE_WRITE8_MEMBER(blaster_video_control_w);
|
||||
TIMER_CALLBACK_MEMBER(blaster_deferred_snd_cmd_w);
|
||||
DECLARE_WRITE8_MEMBER(blaster_snd_cmd_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(williams_snd_irq_b);
|
||||
|
||||
void init_blaster();
|
||||
DECLARE_MACHINE_START(blaster);
|
||||
@ -226,8 +214,6 @@ public:
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(williams2_endscreen_callback);
|
||||
TIMER_CALLBACK_MEMBER(williams2_deferred_snd_cmd_w);
|
||||
DECLARE_WRITE8_MEMBER(williams2_snd_cmd_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(mysticm_main_irq);
|
||||
DECLARE_WRITE_LINE_MEMBER(tshoot_main_irq);
|
||||
|
||||
void init_mysticm();
|
||||
void init_tshoot();
|
||||
@ -250,17 +236,27 @@ public:
|
||||
class tshoot_state : public williams2_state
|
||||
{
|
||||
public:
|
||||
tshoot_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: williams2_state(mconfig, type, tag),
|
||||
m_gun(*this, {"GUNX", "GUNY"}) { }
|
||||
tshoot_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||
williams2_state(mconfig, type, tag),
|
||||
m_gun(*this, {"GUNX", "GUNY"}),
|
||||
m_grenade_lamp(*this, "Grenade_lamp"),
|
||||
m_gun_lamp(*this, "Gun_lamp"),
|
||||
m_p1_gun_recoil(*this, "Player1_Gun_Recoil"),
|
||||
m_feather_blower(*this, "Feather_Blower") { }
|
||||
|
||||
DECLARE_CUSTOM_INPUT_MEMBER(gun_r);
|
||||
DECLARE_WRITE_LINE_MEMBER(maxvol_w);
|
||||
DECLARE_WRITE8_MEMBER(lamp_w);
|
||||
|
||||
DECLARE_MACHINE_START(tshoot);
|
||||
|
||||
void tshoot(machine_config &config);
|
||||
private:
|
||||
required_ioport_array<2> m_gun;
|
||||
output_finder<> m_grenade_lamp;
|
||||
output_finder<> m_gun_lamp;
|
||||
output_finder<> m_p1_gun_recoil;
|
||||
output_finder<> m_feather_blower;
|
||||
};
|
||||
|
||||
class joust2_state : public williams2_state
|
||||
|
@ -25,7 +25,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams_state::williams_va11_callback)
|
||||
return;
|
||||
|
||||
/* the IRQ signal comes into CB1, and is set to VA11 */
|
||||
m_pia_1->cb1_w(BIT(scanline, 5));
|
||||
m_pia[1]->cb1_w(BIT(scanline, 5));
|
||||
}
|
||||
|
||||
|
||||
@ -34,69 +34,10 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams_state::williams_count240_callback)
|
||||
int scanline = param;
|
||||
|
||||
// the COUNT240 signal comes into CA1, and is set to the logical AND of VA10-VA13
|
||||
m_pia_1->ca1_w(scanline >= 240 ? 1 : 0);
|
||||
m_pia[1]->ca1_w(scanline >= 240 ? 1 : 0);
|
||||
}
|
||||
|
||||
|
||||
WRITE_LINE_MEMBER(williams_state::williams_main_irq)
|
||||
{
|
||||
int combined_state = m_pia_1->irq_a_state() | m_pia_1->irq_b_state();
|
||||
|
||||
/* IRQ to the main CPU */
|
||||
m_maincpu->set_input_line(M6809_IRQ_LINE, combined_state ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
WRITE_LINE_MEMBER(williams_state::williams_main_firq)
|
||||
{
|
||||
/* FIRQ to the main CPU */
|
||||
m_maincpu->set_input_line(M6809_FIRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
WRITE_LINE_MEMBER(williams_state::williams_snd_irq)
|
||||
{
|
||||
int combined_state = m_pia_2->irq_a_state() | m_pia_2->irq_b_state();
|
||||
|
||||
/* IRQ to the sound CPU */
|
||||
m_soundcpu->set_input_line(M6808_IRQ_LINE, combined_state ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
/* Same as above, but for second sound board */
|
||||
WRITE_LINE_MEMBER(blaster_state::williams_snd_irq_b)
|
||||
{
|
||||
int combined_state = m_pia_2b->irq_a_state() | m_pia_2b->irq_b_state();
|
||||
|
||||
/* IRQ to the sound CPU */
|
||||
m_soundcpu_b->set_input_line(M6808_IRQ_LINE, combined_state ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Newer Williams interrupts
|
||||
*
|
||||
*************************************/
|
||||
|
||||
WRITE_LINE_MEMBER(williams2_state::mysticm_main_irq)
|
||||
{
|
||||
int combined_state = m_pia_0->irq_b_state() | m_pia_1->irq_a_state() | m_pia_1->irq_b_state();
|
||||
|
||||
/* IRQ to the main CPU */
|
||||
m_maincpu->set_input_line(M6809_IRQ_LINE, combined_state ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
WRITE_LINE_MEMBER(williams2_state::tshoot_main_irq)
|
||||
{
|
||||
int combined_state = m_pia_0->irq_a_state() | m_pia_0->irq_b_state() | m_pia_1->irq_a_state() | m_pia_1->irq_b_state();
|
||||
|
||||
/* IRQ to the main CPU */
|
||||
m_maincpu->set_input_line(M6809_IRQ_LINE, combined_state ? ASSERT_LINE : CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*************************************
|
||||
*
|
||||
* Older Williams initialization
|
||||
@ -106,8 +47,8 @@ WRITE_LINE_MEMBER(williams2_state::tshoot_main_irq)
|
||||
MACHINE_START_MEMBER(williams_state,williams_common)
|
||||
{
|
||||
/* configure the memory bank */
|
||||
membank("bank1")->configure_entry(1, memregion("maincpu")->base() + 0x10000);
|
||||
membank("bank1")->configure_entry(0, m_videoram);
|
||||
m_mainbank->configure_entry(1, memregion("maincpu")->base() + 0x10000);
|
||||
m_mainbank->configure_entry(0, m_videoram);
|
||||
}
|
||||
|
||||
|
||||
@ -131,8 +72,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::williams2_va11_callback)
|
||||
return;
|
||||
|
||||
// the IRQ signal comes into CB1, and is set to VA11
|
||||
m_pia_0->cb1_w(BIT(scanline, 5));
|
||||
m_pia_1->ca1_w(BIT(scanline, 5));
|
||||
m_pia[0]->cb1_w(BIT(scanline, 5));
|
||||
m_pia[1]->ca1_w(BIT(scanline, 5));
|
||||
}
|
||||
|
||||
|
||||
@ -141,7 +82,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::williams2_endscreen_callback)
|
||||
int scanline = param;
|
||||
|
||||
// the /ENDSCREEN signal comes into CA1
|
||||
m_pia_0->ca1_w(scanline >= 254 ? 0 : 1);
|
||||
m_pia[0]->ca1_w(scanline >= 254 ? 0 : 1);
|
||||
}
|
||||
|
||||
|
||||
@ -155,8 +96,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(williams2_state::williams2_endscreen_callback)
|
||||
MACHINE_START_MEMBER(williams2_state,williams2)
|
||||
{
|
||||
/* configure memory banks */
|
||||
membank("bank1")->configure_entries(1, 4, memregion("maincpu")->base() + 0x10000, 0x10000);
|
||||
membank("bank1")->configure_entry(0, m_videoram);
|
||||
m_mainbank->configure_entries(1, 4, memregion("maincpu")->base() + 0x10000, 0x10000);
|
||||
m_mainbank->configure_entry(0, m_videoram);
|
||||
membank("vram8000")->set_base(&m_videoram[0x8000]);
|
||||
}
|
||||
|
||||
@ -178,7 +119,7 @@ MACHINE_RESET_MEMBER(williams2_state,williams2)
|
||||
WRITE8_MEMBER(williams_state::williams_vram_select_w)
|
||||
{
|
||||
/* VRAM/ROM banking from bit 0 */
|
||||
membank("bank1")->set_entry(data & 0x01);
|
||||
m_mainbank->set_entry(data & 0x01);
|
||||
|
||||
/* cocktail flip from bit 1 */
|
||||
m_cocktail = data & 0x02;
|
||||
@ -192,20 +133,20 @@ WRITE8_MEMBER(williams2_state::williams2_bank_select_w)
|
||||
{
|
||||
/* page 0 is video ram */
|
||||
case 0:
|
||||
membank("bank1")->set_entry(0);
|
||||
m_mainbank->set_entry(0);
|
||||
m_bank8000->set_bank(0);
|
||||
break;
|
||||
|
||||
/* pages 1 and 2 are ROM */
|
||||
case 1:
|
||||
case 2:
|
||||
membank("bank1")->set_entry(1 + ((data & 6) >> 1));
|
||||
m_mainbank->set_entry(1 + ((data & 6) >> 1));
|
||||
m_bank8000->set_bank(0);
|
||||
break;
|
||||
|
||||
/* page 3 accesses palette RAM; the remaining areas are as if page 1 ROM was selected */
|
||||
case 3:
|
||||
membank("bank1")->set_entry(1 + ((data & 4) >> 1));
|
||||
m_mainbank->set_entry(1 + ((data & 4) >> 1));
|
||||
m_bank8000->set_bank(1);
|
||||
break;
|
||||
}
|
||||
@ -221,8 +162,8 @@ WRITE8_MEMBER(williams2_state::williams2_bank_select_w)
|
||||
|
||||
TIMER_CALLBACK_MEMBER(williams_state::williams_deferred_snd_cmd_w)
|
||||
{
|
||||
m_pia_2->write_portb(param);
|
||||
m_pia_2->cb1_w((param == 0xff) ? 0 : 1);
|
||||
m_pia[2]->write_portb(param);
|
||||
m_pia[2]->cb1_w((param == 0xff) ? 0 : 1);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(williams_state::williams_snd_cmd_w)
|
||||
@ -238,7 +179,7 @@ WRITE8_MEMBER(williams_state::playball_snd_cmd_w)
|
||||
|
||||
TIMER_CALLBACK_MEMBER(williams2_state::williams2_deferred_snd_cmd_w)
|
||||
{
|
||||
m_pia_2->write_porta(param);
|
||||
m_pia[2]->write_porta(param);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(williams2_state::williams2_snd_cmd_w)
|
||||
@ -440,11 +381,11 @@ WRITE8_MEMBER(williams_state::sinistar_vram_select_w)
|
||||
MACHINE_START_MEMBER(blaster_state,blaster)
|
||||
{
|
||||
/* banking is different for blaster */
|
||||
membank("bank1")->configure_entries(1, 16, memregion("maincpu")->base() + 0x18000, 0x4000);
|
||||
membank("bank1")->configure_entry(0, m_videoram);
|
||||
m_mainbank->configure_entries(1, 16, memregion("maincpu")->base() + 0x18000, 0x4000);
|
||||
m_mainbank->configure_entry(0, m_videoram);
|
||||
|
||||
membank("bank2")->configure_entries(1, 16, memregion("maincpu")->base() + 0x10000, 0x0000);
|
||||
membank("bank2")->configure_entry(0, &m_videoram[0x4000]);
|
||||
m_blaster_bankb->configure_entries(1, 16, memregion("maincpu")->base() + 0x10000, 0x0000);
|
||||
m_blaster_bankb->configure_entry(0, &m_videoram[0x4000]);
|
||||
|
||||
/* register for save states */
|
||||
save_item(NAME(m_vram_bank));
|
||||
@ -454,8 +395,8 @@ MACHINE_START_MEMBER(blaster_state,blaster)
|
||||
|
||||
inline void blaster_state::update_blaster_banking()
|
||||
{
|
||||
membank("bank1")->set_entry(m_vram_bank * (m_rom_bank + 1));
|
||||
membank("bank2")->set_entry(m_vram_bank * (m_rom_bank + 1));
|
||||
m_mainbank->set_entry(m_vram_bank * (m_rom_bank + 1));
|
||||
m_blaster_bankb->set_entry(m_vram_bank * (m_rom_bank + 1));
|
||||
}
|
||||
|
||||
|
||||
@ -485,8 +426,8 @@ TIMER_CALLBACK_MEMBER(blaster_state::blaster_deferred_snd_cmd_w)
|
||||
uint8_t l_data = param | 0x80;
|
||||
uint8_t r_data = (param >> 1 & 0x40) | (param & 0x3f) | 0x80;
|
||||
|
||||
m_pia_2->write_portb(l_data); m_pia_2->cb1_w((l_data == 0xff) ? 0 : 1);
|
||||
m_pia_2b->write_portb(r_data); m_pia_2b->cb1_w((r_data == 0xff) ? 0 : 1);
|
||||
m_pia[2]->write_portb(l_data); m_pia[2]->cb1_w((l_data == 0xff) ? 0 : 1);
|
||||
m_pia[3]->write_portb(r_data); m_pia[3]->cb1_w((r_data == 0xff) ? 0 : 1);
|
||||
}
|
||||
|
||||
|
||||
@ -516,6 +457,16 @@ WRITE_LINE_MEMBER(williams_state::lottofun_coin_lock_w)
|
||||
*
|
||||
*************************************/
|
||||
|
||||
MACHINE_START_MEMBER(tshoot_state,tshoot)
|
||||
{
|
||||
MACHINE_START_CALL_MEMBER(williams2);
|
||||
m_grenade_lamp.resolve();
|
||||
m_gun_lamp.resolve();
|
||||
m_p1_gun_recoil.resolve();
|
||||
m_feather_blower.resolve();
|
||||
}
|
||||
|
||||
|
||||
CUSTOM_INPUT_MEMBER(tshoot_state::gun_r)
|
||||
{
|
||||
int data = m_gun[(uintptr_t)param]->read();
|
||||
@ -533,13 +484,13 @@ WRITE_LINE_MEMBER(tshoot_state::maxvol_w)
|
||||
WRITE8_MEMBER(tshoot_state::lamp_w)
|
||||
{
|
||||
/* set the grenade lamp */
|
||||
output().set_value("Grenade_lamp", (~data & 0x4)>>2 );
|
||||
m_grenade_lamp = BIT(~data, 2);
|
||||
/* set the gun lamp */
|
||||
output().set_value("Gun_lamp", (~data & 0x8)>>3 );
|
||||
m_gun_lamp = BIT(~data, 3);
|
||||
/* gun coil */
|
||||
output().set_value("Player1_Gun_Recoil", (data & 0x10)>>4 );
|
||||
m_p1_gun_recoil = BIT(data, 4);
|
||||
/* feather coil */
|
||||
output().set_value("Feather_Blower", (data & 0x20)>>5 );
|
||||
m_feather_blower = BIT(data, 5);
|
||||
}
|
||||
|
||||
|
||||
@ -565,7 +516,7 @@ MACHINE_RESET_MEMBER(joust2_state,joust2)
|
||||
|
||||
TIMER_CALLBACK_MEMBER(joust2_state::joust2_deferred_snd_cmd_w)
|
||||
{
|
||||
m_pia_2->write_porta(param & 0xff);
|
||||
m_pia[2]->write_porta(param & 0xff);
|
||||
}
|
||||
|
||||
|
||||
|
@ -170,7 +170,6 @@ void williams_state::state_save_register()
|
||||
VIDEO_START_MEMBER(williams_state,williams)
|
||||
{
|
||||
blitter_init(m_blitter_config, nullptr);
|
||||
create_palette_lookup();
|
||||
state_save_register();
|
||||
}
|
||||
|
||||
@ -178,7 +177,6 @@ VIDEO_START_MEMBER(williams_state,williams)
|
||||
VIDEO_START_MEMBER(blaster_state,blaster)
|
||||
{
|
||||
blitter_init(m_blitter_config, memregion("proms")->base());
|
||||
create_palette_lookup();
|
||||
state_save_register();
|
||||
save_item(NAME(m_blaster_color0));
|
||||
save_item(NAME(m_blaster_video_control));
|
||||
@ -213,7 +211,7 @@ uint32_t williams_state::screen_update_williams(screen_device &screen, bitmap_rg
|
||||
|
||||
/* precompute the palette */
|
||||
for (x = 0; x < 16; x++)
|
||||
pens[x] = m_palette_lookup[m_generic_paletteram_8[x]];
|
||||
pens[x] = m_palette->pen_color(m_paletteram[x]);
|
||||
|
||||
/* loop over rows */
|
||||
for (y = cliprect.min_y; y <= cliprect.max_y; y++)
|
||||
@ -240,11 +238,11 @@ uint32_t blaster_state::screen_update_blaster(screen_device &screen, bitmap_rgb3
|
||||
|
||||
/* precompute the palette */
|
||||
for (x = 0; x < 16; x++)
|
||||
pens[x] = m_palette_lookup[m_generic_paletteram_8[x]];
|
||||
pens[x] = m_palette->pen_color(m_paletteram[x]);
|
||||
|
||||
/* if we're blitting from the top, start with a 0 for color 0 */
|
||||
if (cliprect.min_y == screen.visible_area().min_y || !(m_blaster_video_control & 1))
|
||||
m_blaster_color0 = m_palette_lookup[m_blaster_palette_0[0] ^ 0xff];
|
||||
m_blaster_color0 = m_palette->pen_color(m_blaster_palette_0[0] ^ 0xff);
|
||||
|
||||
/* loop over rows */
|
||||
for (y = cliprect.min_y; y <= cliprect.max_y; y++)
|
||||
@ -255,7 +253,7 @@ uint32_t blaster_state::screen_update_blaster(screen_device &screen, bitmap_rgb3
|
||||
|
||||
/* latch a new color0 pen? */
|
||||
if (m_blaster_video_control & m_blaster_scanline_control[y] & 1)
|
||||
m_blaster_color0 = m_palette_lookup[m_blaster_palette_0[y] ^ 0xff];
|
||||
m_blaster_color0 = m_palette->pen_color(m_blaster_palette_0[y] ^ 0xff);
|
||||
|
||||
/* loop over columns */
|
||||
for (x = cliprect.min_x & ~1; x <= cliprect.max_x; x += 2)
|
||||
@ -315,7 +313,7 @@ uint32_t williams2_state::screen_update_williams2(screen_device &screen, bitmap_
|
||||
*
|
||||
*************************************/
|
||||
|
||||
void williams_state::create_palette_lookup()
|
||||
PALETTE_INIT_MEMBER(williams_state,williams)
|
||||
{
|
||||
static const int resistances_rg[3] = { 1200, 560, 330 };
|
||||
static const int resistances_b[2] = { 560, 330 };
|
||||
@ -331,18 +329,18 @@ void williams_state::create_palette_lookup()
|
||||
2, resistances_b, weights_b, 0, 0);
|
||||
|
||||
/* build a palette lookup */
|
||||
m_palette_lookup = std::make_unique<rgb_t[]>(256);
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
int r = combine_3_weights(weights_r, BIT(i,0), BIT(i,1), BIT(i,2));
|
||||
int g = combine_3_weights(weights_g, BIT(i,3), BIT(i,4), BIT(i,5));
|
||||
int b = combine_2_weights(weights_b, BIT(i,6), BIT(i,7));
|
||||
|
||||
m_palette_lookup[i] = rgb_t(r, g, b);
|
||||
palette.set_pen_color(i, rgb_t(r, g, b));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
WRITE8_MEMBER(williams2_state::williams2_paletteram_w)
|
||||
{
|
||||
static const uint8_t ztable[16] =
|
||||
@ -353,11 +351,11 @@ WRITE8_MEMBER(williams2_state::williams2_paletteram_w)
|
||||
uint8_t entry_lo, entry_hi, i, r, g, b;
|
||||
|
||||
/* set the new value */
|
||||
m_generic_paletteram_8[offset] = data;
|
||||
m_paletteram[offset] = data;
|
||||
|
||||
/* pull the associated low/high bytes */
|
||||
entry_lo = m_generic_paletteram_8[offset & ~1];
|
||||
entry_hi = m_generic_paletteram_8[offset | 1];
|
||||
entry_lo = m_paletteram[offset & ~1];
|
||||
entry_hi = m_paletteram[offset | 1];
|
||||
|
||||
/* update the palette entry */
|
||||
i = ztable[(entry_hi >> 4) & 15];
|
||||
|
Loading…
Reference in New Issue
Block a user