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