summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/pcf8583.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/pcf8583.h')
-rw-r--r--src/devices/machine/pcf8583.h77
1 files changed, 41 insertions, 36 deletions
diff --git a/src/devices/machine/pcf8583.h b/src/devices/machine/pcf8583.h
index f8d98295cb1..2086eeef6bf 100644
--- a/src/devices/machine/pcf8583.h
+++ b/src/devices/machine/pcf8583.h
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Tim Schuerewegen, Ryan Holtz
+// copyright-holders:Nigel Barnes
/*********************************************************************
Philips PCF8583 Clock and Calendar with 240 x 8-bit RAM
@@ -62,37 +62,48 @@
#include "dirtc.h"
-class pcf8583_device : public device_t,
- public device_rtc_interface,
- public device_nvram_interface
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> pcf8583_device
+
+class pcf8583_device :
+ public device_t,
+ public device_rtc_interface,
+ public device_nvram_interface
{
public:
- pcf8583_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 32'768);
+ pcf8583_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- auto irq() { return m_irq_callback.bind(); }
+ auto irq() { return m_irq_cb.bind(); }
- void set_a0(uint8_t a0);
+ void set_a0(int a0) { m_slave_address = (m_slave_address & 0xfd) | (a0 << 1); }
- DECLARE_WRITE_LINE_MEMBER(scl_w);
- DECLARE_WRITE_LINE_MEMBER(sda_w);
- DECLARE_READ_LINE_MEMBER(sda_r);
+ void a0_w(int state);
+ void scl_w(int state);
+ void sda_w(int state);
+ int sda_r();
protected:
// device-level overrides
virtual void device_start() override;
- virtual void device_reset() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
// device_rtc_interface overrides
virtual bool rtc_feature_y2k() const override { return true; }
+ virtual bool rtc_feature_leap_year() const override { return true; }
virtual void rtc_clock_updated(int year, int month, int day, int day_of_week, int hour, int minute, int second) override;
// device_nvram_interface overrides
virtual void nvram_default() override;
- virtual void nvram_read(emu_file &file) override;
- virtual void nvram_write(emu_file &file) override;
+ virtual bool nvram_read(util::read_stream &file) override;
+ virtual bool nvram_write(util::write_stream &file) override;
+
+ TIMER_CALLBACK_MEMBER(clock_tick);
private:
+ static constexpr uint8_t PCF8583_SLAVE_ADDRESS = 0xa0;
+
enum
{
REG_CONTROL = 0x00,
@@ -115,11 +126,9 @@ private:
enum
{
- CONTROL_STOP_BIT = 0x80
+ CONTROL_STOP_BIT = 7
};
- static const device_timer_id TIMER_TICK = 0;
-
// get/set date
uint8_t get_date_year() { return (m_data[REG_YEAR_DATE] >> 6) & 3; }
void set_date_year(uint8_t year) { m_data[REG_YEAR_DATE] = (m_data[REG_YEAR_DATE] & 0x3f) | ((year % 4) << 6); }
@@ -136,31 +145,27 @@ private:
uint8_t get_time_second() { return bcd_to_integer(m_data[REG_SECONDS]); }
void set_time_second(uint8_t second){ m_data[REG_SECONDS] = convert_to_bcd(second); }
- void write_register(uint8_t offset, uint8_t data);
void advance_hundredths();
- void clear_rx_buffer();
- devcb_write_line m_irq_callback;
+ optional_memory_region m_region;
+
+ devcb_write_line m_irq_cb;
// internal state
- uint8_t m_data[256];
- int m_scl;
- int m_sda;
- int m_inp;
- bool m_transfer_active;
- int m_bit_index;
- bool m_irq;
- uint8_t m_data_recv_index;
- uint8_t m_data_recv;
- uint8_t m_mode;
- uint8_t m_pos;
- uint8_t m_write_address;
- uint8_t m_read_address;
+ uint8_t m_data[256];
+ int m_slave_address;
+ int m_scl;
+ int m_sdaw;
+ int m_sdar;
+ int m_state;
+ int m_bits;
+ int m_shift;
+ int m_devsel;
+ int m_register;
+ bool m_irq;
emu_timer * m_timer;
- enum { RTC_MODE_NONE, RTC_MODE_SEND, RTC_MODE_RECV };
- static constexpr uint8_t WRITE_ADDRESS_BASE = 0xa0;
- static constexpr uint8_t READ_ADDRESS_BASE = 0xa1;
+ enum { STATE_IDLE, STATE_DEVSEL, STATE_REGISTER, STATE_DATAIN, STATE_DATAOUT, STATE_READSELACK };
};
// device type definition