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

  Rockwell MM77/MM78 MCU

*/

#ifndef MAME_CPU_PPS41_MM78_H
#define MAME_CPU_PPS41_MM78_H

#pragma once

#include "mm76.h"

// pinout reference

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

    MM78 also exists as 40-pin DIP and can have the same pinout as MM78L
*/

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

protected:
	mm78_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, const XTAL &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_96x4(address_map &map);
	void data_128x4(address_map &map);
	void program_1_3k(address_map &map);
	void program_1_5k(address_map &map);
	void program_2k(address_map &map);

	// opcode helpers
	virtual bool op_is_eob(u8 op) override { return (op & 0xf8) == 0x08; }
	virtual bool op_is_lb(u8 op) override { return (op & 0xf0) == 0x10; }
	virtual bool op_is_lai(u8 op) override { return (op & 0xf0) == 0x40; }

	// opcode handlers
	virtual void op_lba() override;
	virtual void op_acsk() override;
	virtual void op_aisk() override;
	virtual void op_sb() override;
	virtual void op_rb() override;
	virtual void op_skbf() override;

	virtual void op_sos();
	virtual void op_ros();
	virtual void op_skisl();

	virtual void op_sag();
	virtual void op_lxa();
	virtual void op_xax();
	virtual void op_tlb();
	virtual void op_tmlb();
	virtual void op_tab();
	virtual void op_ix();
	virtual void op_ox();
	virtual void op_ioa();
	virtual void op_i1sk();
	virtual void op_int0h();
	virtual void op_int1l();
};

class mm78l_device : public mm78_device
{
public:
	mm78l_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock);
};

class mm77_device : public mm78_device
{
public:
	mm77_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock);

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

class mm77l_device : public mm77_device
{
public:
	mm77l_device(const machine_config &mconfig, const char *tag, device_t *owner, const XTAL &clock);
};


DECLARE_DEVICE_TYPE(MM78, mm78_device)
DECLARE_DEVICE_TYPE(MM78L, mm78l_device)
DECLARE_DEVICE_TYPE(MM77, mm77_device)
DECLARE_DEVICE_TYPE(MM77L, mm77l_device)

#endif // MAME_CPU_PPS41_MM78_H