1 // license:BSD-3-Clause 2 // copyright-holders:Luca Elia 3 #ifndef MAME_MACHINE_TMP68301_H 4 #define MAME_MACHINE_TMP68301_H 5 6 #pragma once 7 8 #include "cpu/m68000/m68000.h" 9 10 /* TODO: serial ports, frequency & hook it up with m68k */ 11 12 13 //************************************************************************** 14 // TYPE DEFINITIONS 15 //************************************************************************** 16 17 18 19 class tmp68301_device : public m68000_device 20 { 21 public: 22 tmp68301_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); 23 in_parallel_callback()24 auto in_parallel_callback() { return m_in_parallel_cb.bind(); } out_parallel_callback()25 auto out_parallel_callback() { return m_out_parallel_cb.bind(); } 26 27 // Interrupts 28 void external_interrupt_0(); 29 void external_interrupt_1(); 30 void external_interrupt_2(); 31 32 private: 33 uint16_t imr_r(); 34 void imr_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 35 uint16_t ipr_r(); 36 void ipr_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 37 uint16_t iisr_r(); 38 void iisr_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 39 uint16_t scr_r(); 40 void scr_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 41 uint16_t pdr_r(); 42 void pdr_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 43 uint16_t pdir_r(); 44 void pdir_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 45 uint8_t icr_r(offs_t offset); 46 void icr_w(offs_t offset, uint8_t data); 47 48 // Hardware Registers 49 uint16_t regs_r(offs_t offset); 50 void regs_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); 51 52 void tmp68301_regs(address_map &map); 53 54 protected: 55 // device-level overrides 56 virtual void device_start() override; 57 virtual void device_reset() override; 58 59 private: 60 TIMER_CALLBACK_MEMBER(timer_callback); 61 void update_timer(int i); 62 void update_ipl(); 63 uint8_t serial_interrupt_cause(int channel); 64 65 static constexpr uint16_t EXT_IRQ0 = 1 << 0; 66 static constexpr uint16_t EXT_IRQ1 = 1 << 1; 67 static constexpr uint16_t EXT_IRQ2 = 1 << 2; 68 static constexpr uint16_t SERIAL_IRQ_CH0 = 1 << 4; 69 static constexpr uint16_t SERIAL_IRQ_CH1 = 1 << 5; 70 static constexpr uint16_t SERIAL_IRQ_CH2 = 1 << 6; 71 static constexpr uint16_t PARALLEL_IRQ = 1 << 7; 72 static constexpr uint16_t TIMER0_IRQ = 1 << 8; 73 static constexpr uint16_t TIMER1_IRQ = 1 << 9; 74 static constexpr uint16_t TIMER2_IRQ = 1 << 10; 75 76 devcb_read16 m_in_parallel_cb; 77 devcb_write16 m_out_parallel_cb; 78 79 // internal state 80 uint16_t m_regs[0x400]; 81 82 emu_timer *m_tmp68301_timer[3]; // 3 Timers 83 84 uint8_t m_ipl; // internal interrupt level 85 86 uint16_t m_imr; 87 uint16_t m_ipr; 88 uint16_t m_iisr; 89 uint16_t m_scr; 90 uint16_t m_pdir; 91 uint16_t m_pdr; 92 uint8_t m_icr[10]; 93 94 void internal_vectors_r(address_map &map); 95 uint8_t irq_callback(offs_t offset); 96 }; 97 98 DECLARE_DEVICE_TYPE(TMP68301, tmp68301_device) 99 100 #endif // MAME_MACHINE_TMP68301_H 101