summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/68340.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/68340.h')
-rw-r--r--src/devices/machine/68340.h73
1 files changed, 66 insertions, 7 deletions
diff --git a/src/devices/machine/68340.h b/src/devices/machine/68340.h
index deb31c5e9f0..81a8e83ad98 100644
--- a/src/devices/machine/68340.h
+++ b/src/devices/machine/68340.h
@@ -28,6 +28,27 @@
#define MCFG_MC68340_PB_OUTPUT_CB(_devcb) \
devcb = &m68340_cpu_device::set_pb_out_callback (*device, DEVCB_##_devcb);
+#define MCFG_MC68340_ADD_CRYSTAL(_crystal) \
+ m68340_cpu_device::set_crystal(*device, _crystal);
+
+#define MCFG_MC68340_TOUT1_OUTPUT_CB(_devcb) \
+ devcb = &m68340_cpu_device::set_tout1_out_callback (*device, DEVCB_##_devcb);
+
+#define MCFG_MC68340_TIN1_INPUT_CB(_devcb) \
+ devcb = &m68340_cpu_device::set_tin1_out_callback (*device, DEVCB_##_devcb);
+
+#define MCFG_MC68340_TGATE1_INPUT_CB(_devcb) \
+ devcb = &m68340_cpu_device::set_tgate1_out_callback (*device, DEVCB_##_devcb);
+
+#define MCFG_MC68340_TOUT2_OUTPUT_CB(_devcb) \
+ devcb = &m68340_cpu_device::set_tout2_out_callback (*device, DEVCB_##_devcb);
+
+#define MCFG_MC68340_TIN2_INPUT_CB(_devcb) \
+ devcb = &m68340_cpu_device::set_tin2_out_callback (*device, DEVCB_##_devcb);
+
+#define MCFG_MC68340_TGATE2_INPUT_CB(_devcb) \
+ devcb = &m68340_cpu_device::set_tgate2_out_callback (*device, DEVCB_##_devcb);
+
class m68340_cpu_device : public fscpu32_device
{
public:
@@ -37,9 +58,24 @@ public:
template <class Object> static devcb_base &set_pa_out_callback (device_t &device, Object &&cb){ return downcast<m68340_cpu_device &>(device).m_pa_out_cb.set_callback (std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_pb_in_callback (device_t &device, Object &&cb){ return downcast<m68340_cpu_device &>(device).m_pb_in_cb.set_callback (std::forward<Object>(cb)); }
template <class Object> static devcb_base &set_pb_out_callback (device_t &device, Object &&cb){ return downcast<m68340_cpu_device &>(device).m_pb_out_cb.set_callback (std::forward<Object>(cb)); }
+
+ template <class Object> static devcb_base &set_tout1_out_callback (device_t &device, Object &&cb){ return downcast<m68340_cpu_device &>(device).m_tout1_out_cb.set_callback (std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_tin1_in_callback (device_t &device, Object &&cb) { return downcast<m68340_cpu_device &>(device).m_tin1_in_cb.set_callback (std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_tgate1_in_callback (device_t &device, Object &&cb){ return downcast<m68340_cpu_device &>(device).m_tgate1_in_cb.set_callback (std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_tout2_out_callback (device_t &device, Object &&cb){ return downcast<m68340_cpu_device &>(device).m_tout2_out_cb.set_callback (std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_tin2_in_callback (device_t &device, Object &&cb) { return downcast<m68340_cpu_device &>(device).m_tin2_in_cb.set_callback (std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_tgate2_in_callback (device_t &device, Object &&cb){ return downcast<m68340_cpu_device &>(device).m_tgate2_in_cb.set_callback (std::forward<Object>(cb)); }
uint16_t get_cs(offs_t address);
+ // TODO: Support Limp mode and external clock with no PLL
+ static void set_crystal(device_t &device, int crystal)
+ {
+ m68340_cpu_device &dev = downcast<m68340_cpu_device &>(device);
+ dev.m_crystal = crystal;
+ dev.m_clock_mode |= (m68340_sim::CLOCK_MODCK | m68340_sim::CLOCK_PLL);
+ }
+
READ32_MEMBER( m68340_internal_base_r );
WRITE32_MEMBER( m68340_internal_base_w );
READ32_MEMBER( m68340_internal_dma_r );
@@ -52,20 +88,41 @@ public:
WRITE16_MEMBER( m68340_internal_sim_w );
WRITE8_MEMBER( m68340_internal_sim_ports_w );
WRITE32_MEMBER( m68340_internal_sim_cs_w );
- READ32_MEMBER( m68340_internal_timer_r );
- WRITE32_MEMBER( m68340_internal_timer_w );
+ READ16_MEMBER( m68340_internal_timer_r );
+ WRITE16_MEMBER( m68340_internal_timer_w );
+
+ // Clock/VCO setting TODO: support external clock with PLL and Limp mode
+ DECLARE_WRITE_LINE_MEMBER( set_modck );
+ DECLARE_WRITE_LINE_MEMBER( extal_w );
+
+ // Timer input methods, can be used instead of the corresponding polling MCFG callbacks
+ DECLARE_WRITE_LINE_MEMBER( tin1_w );
+ DECLARE_WRITE_LINE_MEMBER( tgate1_w );
+ DECLARE_WRITE_LINE_MEMBER( tin2_w );
+ DECLARE_WRITE_LINE_MEMBER( tgate2_w );
protected:
virtual void device_start() override;
virtual void device_reset() override;
TIMER_CALLBACK_MEMBER(periodic_interrupt_timer_callback);
+ TIMER_CALLBACK_MEMBER(timer1_callback);
+ TIMER_CALLBACK_MEMBER(timer2_callback);
+
void start_68340_sim();
- void do_timer_irq();
+ void start_68340_timer();
+ void do_pit_irq();
+ void do_tick_pit();
+ void do_timer_irq(int id);
+ void do_timer_tick(int id);
int calc_cs(offs_t address) const;
int m_currentcs;
+ uint32_t m_clock_mode;
+ uint32_t m_modck;
+ uint32_t m_crystal;
+ uint32_t m_extal;
/* 68340 peripheral modules */
m68340_sim* m68340SIM;
@@ -75,16 +132,18 @@ protected:
uint32_t m68340_base;
- uint16_t m_avr;
- uint16_t m_picr;
- uint16_t m_pitr;
-
emu_timer *m_irq_timer;
devcb_write8 m_pa_out_cb;
devcb_read8 m_pa_in_cb;
devcb_write8 m_pb_out_cb;
devcb_read8 m_pb_in_cb;
+ devcb_write_line m_tout1_out_cb;
+ devcb_write_line m_tin1_in_cb;
+ devcb_write_line m_tgate1_in_cb;
+ devcb_write_line m_tout2_out_cb;
+ devcb_write_line m_tin2_in_cb;
+ devcb_write_line m_tgate2_in_cb;
};
DECLARE_DEVICE_TYPE(M68340, m68340_cpu_device)