summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/epoch/scv.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/epoch/scv.cpp')
-rw-r--r--src/mame/epoch/scv.cpp36
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