diff options
Diffstat (limited to 'src/mame/drivers/segag80v.cpp')
-rw-r--r-- | src/mame/drivers/segag80v.cpp | 636 |
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 ) |