From f474673bc58555910852bae062f030283407c448 Mon Sep 17 00:00:00 2001 From: AJR Date: Mon, 6 Sep 2021 09:36:01 -0400 Subject: [PATCH] pipeline: Hook up sound communications and YM2203; fix sound PPI mapping --- src/mame/drivers/pipeline.cpp | 59 +++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/src/mame/drivers/pipeline.cpp b/src/mame/drivers/pipeline.cpp index 861ac1fd89b..c5096183443 100644 --- a/src/mame/drivers/pipeline.cpp +++ b/src/mame/drivers/pipeline.cpp @@ -89,10 +89,14 @@ public: : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_mcu(*this, "mcu") + , m_ctc(*this, "ctc") , m_gfxdecode(*this, "gfxdecode") , m_palette(*this, "palette") , m_vram1(*this, "vram1") , m_vram2(*this, "vram2") + , m_vidctrl(0) + , m_from_mcu(0) + , m_sound_data(0) { } @@ -109,6 +113,8 @@ private: void vidctrl_w(uint8_t data); uint8_t protection_r(); void protection_w(uint8_t data); + uint8_t sound_data_r(); + void sound_data_w(uint8_t data); TILE_GET_INFO_MEMBER(get_tile_info); TILE_GET_INFO_MEMBER(get_tile_info2); @@ -117,6 +123,7 @@ private: u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + TIMER_CALLBACK_MEMBER(vidctrl_deferred_w); TIMER_CALLBACK_MEMBER(protection_deferred_w); void cpu0_mem(address_map &map); @@ -125,6 +132,7 @@ private: required_device m_maincpu; required_device m_mcu; + required_device m_ctc; required_device m_gfxdecode; required_device m_palette; @@ -137,12 +145,16 @@ private: u8 m_vidctrl; std::unique_ptr m_palram; u8 m_from_mcu; + u8 m_sound_data; }; void pipeline_state::machine_start() { + membank("soundbank")->configure_entries(0, 2, memregion("audiocpu")->base() + 0x8000, 0x4000); + save_item(NAME(m_from_mcu)); + save_item(NAME(m_sound_data)); } TILE_GET_INFO_MEMBER(pipeline_state::get_tile_info) @@ -179,7 +191,14 @@ u32 pipeline_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, c void pipeline_state::vidctrl_w(uint8_t data) { - m_vidctrl = data; + // synchronization is needed to avoid spurious CTC interrupts + machine().scheduler().synchronize(timer_expired_delegate(FUNC(pipeline_state::vidctrl_deferred_w),this), data); +} + +TIMER_CALLBACK_MEMBER(pipeline_state::vidctrl_deferred_w) +{ + m_vidctrl = u8(param); + m_ctc->trg2(BIT(param, 1)); } void pipeline_state::vram2_w(offs_t offset, uint8_t data) @@ -222,6 +241,16 @@ void pipeline_state::protection_w(uint8_t data) machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(100)); } +uint8_t pipeline_state::sound_data_r() +{ + return m_sound_data; +} + +void pipeline_state::sound_data_w(uint8_t data) +{ + m_sound_data = data; +} + void pipeline_state::cpu0_mem(address_map &map) { map(0x0000, 0x7fff).rom(); @@ -237,15 +266,16 @@ void pipeline_state::cpu0_mem(address_map &map) void pipeline_state::cpu1_mem(address_map &map) { map(0x0000, 0x7fff).rom(); + map(0x8000, 0xbfff).bankr("soundbank"); map(0xc000, 0xc7ff).ram(); - map(0xe000, 0xe003).rw("ppi8255_2", FUNC(i8255_device::read), FUNC(i8255_device::write)); + map(0xe000, 0xe001).mirror(2).rw("ymsnd", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); } void pipeline_state::sound_port(address_map &map) { map.global_mask(0xff); - map(0x00, 0x03).rw("ctc", FUNC(z80ctc_device::read), FUNC(z80ctc_device::write)); - map(0x06, 0x07).noprw(); + map(0x00, 0x03).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write)); + map(0x04, 0x07).rw("ppi8255_2", FUNC(i8255_device::read), FUNC(i8255_device::write)); } void pipeline_state::mcu_porta_w(uint8_t data) @@ -355,23 +385,24 @@ void pipeline_state::pipeline_palette(palette_device &palette) const void pipeline_state::pipeline(machine_config &config) { /* basic machine hardware */ - Z80(config, m_maincpu, 7372800/2); + Z80(config, m_maincpu, 7.3728_MHz_XTAL / 2); m_maincpu->set_addrmap(AS_PROGRAM, &pipeline_state::cpu0_mem); - z80_device& audiocpu(Z80(config, "audiocpu", 7372800/2)); + z80_device& audiocpu(Z80(config, "audiocpu", 7.3728_MHz_XTAL / 2)); audiocpu.set_daisy_config(daisy_chain_sound); audiocpu.set_addrmap(AS_PROGRAM, &pipeline_state::cpu1_mem); audiocpu.set_addrmap(AS_IO, &pipeline_state::sound_port); - M68705R3(config, m_mcu, 7372800/2); + M68705R3(config, m_mcu, 7.3728_MHz_XTAL / 2); m_mcu->porta_w().set(FUNC(pipeline_state::mcu_porta_w)); - z80ctc_device& ctc(Z80CTC(config, "ctc", 7372800/2 /* same as "audiocpu" */)); - ctc.intr_callback().set_inputline("audiocpu", INPUT_LINE_IRQ0); + Z80CTC(config, m_ctc, 7.3728_MHz_XTAL / 2 /* same as "audiocpu" */); + // TODO: external clock needed for channel 1 (DAC-related)? + m_ctc->intr_callback().set_inputline("audiocpu", INPUT_LINE_IRQ0); i8255_device &ppi0(I8255A(config, "ppi8255_0")); ppi0.in_pa_callback().set_ioport("P1"); - // PORT B Write - related to sound/music : check code at 0x1c0a + ppi0.out_pb_callback().set(FUNC(pipeline_state::sound_data_w)); // related to sound/music : check code at 0x1c0a ppi0.out_pc_callback().set(FUNC(pipeline_state::vidctrl_w)); i8255_device &ppi1(I8255A(config, "ppi8255_1")); @@ -380,7 +411,9 @@ void pipeline_state::pipeline(machine_config &config) ppi1.in_pc_callback().set(FUNC(pipeline_state::protection_r)); ppi1.out_pc_callback().set(FUNC(pipeline_state::protection_w)); - I8255A(config, "ppi8255_2", 0); + i8255_device &ppi2(I8255A(config, "ppi8255_2")); + ppi2.in_pb_callback().set(FUNC(pipeline_state::sound_data_r)); + ppi2.out_pc_callback().set_membank("soundbank").bit(7); /* video hardware */ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); @@ -397,7 +430,7 @@ void pipeline_state::pipeline(machine_config &config) /* audio hardware */ SPEAKER(config, "mono").front_center(); - YM2203(config, "ymsnd", 7372800/4).add_route(ALL_OUTPUTS, "mono", 0.60); + YM2203(config, "ymsnd", 7.3728_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "mono", 0.30); } @@ -432,4 +465,4 @@ ROM_START( pipeline ) ROM_LOAD( "82s123.u79", 0x00200, 0x00020,CRC(6df3f972) SHA1(0096a7f7452b70cac6c0752cb62e24b643015b5c) ) ROM_END -GAME( 1990, pipeline, 0, pipeline, pipeline, pipeline_state, empty_init, ROT0, "Daehyun Electronics", "Pipeline", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE ) +GAME( 1990, pipeline, 0, pipeline, pipeline, pipeline_state, empty_init, ROT0, "Daehyun Electronics", "Pipeline", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )