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
|
// license:BSD-3-Clause
// copyright-holders:hap
/*
Sharp SM500 MCU family cores
*/
#ifndef MAME_CPU_SM510_SM500_H
#define MAME_CPU_SM510_SM500_H
#pragma once
#include "sm510base.h"
// pinout reference
/*
O33 O43 O12 O22 O32 GND O42 O11 O21 O31 O41 OS1
36 35 34 33 32 31 30 29 28 27 26 25
________________________________________________
| |
O23 37 | | 24 OS2
| |
O13 38 | | 23 OS3
| |
O44 39 | | 22 OS4
| |
O34 40 | | 21 H1
| |
O24 41 | | 20 H2
| |
O14 42 | | 19 Vm
| SM500 |
O45 43 | | 18 OSCin
| |
O35 44 | | 17 OSCout
| |
O25 45 | | 16 Vdd
| |
O15 46 | | 15 K4
| |
O46 47 | | 14 K3
| |
O36 48 | * | 13 K2
|________________________________________________/
1 2 3 4 5 6 7 8 9 10 11 12
O26 O16 R4 R3 R2 R1 GND _T β α ACL K1
*/
class sm500_device : public sm510_base_device
{
public:
sm500_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 32768);
protected:
sm500_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int stack_levels, int o_pins, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data);
void program_1_2k(address_map &map) ATTR_COLD;
void data_4x10x4(address_map &map) ATTR_COLD;
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
virtual void execute_one() override;
virtual bool op_argument() override;
virtual void clock_melody() override;
virtual void reset_vector() override { do_branch(0, 0xf, 0); }
virtual void wakeup_vector() override { m_cb = 0; do_branch(0, 0, 0); }
// lcd driver
virtual void lcd_update() override;
int m_o_pins; // number of 4-bit O pins
u8 m_ox[9]; // W' latch, max 9
u8 m_o[9]; // W latch
u8 m_mx;
u8 m_cb;
u8 m_s;
bool m_rsub;
void shift_w();
u8 get_digit();
// opcode handlers
void set_su(u8 su) { m_stack[0] = (m_stack[0] & ~0x3c0) | (su << 6 & 0x3c0); }
u8 get_su() { return m_stack[0] >> 6 & 0xf; }
virtual int get_trs_field() { return 0; }
virtual void op_lb() override;
virtual void op_incb() override;
virtual void op_sbm() override;
virtual void op_rbm();
virtual void op_comcb();
virtual void op_rtn0() override;
virtual void op_ssr();
virtual void op_tr();
virtual void op_trs();
virtual void op_ptw() override;
virtual void op_tw();
virtual void op_pdtw();
virtual void op_dtw();
virtual void op_wr() override;
virtual void op_ws() override;
virtual void op_ats();
virtual void op_exksa();
virtual void op_exkfa();
virtual void op_idiv() override;
virtual void op_rmf();
virtual void op_smf();
virtual void op_comcn();
};
DECLARE_DEVICE_TYPE(SM500, sm500_device)
#endif // MAME_CPU_SM510_SM500_H
|