diff options
Diffstat (limited to 'src/mame/drivers/looping.cpp')
-rw-r--r-- | src/mame/drivers/looping.cpp | 123 |
1 files changed, 67 insertions, 56 deletions
diff --git a/src/mame/drivers/looping.cpp b/src/mame/drivers/looping.cpp index d3e82a0eacb..9f0e58c0e4a 100644 --- a/src/mame/drivers/looping.cpp +++ b/src/mame/drivers/looping.cpp @@ -58,6 +58,7 @@ L056-6 9A " " VLI-8-4 7A " #include "cpu/cop400/cop400.h" #include "cpu/tms9900/tms9995.h" #include "cpu/tms9900/tms9980a.h" +#include "machine/74259.h" #include "machine/gen_latch.h" #include "machine/watchdog.h" #include "sound/ay8910.h" @@ -115,7 +116,8 @@ public: m_dac(*this, "dac"), m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), - m_soundlatch(*this, "soundlatch") { } + m_soundlatch(*this, "soundlatch"), + m_watchdog(*this, "watchdog") { } /* memory pointers */ required_shared_ptr<uint8_t> m_videoram; @@ -126,33 +128,29 @@ public: /* tilemaps */ tilemap_t * m_bg_tilemap; - /* sound state */ - uint8_t m_sound[8]; - - int m_last; - - DECLARE_WRITE8_MEMBER(flip_screen_x_w); - DECLARE_WRITE8_MEMBER(flip_screen_y_w); + DECLARE_WRITE_LINE_MEMBER(flip_screen_x_w); + DECLARE_WRITE_LINE_MEMBER(flip_screen_y_w); DECLARE_WRITE8_MEMBER(looping_videoram_w); DECLARE_WRITE8_MEMBER(looping_colorram_w); - DECLARE_WRITE8_MEMBER(level2_irq_set); - DECLARE_WRITE8_MEMBER(main_irq_ack_w); - DECLARE_WRITE8_MEMBER(looping_souint_clr); + DECLARE_WRITE_LINE_MEMBER(level2_irq_set); + DECLARE_WRITE_LINE_MEMBER(main_irq_ack_w); + DECLARE_WRITE_LINE_MEMBER(watchdog_w); + DECLARE_WRITE_LINE_MEMBER(looping_souint_clr); DECLARE_WRITE8_MEMBER(looping_soundlatch_w); - DECLARE_WRITE8_MEMBER(ballon_enable_w); + DECLARE_WRITE_LINE_MEMBER(ballon_enable_w); DECLARE_WRITE8_MEMBER(out_0_w); DECLARE_WRITE8_MEMBER(out_2_w); DECLARE_READ8_MEMBER(adc_r); DECLARE_WRITE8_MEMBER(adc_w); - DECLARE_WRITE8_MEMBER(plr2_w); + DECLARE_WRITE_LINE_MEMBER(plr2_w); DECLARE_READ8_MEMBER(cop_unk_r); DECLARE_READ_LINE_MEMBER(cop_serial_r); DECLARE_WRITE8_MEMBER(cop_l_w); DECLARE_READ8_MEMBER(protection_r); DECLARE_WRITE_LINE_MEMBER(looping_spcint); DECLARE_WRITE8_MEMBER(looping_sound_sw); - DECLARE_WRITE8_MEMBER(ay_enable_w); - DECLARE_WRITE8_MEMBER(speech_enable_w); + DECLARE_WRITE_LINE_MEMBER(ay_enable_w); + DECLARE_WRITE_LINE_MEMBER(speech_enable_w); DECLARE_DRIVER_INIT(looping); TILE_GET_INFO_MEMBER(get_tile_info); virtual void machine_start() override; @@ -168,6 +166,7 @@ public: required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; required_device<generic_latch_8_device> m_soundlatch; + required_device<watchdog_timer_device> m_watchdog; }; @@ -248,16 +247,16 @@ void looping_state::video_start() * *************************************/ -WRITE8_MEMBER(looping_state::flip_screen_x_w) +WRITE_LINE_MEMBER(looping_state::flip_screen_x_w) { - flip_screen_x_set(~data & 0x01); + flip_screen_x_set(!state); m_bg_tilemap->set_scrollx(0, flip_screen() ? 128 : 0); } -WRITE8_MEMBER(looping_state::flip_screen_y_w) +WRITE_LINE_MEMBER(looping_state::flip_screen_y_w) { - flip_screen_y_set(~data & 0x01); + flip_screen_y_set(!state); m_bg_tilemap->set_scrollx(0, flip_screen() ? 128 : 0); } @@ -345,7 +344,6 @@ uint32_t looping_state::screen_update_looping(screen_device &screen, bitmap_ind1 void looping_state::machine_start() { - save_item(NAME(m_sound)); } void looping_state::machine_reset() @@ -366,25 +364,30 @@ INTERRUPT_GEN_MEMBER(looping_state::looping_interrupt) } -WRITE8_MEMBER(looping_state::level2_irq_set) +WRITE_LINE_MEMBER(looping_state::level2_irq_set) { - logerror("Level 2 int = %d\n", data); - if (!(data & 1)) + logerror("Level 2 int = %d\n", state); + if (state == 0) m_maincpu->set_input_line(INT_9995_INT1, ASSERT_LINE); } -WRITE8_MEMBER(looping_state::main_irq_ack_w) +WRITE_LINE_MEMBER(looping_state::main_irq_ack_w) { - if (data == 0) + if (state == 0) m_maincpu->set_input_line(INT_9995_INT1, CLEAR_LINE); } +WRITE_LINE_MEMBER(looping_state::watchdog_w) +{ + m_watchdog->watchdog_reset(); +} + -WRITE8_MEMBER(looping_state::looping_souint_clr) +WRITE_LINE_MEMBER(looping_state::looping_souint_clr) { - logerror("Soundint clr = %d\n", data); - if (data == 0) + logerror("Soundint clr = %d\n", state); + if (state == 0) m_audiocpu->set_input_line(0, CLEAR_LINE); } @@ -421,8 +424,7 @@ WRITE8_MEMBER(looping_state::looping_sound_sw) 0007 = AFA */ - m_sound[offset + 1] = data ^ 1; - m_dac->write(((m_sound[2] << 1) + m_sound[3]) * m_sound[7]); + m_dac->write(((BIT(~data, 2) << 1) + BIT(~data, 3)) * BIT(~data, 7)); } @@ -433,7 +435,7 @@ WRITE8_MEMBER(looping_state::looping_sound_sw) * *************************************/ -WRITE8_MEMBER(looping_state::ay_enable_w) +WRITE_LINE_MEMBER(looping_state::ay_enable_w) { device_t *device = machine().device("aysnd"); int output; @@ -441,24 +443,22 @@ WRITE8_MEMBER(looping_state::ay_enable_w) device_sound_interface *sound; device->interface(sound); for (output = 0; output < 3; output++) - sound->set_output_gain(output, (data & 1) ? 1.0 : 0.0); + sound->set_output_gain(output, state ? 1.0 : 0.0); } -WRITE8_MEMBER(looping_state::speech_enable_w) +WRITE_LINE_MEMBER(looping_state::speech_enable_w) { device_t *device = machine().device("tms"); device_sound_interface *sound; device->interface(sound); - sound->set_output_gain(0, (data & 1) ? 1.0 : 0.0); + sound->set_output_gain(0, state ? 1.0 : 0.0); } -WRITE8_MEMBER(looping_state::ballon_enable_w) +WRITE_LINE_MEMBER(looping_state::ballon_enable_w) { - if (m_last != data) - osd_printf_debug("ballon_enable_w = %d\n", data); - m_last = data; + osd_printf_debug("ballon_enable_w = %d\n", state); } @@ -475,7 +475,7 @@ WRITE8_MEMBER(looping_state::out_2_w){ osd_printf_debug("out2 = %02X\n", data); READ8_MEMBER(looping_state::adc_r){ osd_printf_debug("%04X:ADC read\n", space.device().safe_pc()); return 0xff; } WRITE8_MEMBER(looping_state::adc_w){ osd_printf_debug("%04X:ADC write = %02X\n", space.device().safe_pc(), data); } -WRITE8_MEMBER(looping_state::plr2_w) +WRITE_LINE_MEMBER(looping_state::plr2_w) { /* set to 1 after IDLE, cleared to 0 during processing */ /* is this an LED on the PCB? */ @@ -545,9 +545,7 @@ static ADDRESS_MAP_START( looping_map, AS_PROGRAM, 8, looping_state ) AM_RANGE(0x9840, 0x987f) AM_MIRROR(0x0700) AM_RAM AM_SHARE("spriteram") AM_RANGE(0x9880, 0x98ff) AM_MIRROR(0x0700) AM_RAM - AM_RANGE(0xb001, 0xb001) AM_MIRROR(0x07f8) AM_WRITE(level2_irq_set) - AM_RANGE(0xb006, 0xb006) AM_MIRROR(0x07f8) AM_WRITE(flip_screen_x_w) - AM_RANGE(0xb007, 0xb007) AM_MIRROR(0x07f8) AM_WRITE(flip_screen_y_w) + AM_RANGE(0xb000, 0xb007) AM_MIRROR(0x07f8) AM_DEVWRITE("videolatch", ls259_device, write_d0) AM_RANGE(0xe000, 0xefff) AM_RAM AM_RANGE(0xf800, 0xf800) AM_MIRROR(0x03fc) AM_READ_PORT("P1") AM_WRITE(out_0_w) /* /OUT0 */ @@ -557,14 +555,7 @@ static ADDRESS_MAP_START( looping_map, AS_PROGRAM, 8, looping_state ) ADDRESS_MAP_END static ADDRESS_MAP_START( looping_io_map, AS_IO, 8, looping_state ) - /* 400 = A16 */ - /* 401 = A17 */ - /* 402 = COLOR 9 */ - AM_RANGE(0x403, 0x403) AM_WRITE(plr2_w) - /* 404 = C0 */ - /* 405 = C1 */ - AM_RANGE(0x406, 0x406) AM_WRITE(main_irq_ack_w) - AM_RANGE(0x407, 0x407) AM_DEVWRITE("watchdog", watchdog_timer_device, reset_w) + AM_RANGE(0x400, 0x407) AM_DEVWRITE("mainlatch", ls259_device, write_d0) ADDRESS_MAP_END @@ -582,12 +573,8 @@ static ADDRESS_MAP_START( looping_sound_map, AS_PROGRAM, 8, looping_state ) ADDRESS_MAP_END static ADDRESS_MAP_START( looping_sound_io_map, AS_IO, 8, looping_state ) - AM_RANGE(0x000, 0x000) AM_WRITE(looping_souint_clr) - AM_RANGE(0x001, 0x007) AM_WRITE(looping_sound_sw) - AM_RANGE(0x008, 0x008) AM_WRITE(ay_enable_w) - AM_RANGE(0x009, 0x009) AM_WRITE(speech_enable_w) - AM_RANGE(0x00a, 0x00a) AM_WRITE(ballon_enable_w) - AM_RANGE(0x00b, 0x00f) AM_NOP + AM_RANGE(0x000, 0x007) AM_DEVWRITE("sen0", ls259_device, write_d0) + AM_RANGE(0x008, 0x00f) AM_DEVWRITE("sen1", ls259_device, write_d0) ADDRESS_MAP_END @@ -638,6 +625,16 @@ static MACHINE_CONFIG_START( looping ) MCFG_COP400_READ_IN_CB(READ8(looping_state, cop_unk_r)) MCFG_COP400_READ_SI_CB(READLINE(looping_state, cop_serial_r)) + MCFG_DEVICE_ADD("mainlatch", LS259, 0) // C9 on CPU board + // Q0 = A16 + // Q1 = A17 + // Q2 = COLOR 9 + MCFG_ADDRESSABLE_LATCH_Q3_OUT_CB(WRITELINE(looping_state, plr2_w)) + // Q4 = C0 + // Q5 = C1 + MCFG_ADDRESSABLE_LATCH_Q6_OUT_CB(WRITELINE(looping_state, main_irq_ack_w)) + MCFG_ADDRESSABLE_LATCH_Q7_OUT_CB(WRITELINE(looping_state, watchdog_w)) + MCFG_WATCHDOG_ADD("watchdog") /* video hardware */ @@ -651,6 +648,11 @@ static MACHINE_CONFIG_START( looping ) MCFG_PALETTE_ADD("palette", 32) MCFG_PALETTE_INIT_OWNER(looping_state, looping) + MCFG_DEVICE_ADD("videolatch", LS259, 0) // E2 on video board + MCFG_ADDRESSABLE_LATCH_Q1_OUT_CB(WRITELINE(looping_state, level2_irq_set)) + MCFG_ADDRESSABLE_LATCH_Q6_OUT_CB(WRITELINE(looping_state, flip_screen_x_w)) + MCFG_ADDRESSABLE_LATCH_Q7_OUT_CB(WRITELINE(looping_state, flip_screen_y_w)) + /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("speaker") @@ -667,6 +669,15 @@ static MACHINE_CONFIG_START( looping ) MCFG_SOUND_ADD("dac", DAC_2BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.15) // unknown DAC MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE_EX(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE_EX(0, "dac", -1.0, DAC_VREF_NEG_INPUT) + + MCFG_DEVICE_ADD("sen0", LS259, 0) // B3 on sound board + MCFG_ADDRESSABLE_LATCH_Q0_OUT_CB(WRITELINE(looping_state, looping_souint_clr)) + MCFG_ADDRESSABLE_LATCH_PARALLEL_OUT_CB(WRITE8(looping_state, looping_sound_sw)) + + MCFG_DEVICE_ADD("sen1", LS259, 0) // A1 on sound board with outputs connected to 4016 at B1 + MCFG_ADDRESSABLE_LATCH_Q0_OUT_CB(WRITELINE(looping_state, ay_enable_w)) + MCFG_ADDRESSABLE_LATCH_Q1_OUT_CB(WRITELINE(looping_state, speech_enable_w)) + MCFG_ADDRESSABLE_LATCH_Q2_OUT_CB(WRITELINE(looping_state, ballon_enable_w)) MACHINE_CONFIG_END |