m68000: Add overrideable method to signal RESET instruction to internal peripherals (nw)

This commit is contained in:
AJR 2019-02-11 16:47:02 -05:00
parent a905dffd08
commit 2d149e21c9
11 changed files with 50 additions and 4 deletions

View File

@ -349,6 +349,8 @@ protected:
#include "m68kops.h"
#include "m68kfpu.hxx"
#include "m68kmmu.h"
virtual void m68k_reset_peripherals() { }
};

View File

@ -262,3 +262,12 @@ void m68340_cpu_device::device_start()
m_int_ack_callback = device_irq_acknowledge_delegate(FUNC(m68340_cpu_device::int_ack), this);
}
void m68340_cpu_device::m68k_reset_peripherals()
{
m_m68340SIM->module_reset();
m_m68340DMA->module_reset();
m_serial->module_reset();
m_timer[0]->module_reset();
m_timer[1]->module_reset();
}

View File

@ -49,6 +49,8 @@ protected:
virtual void device_reset() override;
virtual void device_add_mconfig(machine_config &config) override;
virtual void m68k_reset_peripherals() override;
private:
required_device<mc68340_serial_module_device> m_serial;
required_device_array<mc68340_timer_module_device, 2> m_timer;

View File

@ -25,5 +25,10 @@ WRITE32_MEMBER( m68340_cpu_device::m68340_internal_dma_w )
}
void m68340_dma::reset()
{
module_reset();
}
void m68340_dma::module_reset()
{
}

View File

@ -10,6 +10,7 @@ class m68340_dma
{
public:
void reset();
void module_reset();
};
#endif // MAME_MACHINE_68340DMA_H

View File

@ -157,4 +157,9 @@ mc68340_serial_module_device::mc68340_serial_module_device(const machine_config
{
}
void mc68340_serial_module_device::module_reset()
{
mc68340_duart_device::device_reset();
}
DEFINE_DEVICE_TYPE(MC68340_SERIAL_MODULE, mc68340_serial_module_device, "mc68340sermod", "MC68340 Serial Module")

View File

@ -27,6 +27,8 @@ public:
uint8_t irq_vector() const { return m_ivr; }
uint8_t arbitrate(uint8_t level) const { return (irq_level() == level) ? (m_mcrl & REG_MCRL_ARBLV) : 0; }
void module_reset();
protected:
m68340_cpu_device *m_cpu;

View File

@ -493,6 +493,12 @@ void m68340_sim::reset()
m_pit_irq = false;
}
void m68340_sim::module_reset()
{
// SYS set in RSR, nothing else happens
m_avr_rsr = (m_avr_rsr & 0xff00) | 0x02;
}
/* do_tick_pit works on whole clock cycles, no flank support */
void m68340_cpu_device::do_tick_pit()
{

View File

@ -35,6 +35,7 @@ public:
bool m_pit_irq;
void reset();
void module_reset();
enum {
REG_MCR = 0x00,

View File

@ -308,6 +308,16 @@ void mc68340_timer_module_device::device_start()
m_tin_in_cb.resolve_safe();
}
void mc68340_timer_module_device::device_reset()
{
module_reset();
}
void mc68340_timer_module_device::module_reset()
{
// TODO
}
void mc68340_timer_module_device::do_timer_irq()
{
assert((m_sr & (REG_SR_TO | REG_SR_TG | REG_SR_TC)) != 0);

View File

@ -14,9 +14,6 @@ class mc68340_timer_module_device : public device_t
public:
mc68340_timer_module_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
// device-level overrides
virtual void device_start() override;
READ16_MEMBER( read );
WRITE16_MEMBER( write );
DECLARE_WRITE_LINE_MEMBER( tin_w );
@ -26,7 +23,13 @@ public:
uint8_t irq_vector() const { return m_ir & REG_IR_INTVEC; }
uint8_t arbitrate(uint8_t level) const { return (irq_level() == level) ? (m_mcr & REG_MCR_ARBLV) : 0; }
protected:
void module_reset();
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
m68340_cpu_device *m_cpu;
uint16_t m_mcr;