summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/pps41/mm76.h
blob: bbad09218b566322225333cc14061bc7feae2ede (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
// license:BSD-3-Clause
// copyright-holders:hap
/*

  Rockwell MM76 MCU

*/

#ifndef MAME_CPU_PPS41_MM76_H
#define MAME_CPU_PPS41_MM76_H

#pragma once

#include "pps41base.h"

// pinout reference

/*
            ____   ____                         ____   ____
      A  1 |*   \_/    | 42 BP           BP  1 |*   \_/    | 40 A
  EXCLK  2 |           | 41 DIO9         VC  2 |           | 39 DIO9
  CLKIN  3 |           | 40 DIO8      XTLIN  3 |           | 38 DIO8
     VC  4 |           | 39 N/C      XTLOUT  4 |           | 37 DIO7
    Vdd  5 |           | 38 DIO7        Vdd  5 |           | 36 DIO6
    Vss  6 |           | 37 DIO6        PI2  6 |           | 35 DIO5
   TEST  7 |           | 36 DIO5       TEST  7 |           | 34 DIO4
    PI2  8 |           | 35 DIO4        PI6  8 |           | 33 DIO3
    PI6  9 |           | 34 DIO3        PI1  9 |           | 32 DIO2
    PI1 10 |   MM76    | 33 DIO2        PI5 10 |   MM76L   | 31 DIO1
    PI5 11 |   MM76E   | 32 DIO1        PI7 11 |   MM76EL  | 30 DIO0
    PI7 12 |           | 31 DIO0        PI3 12 |           | 29 CLOCK
    PI3 13 |           | 30 CLOCK       PI8 13 |           | 28 DATAO
    PI8 14 |           | 29 DATAO       PI4 14 |           | 27 DATAI
    PI4 15 |           | 28 DATAI        PO 15 |           | 26 RIO4
    Vdd 16 |           | 27 RIO4       INT0 16 |           | 25 RIO3
     PO 17 |           | 26 RIO3       INT1 17 |           | 24 RIO2
   INT0 18 |           | 25 RIO2       RIO5 18 |           | 23 RIO1
   INT1 19 |           | 24 RIO1       RIO6 19 |           | 22 RIO8
   RIO5 20 |           | 23 RIO8        Vss 20 |___________| 21 RIO7
   RIO6 21 |___________| 22 RIO7

*/

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

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

	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;
	virtual void device_add_mconfig(machine_config &config) override;

	// device_disasm_interface overrides
	virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;

	// device_execute_interface overrides
	virtual void execute_one() override;

	void data_48x4(address_map &map);
	void program_0_6k(address_map &map);

	// opcode helpers
	u8 ram_r();
	void ram_w(u8 data);
	void pop_pc();
	void push_pc();
	void op_tr();
	void op_illegal();
	void op_todo();

	virtual bool op_is_tr(u8 op) override { return (op & 0xf0) == 0x30; };
	virtual bool op_is_eob(u8 op) { return (op & 0xfc) == 0x1c; };
	virtual bool op_is_lb(u8 op) { return (op & 0xf0) == 0x20; };
	virtual bool op_is_lai(u8 op) { return (op & 0xf0) == 0x70; };

	// opcode handlers
	virtual void op_xab();
	virtual void op_lba();
	virtual void op_lb();
	virtual void op_eob();

	virtual void op_sb();
	virtual void op_rb();
	virtual void op_skbf();

	virtual void op_xas();
	virtual void op_lsa();

	virtual void op_l();
	virtual void op_x();
	virtual void op_xdsk();
	virtual void op_xnsk();

	virtual void op_a();
	virtual void op_ac();
	virtual void op_acsk();
	virtual void op_ask();
	virtual void op_com();
	virtual void op_rc();
	virtual void op_sc();
	virtual void op_sknc();
	virtual void op_lai();
	virtual void op_aisk();

	virtual void op_rt();
	virtual void op_rtsk();
	virtual void op_t();
	virtual void op_tl();
	virtual void op_tm();
	virtual void op_tml();
	virtual void op_nop();

	virtual void op_skmea();
	virtual void op_skbei();
	virtual void op_skaei();

	virtual void op_ibm();
	virtual void op_ob();
	virtual void op_iam();
	virtual void op_oa();
	virtual void op_ios();
	virtual void op_i1();
	virtual void op_i2c();
	virtual void op_int1h();
	virtual void op_din1();
	virtual void op_int0l();
	virtual void op_din0();
	virtual void op_seg1();
	virtual void op_seg2();
};

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

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

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

	void program_1k(address_map &map);
};

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


DECLARE_DEVICE_TYPE(MM76, mm76_device)
DECLARE_DEVICE_TYPE(MM76L, mm76l_device)
DECLARE_DEVICE_TYPE(MM76E, mm76e_device)
DECLARE_DEVICE_TYPE(MM76EL, mm76el_device)

#endif // MAME_CPU_PPS41_MM76_H