summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/sm510/sm590.h
blob: 7e4bb229e6699537ad2d7788aec447403bbb3db1 (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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
// license:BSD-3-Clause
// copyright-holders:hap, Jonathan Gevaryahu
/*

  Sharp SM590 MCU family cores

*/

#ifndef MAME_CPU_SM510_SM590_H
#define MAME_CPU_SM510_SM590_H

#include "sm510base.h"


// pinout reference

/*

16-pin DIP SM590/591/595:
                ____    ____
              _|*   \__/    |_
    R0.0 <>  |_|1         16|_|  -- VDD(5v)
              _|            |_
    R0.1 <>  |_|2         15|_|  <> R2.2
              _|            |_
    R0.2 <>  |_|3         14|_|  <> R2.1
              _|            |_
    R0.3 <>  |_|4         13|_|  <> R2.0
              _|            |_
R3.3/CL2 =>  |_|5         12|_|  <> R1.3
              _|            |_
     CL1 ==  |_|6         11|_|  <> R1.2
              _|            |_
     ACL ->  |_|7         10|_|  <> R1.1
              _|            |_
     GND --  |_|8          9|_|  <> R1.0
               |____________|


18-pin DIP SM590/591/595:
                ____    ____
              _|*   \__/    |_
    R0.0 <>  |_|1         18|_|  -- VDD(5v)
              _|            |_
    R0.1 <>  |_|2         17|_|  <> R2.2
              _|            |_
    R2.3 <>  |_|3         16|_|  <> R3.0
              _|            |_
    R0.2 <>  |_|4         15|_|  <> R2.1
              _|            |_
    R0.3 <>  |_|5         14|_|  <> R2.0
              _|            |_
R3.3/CL2 =>  |_|6         13|_|  <> R1.3
              _|            |_
     CL1 ==  |_|7         12|_|  <> R1.2
              _|            |_
     ACL ->  |_|8         11|_|  <> R1.1
              _|            |_
     GND --  |_|9         10|_|  <> R1.0
               |____________|


20-pin DIP SM590/591/595:
                ____    ____
              _|*   \__/    |_
    R0.0 <>  |_|1         20|_|  -- VDD(5v)
              _|            |_
    R0.1 <>  |_|2         19|_|  <> R2.2
              _|            |_
    R2.3 <>  |_|3         18|_|  <> R3.0
              _|            |_
    R0.2 <>  |_|4         17|_|  <> R2.1
              _|            |_
    R0.3 <>  |_|5         16|_|  <> R2.0
              _|            |_
R3.3/CL2 =>  |_|6         15|_|  <> R1.3
              _|            |_
     CL1 ==  |_|7         14|_|  <> R1.2
              _|            |_
    R3.2 <>  |_|8         13|_|  <> R3.1
              _|            |_
     ACL ->  |_|9         12|_|  <> R1.1
              _|            |_
     GND --  |_|10        11|_|  <> R1.0
               |____________|

*/

class sm590_device : public sm510_base_device
{
public:
	sm590_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);

	// four 4-bit R I/O ports
	using sm510_base_device::write_r;
	template <std::size_t Bit> auto write_r() { return m_write_rx[Bit].bind(); }
	template <std::size_t Bit> auto read_r() { return m_read_rx[Bit].bind(); }

protected:
	sm590_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int stack_levels, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data);

	void program_512x8(address_map &map);
	void program_768x8(address_map &map);
	void program_1kx8(address_map &map);
	void data_32x4(address_map &map);
	void data_56x4(address_map &map);

	virtual void device_start() override;
	virtual void device_reset() override;

	virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
	virtual u64 execute_clocks_to_cycles(u64 clocks) const noexcept override { return (clocks + 4 - 1) / 4; } // 4 cycles per machine cycle
	virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept override { return (cycles * 4); } // "

	virtual void init_divider() override { } // no divider timer
	virtual void init_lcd_driver() override { } // no lcd driver
	virtual void execute_one() override;
	virtual bool op_argument() override;

	virtual void reset_vector() override { do_branch(0, 0, 0); }
	virtual void wakeup_vector() override { do_branch(0, 1, 0); }

	// R ports
	devcb_write8::array<4> m_write_rx;
	devcb_read8::array<4> m_read_rx;
	u8 m_rports[4];

	// opcode handlers
	virtual void do_branch(u8 pu, u8 pm, u8 pl) override;
	void port_w(offs_t offset, u8 data);

	virtual void op_tl() override;
	virtual void op_tls();

	virtual void op_lblx();
	virtual void op_lbmx();
	virtual void op_str();
	virtual void op_lda() override;
	virtual void op_exc() override;
	virtual void op_exax();
	virtual void op_blta();

	virtual void op_adx() override;
	virtual void op_ads();
	virtual void op_adc();
	virtual void op_inbm();
	virtual void op_debm();

	virtual void op_tax();
	virtual void op_tba();
	virtual void op_tc() override;

	virtual void op_atr() override;
	virtual void op_mtr();
	virtual void op_rta();
};

class sm591_device : public sm590_device
{
public:
	sm591_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};

class sm595_device : public sm590_device
{
public:
	sm595_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
};


DECLARE_DEVICE_TYPE(SM590, sm590_device)
DECLARE_DEVICE_TYPE(SM591, sm591_device)
DECLARE_DEVICE_TYPE(SM595, sm595_device)

#endif // MAME_CPU_SM510_SM590_H