1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /**********************************************************************
4 
5     DALLAS DS2404
6 
7     RTC + BACKUP RAM
8 
9 **********************************************************************/
10 
11 #ifndef MAME_MACHINE_DS2404_H
12 #define MAME_MACHINE_DS2404_H
13 
14 #pragma once
15 
16 class ds2404_device : public device_t, public device_nvram_interface
17 {
18 public:
19 	// construction/destruction
20 	ds2404_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
21 
22 	// inline configuration helpers
ref_year(uint32_t year)23 	void ref_year(uint32_t year) { m_ref_year = year; }
ref_month(uint8_t month)24 	void ref_month(uint8_t month) { m_ref_month = month; }
ref_day(uint8_t day)25 	void ref_day(uint8_t day) { m_ref_day = day; }
26 
27 	/* 1-wire interface reset  */
28 	void _1w_reset_w(uint8_t data);
29 
30 	/* 3-wire interface reset  */
31 	void _3w_reset_w(uint8_t data);
32 
33 	uint8_t data_r();
34 	void data_w(uint8_t data);
35 	void clk_w(uint8_t data);
36 
37 protected:
38 	// device-level overrides
39 	virtual void device_start() override;
device_reset()40 	virtual void device_reset() override { }
device_post_load()41 	virtual void device_post_load() override { }
device_clock_changed()42 	virtual void device_clock_changed() override { }
43 
44 	// device_nvram_interface overrides
45 	virtual void nvram_default() override;
46 	virtual void nvram_read(emu_file &file) override;
47 	virtual void nvram_write(emu_file &file) override;
48 
49 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
50 
51 private:
52 	void rom_cmd(uint8_t cmd);
53 	void cmd(uint8_t cmd);
54 
55 	uint8_t readmem();
56 	void writemem(uint8_t value);
57 
58 	enum STATE
59 	{
60 		STATE_IDLE = 1,              /* waiting for ROM command, in 1-wire mode */
61 		STATE_COMMAND,               /* waiting for memory command */
62 		STATE_ADDRESS1,              /* waiting for address bits 0-7 */
63 		STATE_ADDRESS2,              /* waiting for address bits 8-15 */
64 		STATE_OFFSET,                /* waiting for ending offset */
65 		STATE_INIT_COMMAND,
66 		STATE_READ_MEMORY,           /* Read Memory command active */
67 		STATE_WRITE_SCRATCHPAD,      /* Write Scratchpad command active */
68 		STATE_READ_SCRATCHPAD,       /* Read Scratchpad command active */
69 		STATE_COPY_SCRATCHPAD        /* Copy Scratchpad command active */
70 	};
71 
72 	emu_timer *m_tick_timer;
73 
74 	// configuration state
75 	uint32_t  m_ref_year;
76 	uint8_t   m_ref_month;
77 	uint8_t   m_ref_day;
78 
79 	uint16_t m_address;
80 	uint16_t m_offset;
81 	uint16_t m_end_offset;
82 	uint8_t m_a1;
83 	uint8_t m_a2;
84 	uint8_t m_sram[512];  /* 4096 bits */
85 	uint8_t m_ram[32];    /* scratchpad ram, 256 bits */
86 	uint8_t m_rtc[5];     /* 40-bit RTC counter */
87 	STATE m_state[8];
88 	int m_state_ptr;
89 };
90 
91 DECLARE_DEVICE_TYPE(DS2404, ds2404_device)
92 
93 #endif // MAME_MACHINE_DS2404_H
94