diff options
author | 2016-07-07 02:02:40 -0400 | |
---|---|---|
committer | 2016-07-07 02:02:40 -0400 | |
commit | 1940a7be883df8b0132f44eedda7514a61828c33 (patch) | |
tree | 92ad988077e0cb33111b91724cd3bf7bedcffa16 /src | |
parent | 33c89ccdfb1a5dd9d32af7aa34334bb1026638c9 (diff) |
Correct JRC6355E implementation to agree with NJU6355 datasheet
RTC writes and reads in feversoc both fully work now.
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/machine/rtc4543.cpp | 96 | ||||
-rw-r--r-- | src/devices/machine/rtc4543.h | 5 | ||||
-rw-r--r-- | src/mame/drivers/feversoc.cpp | 1 |
3 files changed, 86 insertions, 16 deletions
diff --git a/src/devices/machine/rtc4543.cpp b/src/devices/machine/rtc4543.cpp index 1351651550d..6079a663360 100644 --- a/src/devices/machine/rtc4543.cpp +++ b/src/devices/machine/rtc4543.cpp @@ -8,6 +8,10 @@ JRC 6355E / NJU6355E is basically similar, but order of registers is reversed and readouts happen on falling CLK edge. + The clock's seven registers are read out as 52 consecutive bits of + data, with the middle register being only 4 bits wide. The bits + are numbered 0-27 and 32-55 here for implementation convenience. + **********************************************************************/ #include "rtc4543.h" @@ -122,6 +126,7 @@ void rtc4543_device::rtc_clock_updated(int year, int month, int day, int day_of_ m_regs[6] = convert_to_bcd(year % 100); // year (BCD, 0-99) } + //------------------------------------------------- // ce_w - chip enable write //------------------------------------------------- @@ -131,12 +136,12 @@ WRITE_LINE_MEMBER( rtc4543_device::ce_w ) if (!state && m_ce) // complete transfer { if (VERBOSE) logerror("CE falling edge\n", state); + ce_falling(); } else if (state && !m_ce) // start new data transfer { if (VERBOSE) logerror("CE rising edge\n", state); - - m_curbit = 0; // force immediate reload of output data + ce_rising(); } m_ce = state; @@ -145,6 +150,26 @@ WRITE_LINE_MEMBER( rtc4543_device::ce_w ) m_clock_timer->enable(!m_ce || !m_wr); } + +//------------------------------------------------- +// ce_rising - CE rising edge trigger +//------------------------------------------------- + +void rtc4543_device::ce_rising() +{ + m_curbit = 0; // force immediate reload of output data +} + + +//------------------------------------------------- +// ce_falling - CE falling edge trigger +//------------------------------------------------- + +void rtc4543_device::ce_falling() +{ +} + + //------------------------------------------------- // wr_w - data direction line write //------------------------------------------------- @@ -157,6 +182,7 @@ WRITE_LINE_MEMBER( rtc4543_device::wr_w ) m_wr = state; } + //------------------------------------------------- // clk_w - serial clock write //------------------------------------------------- @@ -199,6 +225,10 @@ void rtc4543_device::clk_rising() store_bit(m_curbit / 8); advance_bit(); + + // update only occurs when a write goes all the way through + if (m_wr && m_curbit == 56) + update_effective(); } @@ -291,17 +321,25 @@ void rtc4543_device::advance_bit() // skip 4 bits, Brother Maynard m_curbit += 4; } +} - // update only occurs when a write goes all the way through - if (m_wr && m_curbit == 56) - set_time(false, - bcd_to_integer(m_regs[6]), // year - bcd_to_integer(m_regs[5]), // month - bcd_to_integer(m_regs[4]), // day - (m_regs[3] % 7) + 1, // day of week - bcd_to_integer(m_regs[2]), // hour - bcd_to_integer(m_regs[1]), // minute - bcd_to_integer(m_regs[0])); // second + +//------------------------------------------------- +// update_effective - update the RTC +//------------------------------------------------- + +void rtc4543_device::update_effective() +{ + if (VERBOSE) + logerror("RTC updated: %02x.%02x.%02x (%01x) %02x:%02x:%02x\n", m_regs[6], m_regs[5], m_regs[4], m_regs[3], m_regs[2], m_regs[1], m_regs[0]); + set_time(false, + bcd_to_integer(m_regs[6]), // year + bcd_to_integer(m_regs[5]), // month + bcd_to_integer(m_regs[4]), // day + (m_regs[3] % 7) + 1, // day of week + bcd_to_integer(m_regs[2]), // hour + bcd_to_integer(m_regs[1]), // minute + bcd_to_integer(m_regs[0])); // second } @@ -324,6 +362,34 @@ jrc6355e_device::jrc6355e_device(const machine_config &mconfig, const char *tag, //------------------------------------------------- +// ce_rising - CE rising edge trigger +//------------------------------------------------- + +void jrc6355e_device::ce_rising() +{ + m_curbit = 0; // force immediate reload of output data + load_bit(6); +} + + + +//------------------------------------------------- +// ce_falling - CE falling edge trigger +//------------------------------------------------- + +void jrc6355e_device::ce_falling() +{ + // update occurs on falling edge of CE after minutes are written + if (m_wr && m_curbit >= 48) + { + // seconds are zeroed + m_regs[0] = 0; + update_effective(); + } +} + + +//------------------------------------------------- // clk_rising - CLK rising edge trigger //------------------------------------------------- @@ -334,8 +400,6 @@ void jrc6355e_device::clk_rising() if (m_wr) store_bit(6 - (m_curbit / 8)); - - advance_bit(); } @@ -348,6 +412,8 @@ void jrc6355e_device::clk_falling() if (m_curbit == 56) return; - if (!m_wr) + advance_bit(); + + if (!m_wr && m_curbit != 56) load_bit(6 - (m_curbit / 8)); } diff --git a/src/devices/machine/rtc4543.h b/src/devices/machine/rtc4543.h index 30a6e2d1ed7..966e15ab0b9 100644 --- a/src/devices/machine/rtc4543.h +++ b/src/devices/machine/rtc4543.h @@ -66,11 +66,14 @@ protected: virtual bool rtc_feature_leap_year() override { return true; } // helpers + virtual void ce_rising(); + virtual void ce_falling(); virtual void clk_rising(); virtual void clk_falling(); void load_bit(int reg); void store_bit(int reg); void advance_bit(); + void update_effective(); devcb_write_line data_cb; @@ -97,6 +100,8 @@ public: protected: // rtc4543 overrides + virtual void ce_rising() override; + virtual void ce_falling() override; virtual void clk_rising() override; virtual void clk_falling() override; }; diff --git a/src/mame/drivers/feversoc.cpp b/src/mame/drivers/feversoc.cpp index d7e214ce64b..bc0c81f1b6d 100644 --- a/src/mame/drivers/feversoc.cpp +++ b/src/mame/drivers/feversoc.cpp @@ -9,7 +9,6 @@ A down-grade of the Seibu SPI Hardware with SH-2 as main cpu. driver by Angelo Salese & Nicola Salmoria TODO: -- Make RTC writes actually go through (SH2 interrupt/timing issue?) - Determine what buttons 5-7 actually do - Find out where the NVRAM maps to - Layout including lamps |