blob: 1cdfa42df38fce8f984c321bd31aaf30b0eb089a (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
/*********************************************************************
er59256.h
Microchip ER59256 serial eeprom.
*********************************************************************/
#ifndef _ER59256_H_
#define _ER59256_H_
#define EEROM_WORDS 0x10
/***************************************************************************
MACROS
***************************************************************************/
class er59256_device : public device_t
{
public:
er59256_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
~er59256_device() {}
void set_iobits(UINT8 newbits);
UINT8 get_iobits();
void preload_rom(const UINT16 *rom_data, int count);
UINT8 data_loaded();
protected:
// device-level overrides
virtual void device_config_complete();
virtual void device_start();
virtual void device_stop();
private:
// internal state
/* The actual memory */
UINT16 m_eerom[EEROM_WORDS];
/* Bits as they appear on the io pins, current state */
UINT8 m_io_bits;
/* Bits as they appear on the io pins, previous state */
UINT8 m_old_io_bits;
/* the 16 bit shift in/out reg */
UINT16 m_in_shifter;
UINT32 m_out_shifter;
/* Count of bits received since last CS low->high */
UINT8 m_bitcount;
/* Command & addresss */
UINT8 m_command;
/* Write enable and write in progress flags */
UINT8 m_flags;
void decode_command();
};
extern const device_type ER59256;
#define MCFG_ER59256_ADD(_tag) \
MCFG_DEVICE_ADD((_tag), ER59256, 0)
/***************************************************************************
CONSTANTS
***************************************************************************/
#define CK_SHIFT 0x00
#define DI_SHIFT 0x01
#define DO_SHIFT 0x02
#define CS_SHIFT 0x03
#define CK_MASK (1<<CK_SHIFT)
#define DI_MASK (1<<DI_SHIFT)
#define DO_MASK (1<<DO_SHIFT)
#define CS_MASK (1<<CS_SHIFT)
#define ALL_MASK (CK_MASK | DI_MASK | DO_MASK | CS_MASK)
#define IN_MASK (CK_MASK | DI_MASK | CS_MASK)
#define GET_CK() ((m_io_bits & CK_MASK) >> CK_SHIFT)
#define GET_DI() ((m_io_bits & DI_MASK) >> DI_SHIFT)
#define GET_DO() ((m_io_bits & DO_MASK) >> DO_SHIFT)
#define GET_CS() ((m_io_bits & CS_MASK) >> CS_SHIFT)
#define SET_CK(data) m_io_bits=((m_io_bits & ~CK_MASK) | ((data & 0x01) << CK_SHIFT))
#define SET_DI(data) m_io_bits=((m_io_bits & ~DI_MASK) | ((data & 0x01) << DI_SHIFT))
#define SET_DO(data) m_io_bits=((m_io_bits & ~DO_MASK) | ((data & 0x01) << DO_SHIFT))
#define SET_CS(data) m_io_bits=((m_io_bits & ~CS_MASK) | ((data & 0x01) << CS_SHIFT))
#define CK_RISE() ((m_io_bits & CK_MASK) & ~(m_old_io_bits & CK_MASK))
#define CS_RISE() ((m_io_bits & CS_MASK) & ~(m_old_io_bits & CS_MASK))
#define CS_VALID() ((m_io_bits & CS_MASK) & (m_old_io_bits & CS_MASK))
#define CK_FALL() (~(m_io_bits & CK_MASK) & (m_old_io_bits & CK_MASK))
#define CS_FALL() (~(m_io_bits & CS_MASK) & (m_old_io_bits & CS_MASK))
#define SHIFT_IN() m_in_shifter=(m_in_shifter<<1) | GET_DI()
#define SHIFT_OUT() SET_DO((m_out_shifter & 0x10000)>>16); m_out_shifter=(m_out_shifter<<1)
#define CMD_READ 0x80
#define CMD_WRITE 0x40
#define CMD_ERASE 0xC0
#define CMD_EWEN 0x30
#define CMD_EWDS 0x00
#define CMD_ERAL 0x20
#define CMD_INVALID 0xF0
#define CMD_MASK 0xF0
#define ADDR_MASK 0x0F
// CMD_BITLEN is 1 start bit plus 4 command bits plus 4 address bits
#define CMD_BITLEN 8
#define DATA_BITLEN 16
#define WRITE_BITLEN CMD_BITLEN+DATA_BITLEN
#define FLAG_WRITE_EN 0x01
#define FLAG_START_BIT 0x02
#define FLAG_DATA_LOADED 0x04
#define WRITE_ENABLED() ((m_flags & FLAG_WRITE_EN) ? 1 : 0)
#define STARTED() ((m_flags & FLAG_START_BIT) ? 1 : 0)
#endif
|