diff options
Diffstat (limited to 'trunk/src/emu/machine/mccs1850.h')
-rw-r--r-- | trunk/src/emu/machine/mccs1850.h | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/trunk/src/emu/machine/mccs1850.h b/trunk/src/emu/machine/mccs1850.h new file mode 100644 index 00000000000..8f0fa179f20 --- /dev/null +++ b/trunk/src/emu/machine/mccs1850.h @@ -0,0 +1,112 @@ +/********************************************************************** + + Motorola MCCS1850 Serial Real-Time Clock emulation + + Copyright MESS Team. + Visit http://mamedev.org for licensing and usage restrictions. + +********************************************************************** + _____ _____ + Vbat 1 |* \_/ | 16 Vdd + _POR 2 | | 15 TEST + _INT 3 | | 14 XTAL1 + SCK 4 | MCCS1850 | 13 XTAL2 + SDI 5 | | 12 _PWRSW + SDO 6 | | 11 NUC + CE 7 | | 10 _PSE + Vss 8 |_____________| 9 PSE + +**********************************************************************/ + +#pragma once + +#ifndef __MCCS1850__ +#define __MCCS1850__ + +#include "emu.h" + + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_MCCS1850_ADD(_tag, _clock, _int_cb, _pse_cb, _nuc_cb) \ + MCFG_DEVICE_ADD(_tag, MCCS1850, _clock) \ + downcast<mccs1850_device *>(device)->set_cb(_int_cb, _pse_cb, _nuc_cb); + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> mccs1850_device + +class mccs1850_device : public device_t, + public device_rtc_interface, + public device_nvram_interface +{ +public: + // construction/destruction + mccs1850_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + void set_cb(line_cb_t int_cb, line_cb_t pse_cb, line_cb_t nuc_cb); + + DECLARE_WRITE_LINE_MEMBER( ce_w ); + DECLARE_WRITE_LINE_MEMBER( sck_w ); + DECLARE_READ_LINE_MEMBER( sdo_r ); + DECLARE_WRITE_LINE_MEMBER( sdi_w ); + DECLARE_WRITE_LINE_MEMBER( pwrsw_w ); + DECLARE_WRITE_LINE_MEMBER( por_w ); + DECLARE_WRITE_LINE_MEMBER( test_w ); + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + + // device_nvram_interface overrides + virtual void nvram_default(); + virtual void nvram_read(emu_file &file); + virtual void nvram_write(emu_file &file); + +private: + inline void check_interrupt(); + inline void set_pse_line(bool state); + inline UINT8 read_register(offs_t offset); + inline void write_register(offs_t offset, UINT8 data); + inline void advance_seconds(); + + static const device_timer_id TIMER_CLOCK = 0; + + line_cb_t int_cb, pse_cb, nuc_cb; + + UINT8 m_ram[0x80]; // RAM + + // power supply + int m_pse; // power supply enable + + // counter + UINT32 m_counter; // seconds counter + + // serial interface + int m_ce; // chip enable + int m_sck; // serial clock + int m_sdo; // serial data out + int m_sdi; // serial data in + int m_state; // serial interface state + UINT8 m_address; // address counter + int m_bits; // bit counter + UINT8 m_shift; // shift register + + // timers + emu_timer *m_clock_timer; +}; + + +// device type definition +extern const device_type MCCS1850; + + + +#endif |