summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/segag80v.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/segag80v.cpp')
-rw-r--r--src/mame/drivers/segag80v.cpp636
1 files changed, 330 insertions, 306 deletions
diff --git a/src/mame/drivers/segag80v.cpp b/src/mame/drivers/segag80v.cpp
index 0019926832d..b8da53afa46 100644
--- a/src/mame/drivers/segag80v.cpp
+++ b/src/mame/drivers/segag80v.cpp
@@ -135,6 +135,7 @@
***************************************************************************/
#include "emu.h"
+#include "audio/segag80.h"
#include "includes/segag80v.h"
#include "machine/segag80.h"
@@ -143,15 +144,10 @@
#include "speaker.h"
-/*************************************
- *
- * Constants
- *
- *************************************/
-
-#define CPU_CLOCK 8000000 /* not used when video boards are connected */
-#define VIDEO_CLOCK 15468480
-
+// Unsure whether this should be 2 or 3. It depends on how many rising clock
+// edges MEMRQ is held for, plus 1 additional cycle. Going to 3 creates
+// noticeable slowdowns in Space Fury.
+static constexpr int WAIT_STATES = 2;
/*************************************
@@ -160,10 +156,10 @@
*
*************************************/
-INPUT_CHANGED_MEMBER(segag80v_state::service_switch)
+WRITE_LINE_MEMBER(segag80v_state::service_switch_w)
{
- /* pressing the service switch sends an NMI */
- if (newval)
+ // pressing the service switch sends an NMI
+ if (state)
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
@@ -172,13 +168,15 @@ void segag80v_state::machine_start()
{
m_scrambled_write_pc = 0xffff;
- /* register for save states */
save_item(NAME(m_mult_data));
save_item(NAME(m_mult_result));
save_item(NAME(m_spinner_select));
save_item(NAME(m_spinner_sign));
save_item(NAME(m_spinner_count));
save_item(NAME(m_scrambled_write_pc));
+ save_item(NAME(m_coin_ff_state));
+ save_item(NAME(m_coin_last_state));
+ save_item(NAME(m_edgint_ff_state));
}
@@ -189,10 +187,10 @@ void segag80v_state::machine_start()
*
*************************************/
-uint8_t segag80v_state::g80v_opcode_r(offs_t offset)
+u8 segag80v_state::opcode_r(offs_t offset)
{
// opcodes themselves are not scrambled
- uint8_t op = m_maincpu->space(AS_PROGRAM).read_byte(offset);
+ u8 op = m_maincpu->space(AS_PROGRAM).read_byte(offset);
// writes via opcode $32 (LD $(XXYY),A) get scrambled
if (!machine().side_effects_disabled())
@@ -209,17 +207,21 @@ offs_t segag80v_state::decrypt_offset(offs_t offset)
offs_t pc = m_scrambled_write_pc;
m_scrambled_write_pc = 0xffff;
- /* munge the low byte of the address */
+ // munge the low byte of the address
return (offset & 0xff00) | (*m_decrypt)(pc, offset & 0xff);
}
-void segag80v_state::mainram_w(offs_t offset, uint8_t data)
+void segag80v_state::mainram_w(offs_t offset, u8 data)
{
m_mainram[decrypt_offset(offset)] = data;
}
-void segag80v_state::usb_ram_w(offs_t offset, uint8_t data){ m_usb->ram_w(decrypt_offset(offset), data); }
-void segag80v_state::vectorram_w(offs_t offset, uint8_t data)
+void segag80v_state::usb_ram_w(offs_t offset, u8 data)
+{
+ m_usb->ram_w(decrypt_offset(offset), data);
+}
+
+void segag80v_state::vectorram_w(offs_t offset, u8 data)
{
m_vectorram[decrypt_offset(offset)] = data;
}
@@ -232,28 +234,50 @@ void segag80v_state::vectorram_w(offs_t offset, uint8_t data)
*
*************************************/
-inline uint8_t segag80v_state::demangle(uint8_t d7d6, uint8_t d5d4, uint8_t d3d2, uint8_t d1d0)
+//
+// I/O port mapping
+//
+// +--------------- Offset-----------------+
+// | 0 | 1 | 2 | 3 |
+// +----+---------+---------+---------+---------+
+// | D7 | COINA | n/c | n/c | n/c |
+// | D6 | COINB | P1.13 | P1.14 | n/c |
+// | D5 | SERVICE | P1.15 | P1.16 | P1.17 |
+// | D4 | P1.18 | P1.19 | P1.20 | P1.21 |
+// | D3 | SW1.8 | SW1.7 | SW1.6 | SW1.5 |
+// | D2 | SW1.4 | SW1.3 | SW1.2 | SW1.1 |
+// | D1 | SW2.8 | SW2.7 | SW2.6 | SW2.5 |
+// | D0 | SW2.4 | SW2.3 | SW2.2 | SW2.1 |
+// +----+---------+---------+---------+---------+
+//
+// Notes:
+// COINA, COINB are gated to be impulses, and signal an INT
+// SERVICE is gated to be an impulse, but does not signal
+// P1.13 = DRAW signal from XY board
+//
+// The input ports are mapped to how the schematics show them, so
+// to achieve the matrix above, they must be demangled.
+//
+
+u8 segag80v_state::mangled_ports_r(offs_t offset)
{
- return ((d7d6 << 7) & 0x80) | ((d7d6 << 2) & 0x40) |
- ((d5d4 << 5) & 0x20) | ((d5d4 << 0) & 0x10) |
- ((d3d2 << 3) & 0x08) | ((d3d2 >> 2) & 0x04) |
- ((d1d0 << 1) & 0x02) | ((d1d0 >> 4) & 0x01);
-}
+ u8 d7d6 = m_d7d6->read();
+ u8 d5d4 = m_d5d4->read();
+ u8 d3d2 = m_d3d2->read();
+ u8 d1d0 = m_d1d0->read();
+
+ offset &= 3;
+ u8 result =
+ (BIT(d7d6, offset + 0) << 7) |
+ (BIT(d7d6, offset + 4) << 6) |
+ (BIT(d5d4, offset + 0) << 5) |
+ (BIT(d5d4, offset + 4) << 4) |
+ (BIT(d3d2, offset + 0) << 3) |
+ (BIT(d3d2, offset + 4) << 2) |
+ (BIT(d1d0, offset + 0) << 1) |
+ (BIT(d1d0, offset + 4) << 0);
-
-uint8_t segag80v_state::mangled_ports_r(offs_t offset)
-{
- /* The input ports are odd. Neighboring lines are read via a mux chip */
- /* one bit at a time. This means that one bank of DIP switches will be */
- /* read as two bits from each of 4 ports. For this reason, the input */
- /* ports have been organized logically, and are demangled at runtime. */
- /* 4 input ports each provide 8 bits of information. */
- uint8_t d7d6 = ioport("D7D6")->read();
- uint8_t d5d4 = ioport("D5D4")->read();
- uint8_t d3d2 = ioport("D3D2")->read();
- uint8_t d1d0 = ioport("D1D0")->read();
- int shift = offset & 3;
- return demangle(d7d6 >> shift, d5d4 >> shift, d3d2 >> shift, d1d0 >> shift);
+ return result;
}
@@ -264,28 +288,24 @@ uint8_t segag80v_state::mangled_ports_r(offs_t offset)
*
*************************************/
-void segag80v_state::spinner_select_w(uint8_t data)
+void segag80v_state::spinner_select_w(u8 data)
{
m_spinner_select = data;
}
-uint8_t segag80v_state::spinner_input_r()
+u8 segag80v_state::spinner_input_r()
{
- int8_t delta;
-
if (m_spinner_select & 1)
- return ioport("FC")->read();
-
-/*
- * The values returned are always increasing. That is, regardless of whether
- * you turn the spinner left or right, the self-test should always show the
- * number as increasing. The direction is only reflected in the least
- * significant bit.
- */
-
- /* I'm sure this can be further simplified ;-) BW */
- delta = ioport("SPINNER")->read();
+ return m_fc->read();
+
+ //
+ // The values returned are always increasing. That is, regardless of whether
+ // you turn the spinner left or right, the self-test should always show the
+ // number as increasing. The direction is only reflected in the least
+ // significant bit.
+ //
+ s8 delta = m_spinner->read();
if (delta != 0)
{
m_spinner_sign = (delta >> 7) & 1;
@@ -304,32 +324,33 @@ uint8_t segag80v_state::spinner_input_r()
READ_LINE_MEMBER(segag80v_state::elim4_joint_coin_r)
{
- return (ioport("COINS")->read() & 0xf) != 0xf;
+ return (m_coins->read() & 0xf) != 0xf;
}
-uint8_t segag80v_state::elim4_input_r()
+u8 segag80v_state::elim4_input_r()
{
- uint8_t result = 0;
+ u8 result = 0;
- /* bit 3 enables demux */
- if (m_spinner_select & 8)
+ // bit 3 enables demux
+ if (BIT(m_spinner_select, 3) != 0)
{
- /* Demux bit 0-2. Only 6 and 7 are connected */
+ // Demux bit 0-2. Only 6 and 7 are connected
switch (m_spinner_select & 7)
{
case 6:
- /* player 3 & 4 controls */
- result = ioport("FC")->read();
+ // player 3 & 4 controls
+ result = m_fc->read();
break;
+
case 7:
- /* the 4 coin inputs */
- result = ioport("COINS")->read();
+ // the 4 coin inputs
+ result = m_coins->read();
break;
}
}
- /* LS240 has inverting outputs */
+ // LS240 has inverting outputs
return (result ^ 0xff);
}
@@ -341,7 +362,7 @@ uint8_t segag80v_state::elim4_input_r()
*
*************************************/
-void segag80v_state::multiply_w(offs_t offset, uint8_t data)
+void segag80v_state::multiply_w(offs_t offset, u8 data)
{
m_mult_data[offset] = data;
if (offset == 1)
@@ -349,9 +370,9 @@ void segag80v_state::multiply_w(offs_t offset, uint8_t data)
}
-uint8_t segag80v_state::multiply_r()
+u8 segag80v_state::multiply_r()
{
- uint8_t result = m_mult_result;
+ u8 result = m_mult_result;
m_mult_result >>= 8;
return result;
}
@@ -364,21 +385,76 @@ uint8_t segag80v_state::multiply_r()
*
*************************************/
-void segag80v_state::coin_count_w(uint8_t data)
+void segag80v_state::coin_count_w(u8 data)
{
machine().bookkeeping().coin_counter_w(0, (data >> 7) & 1);
machine().bookkeeping().coin_counter_w(1, (data >> 6) & 1);
}
-void segag80v_state::unknown_w(uint8_t data)
+void segag80v_state::unknown_w(u8 data)
{
- /* writing an 0x04 here enables interrupts */
- /* some games write 0x00/0x01 here as well */
+ // writing an 0x04 here enables interrupts
+ // some games write 0x00/0x01 here as well
if (data != 0x00 && data != 0x01 && data != 0x04)
osd_printf_debug("%04X:unknown_w = %02X\n", m_maincpu->pc(), data);
}
+READ_LINE_MEMBER(segag80v_state::draw_r)
+{
+ return (machine().scheduler().time() < m_draw_end_time);
+}
+
+
+
+/*************************************
+ *
+ * Main CPU interrupts
+ *
+ *************************************/
+
+void segag80v_state::vblank_callback(screen_device &screen, bool state)
+{
+ if (!state)
+ {
+ m_edgint_ff_state = 1;
+ update_int();
+ }
+}
+
+void segag80v_state::update_int()
+{
+ //
+ // IRQ signal comes from multiple sources:
+ // * XINT signal, which is a combination of:
+ // - COINA impulse, clocks an LS74, cleared by INTCL signal
+ // - COINB impulse, clocks an LS74, cleared by INTCL signal
+ // - SERVICE impulse
+ // * /EDGINT signal from vector board, clocks an LS74, cleared by INTCL signal
+ // - signal comes from 15468480 crystal, divided by 3, and then by 0x1f788
+ // * /INT signal from ???
+ //
+
+ if (m_coin_ff_state != 0 || m_edgint_ff_state != 0)
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
+ else
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
+
+ // SERVICE coin doesn't have a flip-flop; it's instantaneous
+ m_coin_ff_state &= ~0x04;
+}
+
+WRITE_LINE_MEMBER(segag80v_state::irq_ack_w)
+{
+ if (state)
+ {
+ // INTCL signal clears both coin flip-flops and EDGINT flip-flop
+ m_coin_ff_state = 0;
+ m_edgint_ff_state = 0;
+ update_int();
+ }
+}
+
/*************************************
@@ -387,26 +463,26 @@ void segag80v_state::unknown_w(uint8_t data)
*
*************************************/
-/* complete memory map derived from schematics */
+// complete memory map derived from schematics
void segag80v_state::main_map(address_map &map)
{
- map(0x0000, 0x07ff).rom(); /* CPU board ROM */
- map(0x0800, 0xbfff).rom(); /* PROM board ROM area */
+ map(0x0000, 0x07ff).rom(); // CPU board ROM
+ map(0x0800, 0xbfff).rom(); // PROM board ROM area
map(0xc800, 0xcfff).ram().w(FUNC(segag80v_state::mainram_w)).share("mainram");
map(0xe000, 0xefff).ram().w(FUNC(segag80v_state::vectorram_w)).share("vectorram");
}
void segag80v_state::opcodes_map(address_map &map)
{
- map(0x0000, 0xffff).r(FUNC(segag80v_state::g80v_opcode_r));
+ map(0x0000, 0xffff).r(FUNC(segag80v_state::opcode_r));
}
-/* complete memory map derived from schematics */
+// complete memory map derived from schematics
void segag80v_state::main_portmap(address_map &map)
{
map.global_mask(0xff);
- map(0xbc, 0xbc); /* .r(FUNC(segag80v_state::)); ??? */
+ map(0xbc, 0xbc); // .r(FUNC(segag80v_state::)); ???
map(0xbd, 0xbe).w(FUNC(segag80v_state::multiply_w));
map(0xbe, 0xbe).r(FUNC(segag80v_state::multiply_r));
map(0xbf, 0xbf).w(FUNC(segag80v_state::unknown_w));
@@ -426,24 +502,24 @@ void segag80v_state::main_portmap(address_map &map)
static INPUT_PORTS_START( g80v_generic )
PORT_START("D7D6")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(3) /* P1.5 */
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* n/c */
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* n/c */
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) /* n/c */
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(3) /* P1.8 */
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.13 */
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.14 */
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) /* n/c */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_WRITE_LINE_MEMBER(segag80v_state, coin_w<0>) // P1.5
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) // n/c
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) // n/c
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) // n/c
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_WRITE_LINE_MEMBER(segag80v_state, coin_w<1>) // P1.8
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_READ_LINE_MEMBER(segag80v_state, draw_r) // P1.13
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) // P1.14
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) // n/c
PORT_START("D5D4")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) /* P1.10 */
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 ) /* P1.15 */
- PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.16 */
- PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.17 */
- PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.18 */
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) /* P1.19 */
- PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.20 */
- PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.21 */
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) PORT_WRITE_LINE_MEMBER(segag80v_state, coin_w<2>) // P1.10
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_START1 ) // P1.15
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) // P1.16
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED ) // P1.17
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNUSED ) // P1.18
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_START2 ) // P1.19
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNUSED ) // P1.20
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) // P1.21
PORT_START("D3D2")
PORT_DIPUNUSED_DIPLOC( 0x01, 0x01, "SW1:8" )
@@ -492,17 +568,17 @@ static INPUT_PORTS_START( g80v_generic )
PORT_DIPSETTING( 0x80, DEF_STR( 1C_6C ))
PORT_START("FC")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.23 */
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.24 */
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.25 */
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.26 */
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.27 */
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.28 */
- PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.29 */
- PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) /* P1.30 */
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) // P1.23
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED ) // P1.24
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED ) // P1.25
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) // P1.26
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED ) // P1.27
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) // P1.28
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) // P1.29
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) // P1.30
PORT_START("SERVICESW")
- PORT_SERVICE_NO_TOGGLE( 0x01, IP_ACTIVE_HIGH ) PORT_CHANGED_MEMBER(DEVICE_SELF, segag80v_state,service_switch, 0)
+ PORT_SERVICE_NO_TOGGLE( 0x01, IP_ACTIVE_HIGH ) PORT_WRITE_LINE_MEMBER(segag80v_state, service_switch_w)
INPUT_PORTS_END
@@ -714,8 +790,8 @@ static INPUT_PORTS_START( zektor )
PORT_DIPSETTING( 0x40, "30000" )
PORT_MODIFY("D5D4")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.15 */
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.19 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) // P1.15
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) // P1.19
PORT_MODIFY("FC")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
@@ -755,8 +831,8 @@ static INPUT_PORTS_START( tacscan )
PORT_DIPSETTING( 0x40, "30000" )
PORT_MODIFY("D5D4")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.15 */
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.19 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) // P1.15
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) // P1.19
PORT_MODIFY("FC")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
@@ -796,8 +872,8 @@ static INPUT_PORTS_START( startrek )
PORT_DIPSETTING( 0xc0, "40000" )
PORT_MODIFY("D5D4")
- PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.15 */
- PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) /* P1.19 */
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) // P1.15
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNUSED ) // P1.19
PORT_MODIFY("FC")
@@ -816,161 +892,65 @@ INPUT_PORTS_END
/*************************************
*
- * Eliminator sound interfaces
- *
- *************************************/
-
-static const char *const elim_sample_names[] =
-{
- "*elim2",
- "elim1",
- "elim2",
- "elim3",
- "elim4",
- "elim5",
- "elim6",
- "elim7",
- "elim8",
- "elim9",
- "elim10",
- "elim11",
- "elim12",
- nullptr /* end of array */
-};
-
-
-/*************************************
- *
- * Space Fury sound interfaces
- *
- *************************************/
-
-static const char *const spacfury_sample_names[] =
-{
- "*spacfury",
- /* Sound samples */
- "sfury1",
- "sfury2",
- "sfury3",
- "sfury4",
- "sfury5",
- "sfury6",
- "sfury7",
- "sfury8",
- "sfury9",
- "sfury10",
- nullptr /* end of array */
-};
-
-/*************************************
- *
- * Zektor sound interfaces
- *
- *************************************/
-
-static const char *const zektor_sample_names[] =
-{
- "*zektor",
- "elim1", /* 0 fireball */
- "elim2", /* 1 bounce */
- "elim3", /* 2 Skitter */
- "elim4", /* 3 Eliminator */
- "elim5", /* 4 Electron */
- "elim6", /* 5 fire */
- "elim7", /* 6 thrust */
- "elim8", /* 7 Electron */
- "elim9", /* 8 small explosion */
- "elim10", /* 9 med explosion */
- "elim11", /* 10 big explosion */
- nullptr
-};
-
-
-/*************************************
- *
* Machine drivers
*
*************************************/
void segag80v_state::g80v_base(machine_config &config)
{
- /* basic machine hardware */
+ // basic machine hardware
Z80(config, m_maincpu, VIDEO_CLOCK/4);
m_maincpu->set_addrmap(AS_PROGRAM, &segag80v_state::main_map);
m_maincpu->set_addrmap(AS_OPCODES, &segag80v_state::opcodes_map);
m_maincpu->set_addrmap(AS_IO, &segag80v_state::main_portmap);
- m_maincpu->set_vblank_int("screen", FUNC(segag80v_state::irq0_line_hold));
+ m_maincpu->irqack_cb().set(FUNC(segag80v_state::irq_ack_w));
+// m_maincpu->set_vblank_int("screen", FUNC(segag80v_state::irq0_line_hold));
- /* video hardware */
+ // video hardware
SCREEN(config, m_screen, SCREEN_TYPE_VECTOR);
m_screen->set_refresh_hz(40);
m_screen->set_size(400, 300);
m_screen->set_visarea(512, 1536, 640-32, 1408+32);
m_screen->set_screen_update(FUNC(segag80v_state::screen_update_segag80v));
+ m_screen->register_vblank_callback(vblank_state_delegate(&segag80v_state::vblank_callback, this));
VECTOR(config, m_vector);
- /* sound hardware */
+ // sound hardware
SPEAKER(config, "speaker").front_center();
}
void segag80v_state::elim2(machine_config &config)
{
g80v_base(config);
-
- /* custom sound board */
- SAMPLES(config, m_samples);
- m_samples->set_channels(8);
- m_samples->set_samples_names(elim_sample_names);
- m_samples->add_route(ALL_OUTPUTS, "speaker", 1.0);
+ ELIMINATOR_AUDIO(config, m_g80_audio, 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
}
void segag80v_state::spacfury(machine_config &config)
{
g80v_base(config);
-
- /* custom sound board */
- SAMPLES(config, m_samples);
- m_samples->set_channels(8);
- m_samples->set_samples_names(spacfury_sample_names);
- m_samples->add_route(ALL_OUTPUTS, "speaker", 0.1);
-
- /* speech board */
- sega_speech_board(config);
+ SPACE_FURY_AUDIO(config, m_g80_audio, 0).add_route(ALL_OUTPUTS, "speech", 1.0);
+ SEGA_SPEECH_BOARD(config, "speech", 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
}
void segag80v_state::zektor(machine_config &config)
{
g80v_base(config);
-
- /* custom sound board */
- SAMPLES(config, m_samples);
- m_samples->set_channels(8);
- m_samples->set_samples_names(zektor_sample_names);
- m_samples->add_route(ALL_OUTPUTS, "speaker", 0.1);
-
- AY8912(config, m_aysnd, VIDEO_CLOCK/4/2).add_route(ALL_OUTPUTS, "speaker", 0.33);
-
- /* speech board */
- sega_speech_board(config);
+ ZEKTOR_AUDIO(config, m_g80_audio, 0).add_route(ALL_OUTPUTS, "speech", 0.7);
+ SEGA_SPEECH_BOARD(config, "speech", 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
}
-
void segag80v_state::tacscan(machine_config &config)
{
g80v_base(config);
-
- /* universal sound board */
SEGAUSB(config, m_usb, 0, m_maincpu).add_route(ALL_OUTPUTS, "speaker", 1.0);
}
-
void segag80v_state::startrek(machine_config &config)
{
- tacscan(config);
-
- /* speech board */
- sega_speech_board(config);
+ g80v_base(config);
+ SEGAUSB(config, m_usb, 0, m_maincpu).add_route(ALL_OUTPUTS, "speech", 1.0);
+ SEGA_SPEECH_BOARD(config, "speech", 0).add_route(ALL_OUTPUTS, "speaker", 1.0);
}
@@ -999,8 +979,8 @@ ROM_START( elim2 )
ROM_LOAD( "1345.prom-u13", 0x6800, 0x0800, CRC(40597a92) SHA1(ee1ae2b424c38b40d2cbeda4aba3328e6d3f9c81) )
ROM_REGION( 0x0420, "proms", 0 )
- ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) /* sine table */
- ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* CPU board addressing */
+ ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) // sine table
+ ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) // CPU board addressing
ROM_END
ROM_START( elim2a )
@@ -1021,8 +1001,8 @@ ROM_START( elim2a )
ROM_LOAD( "1170a.prom-u13", 0x6800, 0x0800, CRC(8cdacd35) SHA1(f24f8a74cb4b8452ddbd42e61d3b0366bbee7f98) )
ROM_REGION( 0x0420, "proms", 0 )
- ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) /* sine table */
- ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* CPU board addressing */
+ ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) // sine table
+ ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) // CPU board addressing
ROM_END
ROM_START( elim2c )
@@ -1043,8 +1023,8 @@ ROM_START( elim2c )
ROM_LOAD( "1212.prom-u13", 0x6800, 0x0800, CRC(152cf376) SHA1(56c3141598b8bac81e85b1fc7052fdd19cd95609) )
ROM_REGION( 0x0420, "proms", 0 )
- ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) /* sine table */
- ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* CPU board addressing */
+ ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) // sine table
+ ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) // CPU board addressing
ROM_END
ROM_START( elim4 )
@@ -1066,8 +1046,8 @@ ROM_START( elim4 )
ROM_LOAD( "1360.prom-u14", 0x7000, 0x0800, CRC(96d48238) SHA1(76a7b49081cd2d0dd1976077aa66b6d5ae5b2b43) )
ROM_REGION( 0x0420, "proms", 0 )
- ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) /* sine table */
- ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* CPU board addressing */
+ ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) // sine table
+ ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) // CPU board addressing
ROM_END
ROM_START( elim4p )
@@ -1089,12 +1069,12 @@ ROM_START( elim4p )
ROM_LOAD( "swe.prom-u14", 0x7000, 0x0800, CRC(ec4cc343) SHA1(00e107eaf530ce6bec2afffd7d7bedd7763cfb17) )
ROM_REGION( 0x0420, "proms", 0 )
- ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) /* sine table */
- ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* CPU board addressing */
+ ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) // sine table
+ ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) // CPU board addressing
ROM_END
-ROM_START( spacfury ) /* Revision C */
+ROM_START( spacfury ) // Revision C
ROM_REGION( 0xc000, "maincpu", 0 )
ROM_LOAD( "969c.cpu-u25", 0x0000, 0x0800, CRC(411207f2) SHA1(2a082be4052b5d8f365abd0a51ea805d270d1189) )
ROM_LOAD( "960c.prom-u1", 0x0800, 0x0800, CRC(d071ab7e) SHA1(c7d2429e4fa77988d7ac62bc68f876ffb7467838) )
@@ -1107,21 +1087,23 @@ ROM_START( spacfury ) /* Revision C */
ROM_LOAD( "967c.prom-u8", 0x4000, 0x0800, CRC(330f0751) SHA1(07ae52fdbfa2cc326f88dc76c3dc8e145b592863) )
ROM_LOAD( "968c.prom-u9", 0x4800, 0x0800, CRC(8366eadb) SHA1(8e4cb30a730237da2e933370faf5eaa1a41cacbf) )
- ROM_REGION( 0x0800, "audiocpu", 0 )
+ ROM_REGION( 0x0800, "speech:cpu", 0 )
ROM_LOAD( "808c.speech-u7", 0x0000, 0x0800, CRC(b779884b) SHA1(ac07e99717a1f51b79f3e43a5d873ebfa0559320) )
- ROM_REGION( 0x4000, SEGASND_SEGASPEECH_REGION, 0 )
+ ROM_REGION( 0x0020, "speech:proms", 0 )
+ ROM_LOAD( "6331.speech-u30", 0x0000, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) // speech board addressing
+
+ ROM_REGION( 0x4000, "speech:data", 0 )
ROM_LOAD( "970c.speech-u6", 0x0000, 0x1000, CRC(979d8535) SHA1(1ed097e563319ca6d2b7df9875ce7ee921eae468) )
ROM_LOAD( "971c.speech-u5", 0x1000, 0x1000, CRC(022dbd32) SHA1(4e0504b5ccc28094078912673c49571cf83804ab) )
ROM_LOAD( "972c.speech-u4", 0x2000, 0x1000, CRC(fad9346d) SHA1(784e5ab0fb00235cfd733c502baf23960923504f) )
- ROM_REGION( 0x0440, "proms", 0 )
- ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) /* sine table */
- ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* CPU board addressing */
- ROM_LOAD( "6331.speech-u30", 0x0420, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) /* speech board addressing */
+ ROM_REGION( 0x0420, "proms", 0 )
+ ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) // sine table
+ ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) // CPU board addressing
ROM_END
-ROM_START( spacfurya ) /* Revision A */
+ROM_START( spacfurya ) // Revision A
ROM_REGION( 0xc000, "maincpu", 0 )
ROM_LOAD( "969a.cpu-u25", 0x0000, 0x0800, CRC(896a615c) SHA1(542386196eca9fd822e36508e173201ee8a962ed) )
ROM_LOAD( "960a.prom-u1", 0x0800, 0x0800, CRC(e1ea7964) SHA1(9c84c525973fcf1437b062d98195272723249d02) )
@@ -1134,21 +1116,23 @@ ROM_START( spacfurya ) /* Revision A */
ROM_LOAD( "967a.prom-u8", 0x4000, 0x0800, CRC(d60f667d) SHA1(821271ec1918e22ed29a5b1f4b0182765ef5ba10) )
ROM_LOAD( "968a.prom-u9", 0x4800, 0x0800, CRC(aea85b6a) SHA1(8778ff0be34cd4fd5b8f6f76c64bfca68d4d240e) )
- ROM_REGION( 0x0800, "audiocpu", 0 )
+ ROM_REGION( 0x0800, "speech:cpu", 0 )
ROM_LOAD( "808a.speech-u7", 0x0000, 0x0800, CRC(5988c767) SHA1(3b91a8cd46aa7e714028cc40f700fea32287afb1) )
- ROM_REGION( 0x4000, SEGASND_SEGASPEECH_REGION, 0 )
+ ROM_REGION( 0x0020, "speech:proms", 0 )
+ ROM_LOAD( "6331.speech-u30", 0x0000, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) // speech board addressing
+
+ ROM_REGION( 0x4000, "speech:data", 0 )
ROM_LOAD( "970.speech-u6", 0x0000, 0x1000, CRC(f3b47b36) SHA1(6ae0b627349664140a7f70799645b368e452d69c) )
ROM_LOAD( "971.speech-u5", 0x1000, 0x1000, CRC(e72bbe88) SHA1(efadf8aa448c289cf4d0cf1831255b9ac60820f2) )
ROM_LOAD( "972.speech-u4", 0x2000, 0x1000, CRC(8b3da539) SHA1(3a0c4af96a2116fc668a340534582776b2018663) )
- ROM_REGION( 0x0440, "proms", 0 )
- ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) /* sine table */
- ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* CPU board addressing */
- ROM_LOAD( "6331.speech-u30", 0x0420, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) /* speech board addressing */
+ ROM_REGION( 0x0420, "proms", 0 )
+ ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) // sine table
+ ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) // CPU board addressing
ROM_END
-ROM_START( spacfuryb ) /* Revision B */
+ROM_START( spacfuryb ) // Revision B
ROM_REGION( 0xc000, "maincpu", 0 )
ROM_LOAD( "969a.cpu-u25", 0x0000, 0x0800, CRC(896a615c) SHA1(542386196eca9fd822e36508e173201ee8a962ed) )
ROM_LOAD( "960b.prom-u1", 0x0800, 0x0800, CRC(8a99b63f) SHA1(4b9ec152e0fad50afeea11f5d61331f3211da606) )
@@ -1161,18 +1145,20 @@ ROM_START( spacfuryb ) /* Revision B */
ROM_LOAD( "967b.prom-u8", 0x4000, 0x0800, CRC(82b5768d) SHA1(823d8c0a537bad62e8186f88f8d02a0f3dc6da0f) )
ROM_LOAD( "968b.prom-u9", 0x4800, 0x0800, CRC(fea68f02) SHA1(83bef40dfaac014b7929239d81075335ff8fd506) )
- ROM_REGION( 0x0800, "audiocpu", 0 )
+ ROM_REGION( 0x0800, "speech:cpu", 0 )
ROM_LOAD( "808a.speech-u7", 0x0000, 0x0800, CRC(5988c767) SHA1(3b91a8cd46aa7e714028cc40f700fea32287afb1) )
- ROM_REGION( 0x4000, SEGASND_SEGASPEECH_REGION, 0 )
+ ROM_REGION( 0x0020, "speech:proms", 0 )
+ ROM_LOAD( "6331.speech-u30", 0x0000, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) // speech board addressing
+
+ ROM_REGION( 0x4000, "speech:data", 0 )
ROM_LOAD( "970.speech-u6", 0x0000, 0x1000, CRC(f3b47b36) SHA1(6ae0b627349664140a7f70799645b368e452d69c) )
ROM_LOAD( "971.speech-u5", 0x1000, 0x1000, CRC(e72bbe88) SHA1(efadf8aa448c289cf4d0cf1831255b9ac60820f2) )
ROM_LOAD( "972.speech-u4", 0x2000, 0x1000, CRC(8b3da539) SHA1(3a0c4af96a2116fc668a340534582776b2018663) )
- ROM_REGION( 0x0440, "proms", 0 )
- ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) /* sine table */
- ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* CPU board addressing */
- ROM_LOAD( "6331.speech-u30", 0x0420, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) /* speech board addressing */
+ ROM_REGION( 0x0420, "proms", 0 )
+ ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) // sine table
+ ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) // CPU board addressing
ROM_END
@@ -1201,18 +1187,20 @@ ROM_START( zektor )
ROM_LOAD( "1605.prom-u20", 0xa000, 0x0800, CRC(e27d7144) SHA1(5b82fda797d86e11882d1f9738a59092c5e3e7d8) )
ROM_LOAD( "1606.prom-u21", 0xa800, 0x0800, CRC(7965f636) SHA1(5c8720beedab4979a813ce7f0e8961c863973ff7) )
- ROM_REGION( 0x0800, "audiocpu", 0 )
+ ROM_REGION( 0x0800, "speech:cpu", 0 )
ROM_LOAD( "1607.speech-u7", 0x0000, 0x0800, CRC(b779884b) SHA1(ac07e99717a1f51b79f3e43a5d873ebfa0559320) )
- ROM_REGION( 0x4000, SEGASND_SEGASPEECH_REGION, 0 )
+ ROM_REGION( 0x0020, "speech:proms", 0 )
+ ROM_LOAD( "6331.speech-u30", 0x0000, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) // speech board addressing
+
+ ROM_REGION( 0x4000, "speech:data", 0 )
ROM_LOAD( "1608.speech-u6", 0x0000, 0x1000, CRC(637e2b13) SHA1(8a470f9a8a722f7ced340c4d32b4cf6f05b3e848) )
ROM_LOAD( "1609.speech-u5", 0x1000, 0x1000, CRC(675ee8e5) SHA1(e314482028b8925ad02e833a1d22224533d0a683) )
ROM_LOAD( "1610.speech-u4", 0x2000, 0x1000, CRC(2915c7bd) SHA1(3ed98747b5237aa1b3bab6866292370dc2c7655a) )
- ROM_REGION( 0x0440, "proms", 0 )
- ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) /* sine table */
- ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* CPU board addressing */
- ROM_LOAD( "6331.speech-u30", 0x0420, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) /* speech board addressing */
+ ROM_REGION( 0x0420, "proms", 0 )
+ ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) // sine table
+ ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) // CPU board addressing
ROM_END
@@ -1242,8 +1230,8 @@ ROM_START( tacscan )
ROM_LOAD( "1710a.prom-u21", 0xa800, 0x0800, CRC(6203be22) SHA1(89731c7c88d0125a11368d707f566eb53c783266) )
ROM_REGION( 0x0420, "proms", 0 )
- ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) /* sine table */
- ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* CPU board addressing */
+ ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) // sine table
+ ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) // CPU board addressing
ROM_END
@@ -1274,17 +1262,19 @@ ROM_START( startrek )
ROM_LOAD( "1869.prom-u22", 0xb000, 0x0800, CRC(e5663070) SHA1(735944c2b924964f72f3bb3d251a35ea2aef3d15) )
ROM_LOAD( "1870.prom-u23", 0xb800, 0x0800, CRC(4340616d) SHA1(e93686a29377933332523425532d102e30211111) )
- ROM_REGION( 0x0800, "audiocpu", 0 )
+ ROM_REGION( 0x0800, "speech:cpu", 0 )
ROM_LOAD( "1670.speech-u7", 0x0000, 0x0800, CRC(b779884b) SHA1(ac07e99717a1f51b79f3e43a5d873ebfa0559320) )
- ROM_REGION( 0x4000, SEGASND_SEGASPEECH_REGION, 0 )
+ ROM_REGION( 0x0020, "speech:proms", 0 )
+ ROM_LOAD( "6331.speech-u30", 0x0000, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) // speech board addressing
+
+ ROM_REGION( 0x4000, "speech:data", 0 )
ROM_LOAD( "1871.speech-u6", 0x0000, 0x1000, CRC(03713920) SHA1(25a0158cab9983248e91133f96d1849c9e9bcbd2) )
ROM_LOAD( "1872.speech-u5", 0x1000, 0x1000, CRC(ebb5c3a9) SHA1(533b6f0499b311f561cf7aba14a7f48ca7c47321) )
- ROM_REGION( 0x0440, "proms", 0 )
- ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) /* sine table */
- ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) /* CPU board addressing */
- ROM_LOAD( "6331.speech-u30", 0x0420, 0x0020, CRC(adcb81d0) SHA1(74b0efc7e8362b0c98e54a6107981cff656d87e1) ) /* speech board addressing */
+ ROM_REGION( 0x0420, "proms", 0 )
+ ROM_LOAD( "s-c.xyt-u39", 0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) ) // sine table
+ ROM_LOAD( "pr-82.cpu-u15", 0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) ) // CPU board addressing
ROM_END
@@ -1295,31 +1285,59 @@ ROM_END
*
*************************************/
+void segag80v_state::init_waitstates()
+{
+ address_space &pgmspace = m_maincpu->space(AS_PROGRAM);
+ address_space &opspace = m_maincpu->space(AS_OPCODES);
+
+ pgmspace.install_read_tap(0x0000, 0xffff, "program_waitstate_r",[this](offs_t offset, u8 &data, u8 mem_mask)
+ {
+ if (!machine().side_effects_disabled())
+ m_maincpu->adjust_icount(-WAIT_STATES);
+ return data;
+ });
+ pgmspace.install_write_tap(0x0000, 0xffff, "program_waitstate_w",[this](offs_t offset, u8 &data, u8 mem_mask)
+ {
+ if (!machine().side_effects_disabled())
+ m_maincpu->adjust_icount(-WAIT_STATES);
+ return data;
+ });
+
+ opspace.install_read_tap(0x0000, 0xffff, "opcodes_waitstate_r",[this](offs_t offset, u8 &data, u8 mem_mask)
+ {
+ if (!machine().side_effects_disabled())
+ m_maincpu->adjust_icount(-WAIT_STATES);
+ return data;
+ });
+}
+
void segag80v_state::init_elim2()
{
+ init_waitstates();
+
address_space &iospace = m_maincpu->space(AS_IO);
- /* configure security */
+ // configure security
m_decrypt = segag80_security(70);
- /* configure sound */
- iospace.install_write_handler(0x3e, 0x3e, write8smo_delegate(*this, FUNC(segag80v_state::elim1_sh_w)));
- iospace.install_write_handler(0x3f, 0x3f, write8smo_delegate(*this, FUNC(segag80v_state::elim2_sh_w)));
+ // configure sound
+ iospace.install_write_handler(0x3e, 0x3f, write8sm_delegate(*m_g80_audio, FUNC(segag80_audio_device::write)));
}
void segag80v_state::init_elim4()
{
+ init_waitstates();
+
address_space &iospace = m_maincpu->space(AS_IO);
- /* configure security */
+ // configure security
m_decrypt = segag80_security(76);
- /* configure sound */
- iospace.install_write_handler(0x3e, 0x3e, write8smo_delegate(*this, FUNC(segag80v_state::elim1_sh_w)));
- iospace.install_write_handler(0x3f, 0x3f, write8smo_delegate(*this, FUNC(segag80v_state::elim2_sh_w)));
+ // configure sound
+ iospace.install_write_handler(0x3e, 0x3f, write8sm_delegate(*m_g80_audio, FUNC(segag80_audio_device::write)));
- /* configure inputs */
+ // configure inputs
iospace.install_write_handler(0xf8, 0xf8, write8smo_delegate(*this, FUNC(segag80v_state::spinner_select_w)));
iospace.install_read_handler(0xfc, 0xfc, read8smo_delegate(*this, FUNC(segag80v_state::elim4_input_r)));
}
@@ -1327,34 +1345,36 @@ void segag80v_state::init_elim4()
void segag80v_state::init_spacfury()
{
+ init_waitstates();
+
address_space &iospace = m_maincpu->space(AS_IO);
- /* configure security */
+ // configure security
m_decrypt = segag80_security(64);
- /* configure sound */
- iospace.install_write_handler(0x38, 0x38, write8smo_delegate(*m_speech, FUNC(speech_sound_device::data_w)));
- iospace.install_write_handler(0x3b, 0x3b, write8smo_delegate(*m_speech, FUNC(speech_sound_device::control_w)));
- iospace.install_write_handler(0x3e, 0x3e, write8smo_delegate(*this, FUNC(segag80v_state::spacfury1_sh_w)));
- iospace.install_write_handler(0x3f, 0x3f, write8smo_delegate(*this, FUNC(segag80v_state::spacfury2_sh_w)));
+ // configure sound
+ iospace.install_write_handler(0x38, 0x38, write8smo_delegate(*m_speech, FUNC(sega_speech_device::data_w)));
+ iospace.install_write_handler(0x3b, 0x3b, write8smo_delegate(*m_speech, FUNC(sega_speech_device::control_w)));
+ iospace.install_write_handler(0x3e, 0x3f, write8sm_delegate(*m_g80_audio, FUNC(segag80_audio_device::write)));
}
void segag80v_state::init_zektor()
{
+ init_waitstates();
+
address_space &iospace = m_maincpu->space(AS_IO);
- /* configure security */
+ // configure security
m_decrypt = segag80_security(82);
- /* configure sound */
- iospace.install_write_handler(0x38, 0x38, write8smo_delegate(*m_speech, FUNC(speech_sound_device::data_w)));
- iospace.install_write_handler(0x3b, 0x3b, write8smo_delegate(*m_speech, FUNC(speech_sound_device::control_w)));
- iospace.install_write_handler(0x3c, 0x3d, write8sm_delegate(*m_aysnd, FUNC(ay8912_device::address_data_w)));
- iospace.install_write_handler(0x3e, 0x3e, write8smo_delegate(*this, FUNC(segag80v_state::zektor1_sh_w)));
- iospace.install_write_handler(0x3f, 0x3f, write8smo_delegate(*this, FUNC(segag80v_state::zektor2_sh_w)));
+ // configure sound
+ iospace.install_write_handler(0x38, 0x38, write8smo_delegate(*m_speech, FUNC(sega_speech_device::data_w)));
+ iospace.install_write_handler(0x3b, 0x3b, write8smo_delegate(*m_speech, FUNC(sega_speech_device::control_w)));
+ iospace.install_write_handler(0x3c, 0x3d, write8sm_delegate(*m_g80_audio, FUNC(segag80_audio_device::write_ay)));
+ iospace.install_write_handler(0x3e, 0x3f, write8sm_delegate(*m_g80_audio, FUNC(segag80_audio_device::write)));
- /* configure inputs */
+ // configure inputs
iospace.install_write_handler(0xf8, 0xf8, write8smo_delegate(*this, FUNC(segag80v_state::spinner_select_w)));
iospace.install_read_handler(0xfc, 0xfc, read8smo_delegate(*this, FUNC(segag80v_state::spinner_input_r)));
}
@@ -1362,18 +1382,20 @@ void segag80v_state::init_zektor()
void segag80v_state::init_tacscan()
{
+ init_waitstates();
+
address_space &pgmspace = m_maincpu->space(AS_PROGRAM);
address_space &iospace = m_maincpu->space(AS_IO);
- /* configure security */
+ // configure security
m_decrypt = segag80_security(76);
- /* configure sound */
+ // configure sound
iospace.install_readwrite_handler(0x3f, 0x3f, read8smo_delegate(*m_usb, FUNC(usb_sound_device::status_r)), write8smo_delegate(*m_usb, FUNC(usb_sound_device::data_w)));
pgmspace.install_read_handler(0xd000, 0xdfff, read8sm_delegate(*m_usb, FUNC(usb_sound_device::ram_r)));
pgmspace.install_write_handler(0xd000, 0xdfff, write8sm_delegate(*this, FUNC(segag80v_state::usb_ram_w)));
- /* configure inputs */
+ // configure inputs
iospace.install_write_handler(0xf8, 0xf8, write8smo_delegate(*this, FUNC(segag80v_state::spinner_select_w)));
iospace.install_read_handler(0xfc, 0xfc, read8smo_delegate(*this, FUNC(segag80v_state::spinner_input_r)));
}
@@ -1381,21 +1403,23 @@ void segag80v_state::init_tacscan()
void segag80v_state::init_startrek()
{
+ init_waitstates();
+
address_space &pgmspace = m_maincpu->space(AS_PROGRAM);
address_space &iospace = m_maincpu->space(AS_IO);
- /* configure security */
+ // configure security
m_decrypt = segag80_security(64);
- /* configure sound */
- iospace.install_write_handler(0x38, 0x38, write8smo_delegate(*m_speech, FUNC(speech_sound_device::data_w)));
- iospace.install_write_handler(0x3b, 0x3b, write8smo_delegate(*m_speech, FUNC(speech_sound_device::control_w)));
+ // configure sound
+ iospace.install_write_handler(0x38, 0x38, write8smo_delegate(*m_speech, FUNC(sega_speech_device::data_w)));
+ iospace.install_write_handler(0x3b, 0x3b, write8smo_delegate(*m_speech, FUNC(sega_speech_device::control_w)));
iospace.install_readwrite_handler(0x3f, 0x3f, read8smo_delegate(*m_usb, FUNC(usb_sound_device::status_r)), write8smo_delegate(*m_usb, FUNC(usb_sound_device::data_w)));
pgmspace.install_read_handler(0xd000, 0xdfff, read8sm_delegate(*m_usb, FUNC(usb_sound_device::ram_r)));
pgmspace.install_write_handler(0xd000, 0xdfff, write8sm_delegate(*this, FUNC(segag80v_state::usb_ram_w)));
- /* configure inputs */
+ // configure inputs
iospace.install_write_handler(0xf8, 0xf8, write8smo_delegate(*this, FUNC(segag80v_state::spinner_select_w)));
iospace.install_read_handler(0xfc, 0xfc, read8smo_delegate(*this, FUNC(segag80v_state::spinner_input_r)));
}
@@ -1409,14 +1433,14 @@ void segag80v_state::init_startrek()
*************************************/
// YEAR, NAME, PARENT, MACHINE, INPUT, STATE INIT, MONITOR, COMPANY, FULLNAME,FLAGS
-GAME( 1981, elim2, 0, elim2, elim2, segag80v_state, init_elim2, ORIENTATION_FLIP_Y, "Gremlin", "Eliminator (2 Players, set 1)", MACHINE_IMPERFECT_SOUND )
-GAME( 1981, elim2a, elim2, elim2, elim2, segag80v_state, init_elim2, ORIENTATION_FLIP_Y, "Gremlin", "Eliminator (2 Players, set 2)", MACHINE_IMPERFECT_SOUND )
-GAME( 1981, elim2c, elim2, elim2, elim2c, segag80v_state, init_elim2, ORIENTATION_FLIP_Y, "Gremlin", "Eliminator (2 Players, cocktail)", MACHINE_IMPERFECT_SOUND )
-GAME( 1981, elim4, elim2, elim2, elim4, segag80v_state, init_elim4, ORIENTATION_FLIP_Y, "Gremlin", "Eliminator (4 Players)", MACHINE_IMPERFECT_SOUND )
-GAME( 1981, elim4p, elim2, elim2, elim4, segag80v_state, init_elim4, ORIENTATION_FLIP_Y, "Gremlin", "Eliminator (4 Players, prototype)", MACHINE_IMPERFECT_SOUND )
-GAME( 1981, spacfury, 0, spacfury, spacfury, segag80v_state, init_spacfury, ORIENTATION_FLIP_Y, "Sega", "Space Fury (revision C)", MACHINE_IMPERFECT_SOUND )
-GAME( 1981, spacfurya, spacfury, spacfury, spacfury, segag80v_state, init_spacfury, ORIENTATION_FLIP_Y, "Sega", "Space Fury (revision A)", MACHINE_IMPERFECT_SOUND )
-GAME( 1981, spacfuryb, spacfury, spacfury, spacfury, segag80v_state, init_spacfury, ORIENTATION_FLIP_Y, "Sega", "Space Fury (revision B)", MACHINE_IMPERFECT_SOUND )
-GAME( 1982, zektor, 0, zektor, zektor, segag80v_state, init_zektor, ORIENTATION_FLIP_Y, "Sega", "Zektor (revision B)", MACHINE_IMPERFECT_SOUND )
-GAME( 1982, tacscan, 0, tacscan, tacscan, segag80v_state, init_tacscan, ORIENTATION_FLIP_X ^ ROT270, "Sega", "Tac/Scan", MACHINE_IMPERFECT_SOUND )
-GAME( 1982, startrek, 0, startrek, startrek, segag80v_state, init_startrek, ORIENTATION_FLIP_Y, "Sega", "Star Trek", MACHINE_IMPERFECT_SOUND )
+GAME( 1981, elim2, 0, elim2, elim2, segag80v_state, init_elim2, ORIENTATION_FLIP_Y, "Gremlin", "Eliminator (2 Players, set 1)", 0 )
+GAME( 1981, elim2a, elim2, elim2, elim2, segag80v_state, init_elim2, ORIENTATION_FLIP_Y, "Gremlin", "Eliminator (2 Players, set 2)", 0 )
+GAME( 1981, elim2c, elim2, elim2, elim2c, segag80v_state, init_elim2, ORIENTATION_FLIP_Y, "Gremlin", "Eliminator (2 Players, cocktail)", 0 )
+GAME( 1981, elim4, elim2, elim2, elim4, segag80v_state, init_elim4, ORIENTATION_FLIP_Y, "Gremlin", "Eliminator (4 Players)", 0 )
+GAME( 1981, elim4p, elim2, elim2, elim4, segag80v_state, init_elim4, ORIENTATION_FLIP_Y, "Gremlin", "Eliminator (4 Players, prototype)", 0 )
+GAME( 1981, spacfury, 0, spacfury, spacfury, segag80v_state, init_spacfury, ORIENTATION_FLIP_Y, "Sega", "Space Fury (revision C)", 0 )
+GAME( 1981, spacfurya, spacfury, spacfury, spacfury, segag80v_state, init_spacfury, ORIENTATION_FLIP_Y, "Sega", "Space Fury (revision A)", 0 )
+GAME( 1981, spacfuryb, spacfury, spacfury, spacfury, segag80v_state, init_spacfury, ORIENTATION_FLIP_Y, "Sega", "Space Fury (revision B)", 0 )
+GAME( 1982, zektor, 0, zektor, zektor, segag80v_state, init_zektor, ORIENTATION_FLIP_Y, "Sega", "Zektor (revision B)", 0 )
+GAME( 1982, tacscan, 0, tacscan, tacscan, segag80v_state, init_tacscan, ORIENTATION_FLIP_X ^ ROT270, "Sega", "Tac/Scan", 0 )
+GAME( 1982, startrek, 0, startrek, startrek, segag80v_state, init_startrek, ORIENTATION_FLIP_Y, "Sega", "Star Trek", 0 )