From 2f5f50c60eb8ba86ddd2554c1f66af7ce354dd20 Mon Sep 17 00:00:00 2001 From: Wilbert Pol Date: Mon, 3 Oct 2016 21:45:04 +0200 Subject: [PATCH] gameboy: fixed serial regresssion (nw) --- src/mame/includes/gb.h | 7 ++++++- src/mame/machine/gb.cpp | 10 +++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/mame/includes/gb.h b/src/mame/includes/gb.h index 9b8c3e89656..bb5e0e66316 100644 --- a/src/mame/includes/gb.h +++ b/src/mame/includes/gb.h @@ -31,7 +31,6 @@ public: m_ram(*this, RAM_TAG), m_ppu(*this, "ppu") { } - //gb_state driver_data; UINT8 m_gb_io[0x10]; /* Timer related */ @@ -91,6 +90,12 @@ public: optional_device m_cartslot; protected: + enum { + SIO_ENABLED = 0x80, + SIO_FAST_CLOCK = 0x02, + SIO_INTERNAL_CLOCK = 0x01 + }; + required_device m_maincpu; required_device m_apu; required_memory_region m_region_maincpu; diff --git a/src/mame/machine/gb.cpp b/src/mame/machine/gb.cpp index cf1c9bc0a2c..639e54c9231 100644 --- a/src/mame/machine/gb.cpp +++ b/src/mame/machine/gb.cpp @@ -517,7 +517,7 @@ logerror("IF read, serial clock is %04x\n", m_internal_serial_clock); /* Called when 512 internal cycles are passed */ void gb_state::gb_serial_timer_tick() { - if (SIOCONT & 0x80) + if (SIOCONT & SIO_ENABLED) { if (m_sio_count & 1) { @@ -531,7 +531,7 @@ void gb_state::gb_serial_timer_tick() /* If all bits done, stop timer and trigger interrupt */ if (m_sio_count == 0) { - SIOCONT &= 0x7F; + SIOCONT &= ~SIO_ENABLED; m_maincpu->set_input_line(lr35902_cpu_device::SIO_INT, ASSERT_LINE); // Make sure the state is updated during the current timeslice in case it is read. m_maincpu->execute_set_input(lr35902_cpu_device::SIO_INT, ASSERT_LINE); @@ -601,7 +601,7 @@ WRITE8_MEMBER(gb_state::gb_timer_callback) } } - if ((m_internal_serial_clock ^ old_internal_serial_clock) & m_internal_serial_frequency) + if (((m_internal_serial_clock ^ old_internal_serial_clock) & m_internal_serial_frequency) && (SIOCONT & SIO_INTERNAL_CLOCK)) { gb_serial_timer_tick(); } @@ -615,8 +615,8 @@ WRITE8_MEMBER(gb_state::gbc_io_w) // On CGB the internal serial transfer clock is selectable if (offset == 0x02) { - m_internal_serial_frequency = ((data & 0x02) ? 16 : 512) / 2; - SIOCONT = (SIOCONT & ~0x02) | (data & 0x02); + m_internal_serial_frequency = ((data & SIO_FAST_CLOCK) ? 16 : 512) / 2; + SIOCONT = (SIOCONT & ~SIO_FAST_CLOCK) | (data & SIO_FAST_CLOCK); } }