summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/machine/hd64610.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/machine/hd64610.c')
-rw-r--r--src/mess/machine/hd64610.c366
1 files changed, 0 insertions, 366 deletions
diff --git a/src/mess/machine/hd64610.c b/src/mess/machine/hd64610.c
deleted file mode 100644
index c56775e486f..00000000000
--- a/src/mess/machine/hd64610.c
+++ /dev/null
@@ -1,366 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Sandro Ronco
-/**********************************************************************
-
- Hitachi HD64610 Real Time Clock
-
-*********************************************************************/
-
-/*
-
- TODO:
- - leap year
- - test mode
-
-*/
-
-#include "hd64610.h"
-#include "coreutil.h"
-
-
-// device type definition
-const device_type HD64610 = &device_creator<hd64610_device>;
-
-
-//**************************************************************************
-// MACROS / CONSTANTS
-//**************************************************************************
-
-#define LOG 1
-
-// internal registers
-enum
-{
- REG_64HZ = 0,
- REG_SECOND,
- REG_MINUTE,
- REG_HOUR,
- REG_DAY_OF_THE_WEEK,
- REG_DAY,
- REG_MONTH,
- REG_YEAR,
- REG_64HZ_ALARM,
- REG_SECOND_ALARM,
- REG_MINUTE_ALARM,
- REG_HOUR_ALARM,
- REG_DAY_OF_THE_WEEK_ALARM,
- REG_DAY_ALARM,
- REG_CRA,
- REG_CRB,
-};
-
-
-// Control Register A
-#define CRA_CF 0x80
-#define CRA_CIE 0x10
-#define CRA_AIE 0x08
-#define CRA_AF 0x01
-
-// Control Register B
-#define CRB_TEST 0x08
-#define CRB_ADJ 0x04
-#define CRB_RESET 0x02
-#define CRB_S 0x01
-
-// alarm
-#define ALARM_ENB 0x80
-
-// register write mask
-static const int REG_WRITE_MASK[0x10] =
-{
- 0x00, 0x7f, 0x7f, 0x3f, 0x07, 0x3f, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x83, 0xbf, 0x18, 0xff
-};
-
-//**************************************************************************
-// INLINE HELPERS
-//**************************************************************************
-
-//-------------------------------------------------
-// set_irq_line -
-//-------------------------------------------------
-
-inline void hd64610_device::set_irq_line()
-{
- int irq_out = (((m_regs[REG_CRA] & CRA_CF) && (m_regs[REG_CRA] & CRA_CIE)) ||
- ((m_regs[REG_CRA] & CRA_AF) && (m_regs[REG_CRA] & CRA_AIE))) ? 0 : 1;
-
- if (m_irq_out != irq_out)
- {
- if (LOG) logerror("HD64610 '%s' IRQ %u\n", tag(), irq_out);
-
- m_out_irq_cb(irq_out);
- m_irq_out = irq_out;
- }
-}
-
-
-//-------------------------------------------------
-// read_counter -
-//-------------------------------------------------
-
-inline UINT8 hd64610_device::read_counter(int counter)
-{
- return bcd_2_dec(m_regs[counter]);
-}
-
-
-//-------------------------------------------------
-// write_counter -
-//-------------------------------------------------
-
-inline void hd64610_device::write_counter(int counter, UINT8 value)
-{
- m_regs[counter] = dec_2_bcd(value);
-}
-
-
-//-------------------------------------------------
-// check_alarm -
-//-------------------------------------------------
-
-inline void hd64610_device::check_alarm()
-{
- bool alarm_flag = true;
-
- // clear alarm flag
- m_regs[REG_CRA] &= ~CRA_AF;
-
- if (m_regs[REG_64HZ_ALARM] & ALARM_ENB || m_regs[REG_SECOND_ALARM] & ALARM_ENB || m_regs[REG_MINUTE_ALARM] & ALARM_ENB ||
- m_regs[REG_HOUR_ALARM] & ALARM_ENB || m_regs[REG_DAY_OF_THE_WEEK_ALARM] & ALARM_ENB || m_regs[REG_DAY_ALARM] & ALARM_ENB)
- {
- // at least one ENB is active
-
- for (int i = REG_64HZ; i <= REG_DAY; i++)
- {
- if ((m_regs[i] & REG_WRITE_MASK[i]) != (m_regs[i+8] & REG_WRITE_MASK[i]) && m_regs[i+8] & ALARM_ENB)
- alarm_flag = false;
- }
-
- m_regs[REG_CRA] |= (alarm_flag ? CRA_AF : 0);
- }
-}
-
-
-
-//**************************************************************************
-// LIVE DEVICE
-//**************************************************************************
-
-//-------------------------------------------------
-// hd64610_device - constructor
-//-------------------------------------------------
-
-hd64610_device::hd64610_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
- : device_t(mconfig, HD64610, "HD64610", tag, owner, clock, "hd64610", __FILE__),
- device_rtc_interface(mconfig, *this),
- device_nvram_interface(mconfig, *this),
- m_out_irq_cb(*this),
- m_out_1hz_cb(*this),
- m_hline_state(1),
- m_irq_out(1)
-{
-}
-
-//-------------------------------------------------
-// device_start - device-specific startup
-//-------------------------------------------------
-
-void hd64610_device::device_start()
-{
- // resolve callbacks
- m_out_irq_cb.resolve_safe();
- m_out_1hz_cb.resolve_safe();
-
- // allocate timers
- m_counter_timer = timer_alloc(TIMER_UPDATE_COUNTER);
- m_counter_timer->adjust(attotime::from_hz(clock() / 256), 0, attotime::from_hz(clock() / 256));
-
- // state saving
- save_item(NAME(m_regs));
- save_item(NAME(m_irq_out));
- save_item(NAME(m_hline_state));
-}
-
-
-//-------------------------------------------------
-// device_start - device-specific reset
-//-------------------------------------------------
-
-void hd64610_device::device_reset()
-{
- set_current_time(machine());
-}
-
-
-//-------------------------------------------------
-// device_timer - handler timer events
-//-------------------------------------------------
-
-void hd64610_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- switch (id)
- {
- case TIMER_UPDATE_COUNTER:
- if(m_hline_state || (m_regs[REG_CRB] & CRB_S))
- {
- m_regs[REG_64HZ]++;
-
- if (m_regs[REG_64HZ] & 0x80)
- {
- // update seconds
- advance_seconds();
-
- // set carry flag
- m_regs[REG_CRA] |= CRA_CF;
-
- m_regs[REG_64HZ] &= 0x7f;
- }
-
- // update 1Hz out
- m_out_1hz_cb(BIT(m_regs[REG_64HZ], 6));
-
- // update IRQ
- check_alarm();
- set_irq_line();
- }
- break;
- }
-}
-
-
-//-------------------------------------------------
-// rtc_clock_updated -
-//-------------------------------------------------
-
-void hd64610_device::rtc_clock_updated(int year, int month, int day, int day_of_week, int hour, int minute, int second)
-{
- write_counter(REG_SECOND, second);
- write_counter(REG_MINUTE, minute);
- write_counter(REG_HOUR, hour);
- write_counter(REG_DAY, day);
- write_counter(REG_MONTH, month);
- write_counter(REG_YEAR, year);
- m_regs[REG_DAY_OF_THE_WEEK] = day_of_week;
-
- check_alarm();
- set_irq_line();
-}
-
-
-//-------------------------------------------------
-// nvram_default - called to initialize NVRAM to
-// its default state
-//-------------------------------------------------
-
-void hd64610_device::nvram_default()
-{
- memset(m_regs, 0, 0x10);
-}
-
-
-//-------------------------------------------------
-// nvram_read - called to read NVRAM from the
-// .nv file
-//-------------------------------------------------
-
-void hd64610_device::nvram_read(emu_file &file)
-{
- file.read(m_regs, 0x10);
-}
-
-
-//-------------------------------------------------
-// nvram_write - called to write NVRAM to the
-// .nv file
-//-------------------------------------------------
-
-void hd64610_device::nvram_write(emu_file &file)
-{
- file.write(m_regs, 0x10);
-}
-
-
-//-------------------------------------------------
-// hardware start/stop
-//-------------------------------------------------
-
-WRITE_LINE_MEMBER( hd64610_device::h_w )
-{
- m_hline_state = state;
-}
-
-
-//-------------------------------------------------
-// read -
-//-------------------------------------------------
-
-READ8_MEMBER( hd64610_device::read )
-{
- UINT8 data = m_regs[offset & 0x0f];
-
- if (LOG) logerror("HD64610 '%s' Register %u Read %02x\n", tag(), offset, data);
-
- return data;
-}
-
-
-//-------------------------------------------------
-// write -
-//-------------------------------------------------
-
-WRITE8_MEMBER( hd64610_device::write )
-{
- switch (offset & 0x0f)
- {
- case REG_64HZ:
- // read only
- logerror("HD64610 '%s' Writing to read-only register 64Hz Counter\n", tag());
- break;
-
- case REG_CRA:
- m_regs[REG_CRA] = data & REG_WRITE_MASK[REG_CRA];
-
- if ((data & CRA_CF) == 0)
- {
- if (LOG) logerror("HD64610 '%s' clear carry flag\n", tag());
- m_regs[REG_CRA] &= 0x7f;
- }
- if ((data & CRA_AF) == 0)
- {
- if (LOG) logerror("HD64610 '%s' clear alarm flag\n", tag());
- m_regs[REG_CRA] &= 0xfe;
- }
-
- if (LOG) logerror("HD64610 '%s' set alarm IRQ %d\n", tag(), BIT(data, 3));
- if (LOG) logerror("HD64610 '%s' set carry IRQ %d\n", tag(), BIT(data, 4));
- break;
-
- case REG_CRB:
- m_regs[REG_CRB] = data & REG_WRITE_MASK[REG_CRB];
-
- if (data & CRB_ADJ)
- {
- if (LOG) logerror("HD64610 '%s' 30-sec adjustament\n", tag());
- adjust_seconds();
- m_regs[REG_64HZ] = 0;
-
- m_regs[REG_CRB] &= ~CRB_ADJ;
- }
-
- if (data & CRB_RESET)
- {
- if (LOG) logerror("HD64610 '%s' CRB reset\n", tag());
- m_regs[REG_64HZ] = 0;
-
- m_regs[REG_CRB] &= ~CRB_RESET;
- }
-
- if (LOG) logerror("HD64610 '%s' set timer %d\n", tag(), BIT(data, 0));
- break;
-
- default:
- m_regs[offset & 0x0f] = data & REG_WRITE_MASK[offset & 0x0f];
- if (LOG) logerror("HD64610 '%s' Register %u Write %02x\n", tag(), offset & 0x0f, data);
- break;
- }
-}