diff options
Diffstat (limited to 'src/mame/epoch/scv.cpp')
-rw-r--r-- | src/mame/epoch/scv.cpp | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/src/mame/epoch/scv.cpp b/src/mame/epoch/scv.cpp index 271d52ec1b8..450d369b67f 100644 --- a/src/mame/epoch/scv.cpp +++ b/src/mame/epoch/scv.cpp @@ -5,15 +5,14 @@ Driver for Epoch Super Cassette Vision TODO: -- adpcm playback by upd1771, needed for star speeder. - verify video clock in European units. - verify raw video parameters. ***************************************************************************/ #include "emu.h" +#include "cpu/upd177x/upd177x.h" #include "cpu/upd7810/upd7810.h" -#include "sound/upd1771.h" #include "bus/scv/slot.h" #include "bus/scv/rom.h" #include "emupal.h" @@ -47,6 +46,7 @@ protected: virtual void machine_reset() override ATTR_COLD; TIMER_CALLBACK_MEMBER(vblank_update); + TIMER_CALLBACK_MEMBER(pa_w_update); private: void scv_palette(palette_device &palette) const; @@ -71,11 +71,12 @@ private: required_shared_ptr<u8> m_videoram; required_device<upd7801_device> m_maincpu; required_device<screen_device> m_screen; - required_device<upd1771c_device> m_upd1771c; + required_device<upd1771c_cpu_device> m_upd1771c; required_device<scv_cart_slot_device> m_cart; required_ioport_array<8> m_pa; required_ioport m_pc0; required_memory_region m_charrom; + emu_timer *m_pa_w_timer; }; @@ -88,7 +89,12 @@ void scv_state::scv_mem(address_map &map) map(0x0000, 0x0fff).rom(); // BIOS map(0x2000, 0x3403).ram().share(m_videoram); // VRAM + 4 registers - map(0x3600, 0x3600).w(m_upd1771c, FUNC(upd1771c_device::write)); + map(0x3600, 0x3600).lw8(NAME([this] (u8 data) { + // With the current cores there are sync issues between writing and clearing PA in scv kungfurd when playing back adpcm. + // During a reset an OUT PA gets executed just around the same time when the main cpu is writing to PA. + // Since the OUT PA completes while the external write to PA is still in progress the external write to PA wins. + m_pa_w_timer->adjust(m_upd1771c->cycles_to_attotime(8), data); + })); // 8000 - ff7f - Cartridge // ff80 - ffff - CPU internal RAM @@ -480,9 +486,16 @@ u32 scv_state::screen_update_scv(screen_device &screen, bitmap_ind16 &bitmap, co } +TIMER_CALLBACK_MEMBER(scv_state::pa_w_update) +{ + m_upd1771c->pa_w(param); +} + + void scv_state::machine_start() { m_vb_timer = timer_alloc(FUNC(scv_state::vblank_update), this); + m_pa_w_timer = timer_alloc(FUNC(scv_state::pa_w_update), this); save_item(NAME(m_porta)); save_item(NAME(m_portc)); @@ -540,13 +553,14 @@ void scv_state::scv(machine_config &config) return data; }); m_maincpu->pc_in_cb().set([this] () { - return (m_pc0->read() & 0x01); + return BIT(m_pc0->read(), 0); }); m_maincpu->pc_out_cb().set([this] (u8 data) { m_portc = data; m_cart->write_bank(m_portc); // Only bits 5 & 6 are exposed to the cartridge? - m_upd1771c->pcm_write(BIT(m_portc, 3)); + m_upd1771c->set_input_line(INPUT_LINE_RESET, BIT(m_portc, 3) ? CLEAR_LINE : ASSERT_LINE); }); + config.set_perfect_quantum(m_maincpu); // Video chip is EPOCH TV-1 SCREEN(config, m_screen, SCREEN_TYPE_RASTER); @@ -560,8 +574,8 @@ void scv_state::scv(machine_config &config) // Sound is generated by UPD1771C clocked at XTAL(6'000'000) SPEAKER(config, "mono").front_center(); UPD1771C(config, m_upd1771c, 6_MHz_XTAL); - m_upd1771c->ack_handler().set([this] (int state) { m_maincpu->set_input_line(UPD7810_INTF1, (state) ? ASSERT_LINE : CLEAR_LINE); }); - m_upd1771c->add_route(ALL_OUTPUTS, "mono", 1.00); + m_upd1771c->pb_out_cb().set([this] (u8 data) { m_maincpu->set_input_line(UPD7810_INTF1, BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE); }); + m_upd1771c->add_route(ALL_OUTPUTS, "mono", 0.70); SCV_CART_SLOT(config, m_cart, scv_cart, nullptr); m_cart->set_address_space(m_maincpu, AS_PROGRAM); @@ -587,6 +601,9 @@ ROM_START(scv) ROM_REGION(0x400, "charrom", 0) ROM_LOAD("epochtv.chr.s02", 0, 0x400, BAD_DUMP CRC(db521533) SHA1(40b4e44838c35191f115437a14f200f052e71509)) + + ROM_REGION(0x400, "upd1771c", 0) + ROM_LOAD16_WORD("upd1771c-017.s03", 0, 0x400, CRC(975bd68d) SHA1(e777217c622331677ac1d6520a741d48ad9133c0)) ROM_END @@ -596,6 +613,9 @@ ROM_START(scv_pal) ROM_REGION(0x400, "charrom", 0) ROM_LOAD("epochtv.chr.s02", 0, 0x400, BAD_DUMP CRC(db521533) SHA1(40b4e44838c35191f115437a14f200f052e71509)) + + ROM_REGION(0x400, "upd1771c", 0) + ROM_LOAD16_WORD("upd1771c-017.s03", 0, 0x400, CRC(975bd68d) SHA1(e777217c622331677ac1d6520a741d48ad9133c0)) ROM_END } // anonymous namespace |