1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder, hap
3 /**********************************************************************
4 
5     PLA (Programmable Logic Array) emulation
6 
7 **********************************************************************/
8 
9 #ifndef MAME_MACHINE_PLA_H
10 #define MAME_MACHINE_PLA_H
11 
12 #pragma once
13 
14 
15 // 82S100, 82S101, PLS100, PLS101
16 // 16x48x8 PLA, 28-pin:
17 /*           _____   _____
18      FE   1 |*    \_/     | 28  Vcc
19      I7   2 |             | 27  I8
20      I6   3 |             | 26  I9
21      I5   4 |             | 25  I10
22      I4   5 |             | 24  I11
23      I3   6 |    82S100   | 23  I12
24      I2   7 |    82S101   | 22  I13
25      I1   8 |    PLS100   | 21  I14
26      I0   9 |    PLS101   | 20  I15
27      F7  10 |             | 19  _CE
28      F6  11 |             | 18  F0
29      F5  12 |             | 17  F1
30      F4  13 |             | 16  F2
31     GND  14 |_____________| 15  F3
32 */
33 
34 
35 ///*************************************************************************
36 //  TYPE DEFINITIONS
37 ///*************************************************************************
38 
39 // ======================> pla_device
40 
41 class pla_device : public device_t
42 {
43 public:
44 	enum class FMT
45 	{
46 		JEDBIN = 0,
47 		BERKELEY
48 	};
49 
50 	// construction/destruction
51 	pla_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
52 	pla_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
pla_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t inputs,uint32_t outputs,uint32_t terms)53 	pla_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t inputs, uint32_t outputs, uint32_t terms)
54 		: pla_device(mconfig, tag, owner, (uint32_t)0)
55 	{
56 		set_num_inputs(inputs);
57 		set_num_outputs(outputs);
58 		set_num_terms(terms);
59 	}
60 
61 	// configuration helpers
set_num_inputs(uint32_t i)62 	void set_num_inputs(uint32_t i) { m_inputs = i; }
set_num_outputs(uint32_t o)63 	void set_num_outputs(uint32_t o) { m_outputs = o; }
set_num_terms(uint32_t t)64 	void set_num_terms(uint32_t t) { m_terms = t; }
set_inputmask(uint32_t mask)65 	void set_inputmask(uint32_t mask) { m_input_mask = mask; } // uint32_t!
set_format(FMT format)66 	void set_format(FMT format) { m_format = format; }
67 
inputs()68 	uint32_t inputs() { return m_inputs; }
outputs()69 	uint32_t outputs() { return m_outputs; }
70 
71 	uint32_t read(uint32_t input);
72 	bool reinit();
73 
74 protected:
75 	// device-level overrides
76 	virtual void device_start() override;
77 
78 private:
79 	static constexpr unsigned MAX_TERMS       = 512;
80 	static constexpr unsigned MAX_CACHE_BITS  = 20;
81 	static constexpr unsigned CACHE2_SIZE     = 8;
82 
83 	int parse_fusemap();
84 
85 	required_memory_region m_region;
86 
87 	FMT m_format;
88 
89 	uint32_t m_inputs;
90 	uint32_t m_outputs;
91 	uint32_t m_terms;
92 	uint64_t m_input_mask;
93 	uint64_t m_xor;
94 
95 	int m_cache_size;
96 	std::vector<uint32_t> m_cache;
97 	uint64_t m_cache2[CACHE2_SIZE];
98 	uint8_t m_cache2_ptr;
99 
100 	struct term
101 	{
102 		uint64_t and_mask;
103 		uint64_t or_mask;
104 	} m_term[MAX_TERMS];
105 };
106 
107 class pls100_device : public pla_device
108 {
109 public:
110 	pls100_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
111 };
112 
113 class mos8721_device : public pla_device
114 {
115 public:
116 	mos8721_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
117 };
118 
119 DECLARE_DEVICE_TYPE(PLA, pla_device)
120 DECLARE_DEVICE_TYPE(PLS100, pls100_device)
121 DECLARE_DEVICE_TYPE(MOS8721, mos8721_device)
122 
123 #endif // MAME_MACHINE_PLA_H
124