mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
sh2.cpp: first pass over SH7604 SoC refactoring [Angelo Salese]
* Fixed division unit overflow flag clearance;
This commit is contained in:
parent
fb50043856
commit
d6b22fa2c0
@ -123,15 +123,94 @@ READ32_MEMBER(sh2_device::sh2_internal_a5)
|
||||
sh2_internal_map - maps SH2 built-ins
|
||||
-------------------------------------------------*/
|
||||
|
||||
|
||||
void sh2_device::sh7604_map(address_map &map)
|
||||
{
|
||||
map(0x40000000, 0xbfffffff).r(FUNC(sh2_device::sh2_internal_a5));
|
||||
/*!
|
||||
@todo: cps3boot breaks with this enabled. Needs customization ...
|
||||
*/
|
||||
|
||||
// TODO: cps3boot breaks with this enabled. Needs callback
|
||||
// AM_RANGE(0xc0000000, 0xc0000fff) AM_RAM // cache data array
|
||||
// AM_RANGE(0xffffff88, 0xffffff8b) AM_READWRITE(dma_dtcr0_r,dma_dtcr0_w)
|
||||
map(0xe0000000, 0xe00001ff).mirror(0x1ffffe00).rw(FUNC(sh2_device::sh7604_r), FUNC(sh2_device::sh7604_w));
|
||||
|
||||
// map(0xe0000000, 0xe00001ff).mirror(0x1ffffe00).rw(FUNC(sh2_device::sh7604_r), FUNC(sh2_device::sh7604_w));
|
||||
// TODO: internal map takes way too much resources if mirrored with 0x1ffffe00
|
||||
// we eventually internalize again via trampoline & sh7604_device
|
||||
// additionally SH7604 doc mentions that there's a DRAM located at 0xffff8000,
|
||||
// so this is not a full mirror? (needs confirmation)
|
||||
// SCI
|
||||
map(0xfffffe00, 0xfffffe00).rw(FUNC(sh2_device::smr_r), FUNC(sh2_device::smr_w));
|
||||
map(0xfffffe01, 0xfffffe01).rw(FUNC(sh2_device::brr_r), FUNC(sh2_device::brr_w));
|
||||
map(0xfffffe02, 0xfffffe02).rw(FUNC(sh2_device::scr_r), FUNC(sh2_device::scr_w));
|
||||
map(0xfffffe03, 0xfffffe03).rw(FUNC(sh2_device::tdr_r), FUNC(sh2_device::tdr_w));
|
||||
map(0xfffffe04, 0xfffffe04).rw(FUNC(sh2_device::ssr_r), FUNC(sh2_device::ssr_w));
|
||||
map(0xfffffe05, 0xfffffe05).r(FUNC(sh2_device::rdr_r));
|
||||
|
||||
// FRC
|
||||
map(0xfffffe10, 0xfffffe10).rw(FUNC(sh2_device::tier_r), FUNC(sh2_device::tier_w));
|
||||
map(0xfffffe11, 0xfffffe11).rw(FUNC(sh2_device::ftcsr_r), FUNC(sh2_device::ftcsr_w));
|
||||
map(0xfffffe12, 0xfffffe13).rw(FUNC(sh2_device::frc_r), FUNC(sh2_device::frc_w));
|
||||
map(0xfffffe14, 0xfffffe15).rw(FUNC(sh2_device::ocra_b_r), FUNC(sh2_device::ocra_b_w));
|
||||
map(0xfffffe16, 0xfffffe16).rw(FUNC(sh2_device::frc_tcr_r), FUNC(sh2_device::frc_tcr_w));
|
||||
map(0xfffffe17, 0xfffffe17).rw(FUNC(sh2_device::tocr_r), FUNC(sh2_device::tocr_w));
|
||||
map(0xfffffe18, 0xfffffe19).r(FUNC(sh2_device::frc_icr_r));
|
||||
|
||||
// INTC
|
||||
map(0xfffffe60, 0xfffffe61).rw(FUNC(sh2_device::iprb_r), FUNC(sh2_device::iprb_w));
|
||||
map(0xfffffe62, 0xfffffe63).rw(FUNC(sh2_device::vcra_r), FUNC(sh2_device::vcra_w));
|
||||
map(0xfffffe64, 0xfffffe65).rw(FUNC(sh2_device::vcrb_r), FUNC(sh2_device::vcrb_w));
|
||||
map(0xfffffe66, 0xfffffe67).rw(FUNC(sh2_device::vcrc_r), FUNC(sh2_device::vcrc_w));
|
||||
map(0xfffffe68, 0xfffffe69).rw(FUNC(sh2_device::vcrd_r), FUNC(sh2_device::vcrd_w));
|
||||
|
||||
map(0xfffffe71, 0xfffffe71).rw(FUNC(sh2_device::drcr_r<0>), FUNC(sh2_device::drcr_w<0>));
|
||||
map(0xfffffe72, 0xfffffe72).rw(FUNC(sh2_device::drcr_r<1>), FUNC(sh2_device::drcr_w<1>));
|
||||
|
||||
// WTC
|
||||
map(0xfffffe80, 0xfffffe81).rw(FUNC(sh2_device::wtcnt_r), FUNC(sh2_device::wtcnt_w));
|
||||
map(0xfffffe82, 0xfffffe83).rw(FUNC(sh2_device::rstcsr_r), FUNC(sh2_device::rstcsr_w));
|
||||
|
||||
// standby and cache control
|
||||
map(0xfffffe91, 0xfffffe91).rw(FUNC(sh2_device::sbycr_r), FUNC(sh2_device::sbycr_w));
|
||||
map(0xfffffe92, 0xfffffe92).rw(FUNC(sh2_device::ccr_r), FUNC(sh2_device::ccr_w));
|
||||
|
||||
// INTC second section
|
||||
map(0xfffffee0, 0xfffffee1).rw(FUNC(sh2_device::intc_icr_r), FUNC(sh2_device::intc_icr_w));
|
||||
map(0xfffffee2, 0xfffffee3).rw(FUNC(sh2_device::ipra_r), FUNC(sh2_device::ipra_w));
|
||||
map(0xfffffee4, 0xfffffee5).rw(FUNC(sh2_device::vcrwdt_r), FUNC(sh2_device::vcrwdt_w));
|
||||
|
||||
// DIVU
|
||||
map(0xffffff00, 0xffffff03).rw(FUNC(sh2_device::dvsr_r), FUNC(sh2_device::dvsr_w));
|
||||
map(0xffffff04, 0xffffff07).rw(FUNC(sh2_device::dvdnt_r), FUNC(sh2_device::dvdnt_w));
|
||||
map(0xffffff08, 0xffffff0b).rw(FUNC(sh2_device::dvcr_r), FUNC(sh2_device::dvcr_w));
|
||||
// INTC third section
|
||||
map(0xffffff0c, 0xffffff0f).rw(FUNC(sh2_device::vcrdiv_r), FUNC(sh2_device::vcrdiv_w));
|
||||
// DIVU continued (64-bit plus mirrors)
|
||||
map(0xffffff10, 0xffffff13).rw(FUNC(sh2_device::dvdnth_r), FUNC(sh2_device::dvdnth_w));
|
||||
map(0xffffff14, 0xffffff17).rw(FUNC(sh2_device::dvdntl_r), FUNC(sh2_device::dvdntl_w));
|
||||
map(0xffffff18, 0xffffff1b).r(FUNC(sh2_device::dvdnth_r));
|
||||
map(0xffffff1c, 0xffffff1f).r(FUNC(sh2_device::dvdntl_r));
|
||||
|
||||
// DMAC
|
||||
map(0xffffff80, 0xffffff83).rw(FUNC(sh2_device::sar_r<0>), FUNC(sh2_device::sar_w<0>));
|
||||
map(0xffffff84, 0xffffff87).rw(FUNC(sh2_device::dar_r<0>), FUNC(sh2_device::dar_w<0>));
|
||||
map(0xffffff88, 0xffffff8b).rw(FUNC(sh2_device::dmac_tcr_r<0>), FUNC(sh2_device::dmac_tcr_w<0>));
|
||||
map(0xffffff8c, 0xffffff8f).rw(FUNC(sh2_device::chcr_r<0>), FUNC(sh2_device::chcr_w<0>));
|
||||
|
||||
map(0xffffff90, 0xffffff93).rw(FUNC(sh2_device::sar_r<1>), FUNC(sh2_device::sar_w<1>));
|
||||
map(0xffffff94, 0xffffff97).rw(FUNC(sh2_device::dar_r<1>), FUNC(sh2_device::dar_w<1>));
|
||||
map(0xffffff98, 0xffffff9b).rw(FUNC(sh2_device::dmac_tcr_r<1>), FUNC(sh2_device::dmac_tcr_w<1>));
|
||||
map(0xffffff9c, 0xffffff9f).rw(FUNC(sh2_device::chcr_r<1>), FUNC(sh2_device::chcr_w<1>));
|
||||
|
||||
map(0xffffffa0, 0xffffffa3).rw(FUNC(sh2_device::vcrdma_r<0>), FUNC(sh2_device::vcrdma_w<0>));
|
||||
map(0xffffffa8, 0xffffffab).rw(FUNC(sh2_device::vcrdma_r<1>), FUNC(sh2_device::vcrdma_w<1>));
|
||||
map(0xffffffb0, 0xffffffb3).rw(FUNC(sh2_device::dmaor_r), FUNC(sh2_device::dmaor_w));
|
||||
|
||||
// BSC
|
||||
map(0xffffffe0, 0xffffffe3).rw(FUNC(sh2_device::bcr1_r), FUNC(sh2_device::bcr1_w));
|
||||
map(0xffffffe4, 0xffffffe7).rw(FUNC(sh2_device::bcr2_r), FUNC(sh2_device::bcr2_w));
|
||||
map(0xffffffe8, 0xffffffeb).rw(FUNC(sh2_device::wcr_r), FUNC(sh2_device::wcr_w));
|
||||
map(0xffffffec, 0xffffffef).rw(FUNC(sh2_device::mcr_r), FUNC(sh2_device::mcr_w));
|
||||
map(0xfffffff0, 0xfffffff3).rw(FUNC(sh2_device::rtcsr_r), FUNC(sh2_device::rtcsr_w));
|
||||
map(0xfffffff4, 0xfffffff7).rw(FUNC(sh2_device::rtcnt_r), FUNC(sh2_device::rtcnt_w));
|
||||
map(0xfffffff8, 0xfffffffb).rw(FUNC(sh2_device::rtcor_r), FUNC(sh2_device::rtcor_w));
|
||||
}
|
||||
|
||||
void sh2a_device::sh7021_map(address_map &map)
|
||||
@ -364,14 +443,12 @@ void sh2_device::device_reset()
|
||||
m_sh2_state->pending_irq = m_test_irq = 0;
|
||||
//memset(&m_irq_queue[0], 0, sizeof(m_irq_queue[0])*16);
|
||||
memset(&m_irq_line_state[0], 0, sizeof(m_irq_line_state[0])*17);
|
||||
m_frc = m_ocra = m_ocrb = m_icr = 0;
|
||||
m_frc = m_ocra = m_ocrb = m_frc_icr = 0;
|
||||
m_frc_base = 0;
|
||||
m_frt_input = m_sh2_state->internal_irq_level = m_internal_irq_vector = 0;
|
||||
m_dma_timer_active[0] = m_dma_timer_active[1] = 0;
|
||||
m_dma_irq[0] = m_dma_irq[1] = 0;
|
||||
|
||||
memset(m_m, 0, 0x200);
|
||||
|
||||
m_sh2_state->pc = RL(0);
|
||||
m_sh2_state->r[15] = RL(4);
|
||||
m_sh2_state->sr = SH_I;
|
||||
@ -467,13 +544,93 @@ void sh2_device::device_start()
|
||||
|
||||
m_internal = &space(AS_PROGRAM);
|
||||
|
||||
save_item(NAME(m_cpu_off));
|
||||
//save_item(NAME(m_dvsr));
|
||||
//save_item(NAME(m_dvdnth));
|
||||
//save_item(NAME(m_dvdntl));
|
||||
//save_item(NAME(m_dvcr));
|
||||
save_item(NAME(m_test_irq));
|
||||
// SCI
|
||||
save_item(NAME(m_smr));
|
||||
save_item(NAME(m_brr));
|
||||
save_item(NAME(m_scr));
|
||||
save_item(NAME(m_tdr));
|
||||
save_item(NAME(m_ssr));
|
||||
|
||||
// FRT / FRC
|
||||
save_item(NAME(m_tier));
|
||||
save_item(NAME(m_ftcsr));
|
||||
save_item(NAME(m_frc_tcr));
|
||||
save_item(NAME(m_tocr));
|
||||
save_item(NAME(m_frc));
|
||||
save_item(NAME(m_ocra));
|
||||
save_item(NAME(m_ocrb));
|
||||
save_item(NAME(m_frc_icr));
|
||||
save_item(NAME(m_frc_base));
|
||||
save_item(NAME(m_frt_input));
|
||||
|
||||
// INTC
|
||||
save_item(NAME(m_irq_level.frc));
|
||||
save_item(NAME(m_irq_level.sci));
|
||||
save_item(NAME(m_irq_level.divu));
|
||||
save_item(NAME(m_irq_level.dmac));
|
||||
save_item(NAME(m_irq_level.wdt));
|
||||
save_item(NAME(m_irq_vector.fic));
|
||||
save_item(NAME(m_irq_vector.foc));
|
||||
save_item(NAME(m_irq_vector.fov));
|
||||
save_item(NAME(m_irq_vector.divu));
|
||||
save_item(NAME(m_irq_vector.dmac[0]));
|
||||
save_item(NAME(m_irq_vector.dmac[1]));
|
||||
|
||||
save_item(NAME(m_ipra));
|
||||
save_item(NAME(m_iprb));
|
||||
save_item(NAME(m_vcra));
|
||||
save_item(NAME(m_vcrb));
|
||||
save_item(NAME(m_vcrc));
|
||||
save_item(NAME(m_vcrd));
|
||||
save_item(NAME(m_vcrwdt));
|
||||
save_item(NAME(m_vcrdiv));
|
||||
save_item(NAME(m_intc_icr));
|
||||
save_item(NAME(m_vcrdma[0]));
|
||||
save_item(NAME(m_vcrdma[1]));
|
||||
|
||||
save_item(NAME(m_vecmd));
|
||||
save_item(NAME(m_nmie));
|
||||
|
||||
// DIVU
|
||||
save_item(NAME(m_divu_ovf));
|
||||
save_item(NAME(m_divu_ovfie));
|
||||
save_item(NAME(m_dvsr));
|
||||
save_item(NAME(m_dvdntl));
|
||||
save_item(NAME(m_dvdnth));
|
||||
|
||||
// WTC
|
||||
save_item(NAME(m_wtcnt));
|
||||
save_item(NAME(m_wtcsr));
|
||||
save_item(NAME(m_rstcsr));
|
||||
save_item(NAME(m_wtcw[0]));
|
||||
save_item(NAME(m_wtcw[1]));
|
||||
|
||||
// DMAC
|
||||
save_item(NAME(m_dmaor));
|
||||
save_item(NAME(m_dmac[0].drcr));
|
||||
save_item(NAME(m_dmac[1].drcr));
|
||||
save_item(NAME(m_dmac[0].sar));
|
||||
save_item(NAME(m_dmac[1].sar));
|
||||
save_item(NAME(m_dmac[0].dar));
|
||||
save_item(NAME(m_dmac[1].dar));
|
||||
save_item(NAME(m_dmac[0].tcr));
|
||||
save_item(NAME(m_dmac[1].tcr));
|
||||
save_item(NAME(m_dmac[0].chcr));
|
||||
save_item(NAME(m_dmac[1].chcr));
|
||||
|
||||
// misc
|
||||
save_item(NAME(m_sbycr));
|
||||
save_item(NAME(m_ccr));
|
||||
|
||||
// BSC
|
||||
save_item(NAME(m_bcr1));
|
||||
save_item(NAME(m_bcr2));
|
||||
save_item(NAME(m_wcr));
|
||||
save_item(NAME(m_mcr));
|
||||
save_item(NAME(m_rtcsr));
|
||||
save_item(NAME(m_rtcor));
|
||||
save_item(NAME(m_rtcnt));
|
||||
|
||||
/*
|
||||
for (int i = 0; i < 16; ++i)
|
||||
{
|
||||
@ -482,22 +639,15 @@ void sh2_device::device_start()
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
// internals
|
||||
save_item(NAME(m_cpu_off));
|
||||
save_item(NAME(m_test_irq));
|
||||
save_item(NAME(m_irq_line_state));
|
||||
save_item(NAME(m_m));
|
||||
save_item(NAME(m_nmi_line_state));
|
||||
save_item(NAME(m_frc));
|
||||
save_item(NAME(m_ocra));
|
||||
save_item(NAME(m_ocrb));
|
||||
save_item(NAME(m_icr));
|
||||
save_item(NAME(m_frc_base));
|
||||
save_item(NAME(m_frt_input));
|
||||
save_item(NAME(m_internal_irq_vector));
|
||||
save_item(NAME(m_dma_timer_active));
|
||||
save_item(NAME(m_dma_irq));
|
||||
save_item(NAME(m_wtcnt));
|
||||
save_item(NAME(m_wtcsr));
|
||||
|
||||
|
||||
state_add( STATE_GENPC, "PC", m_sh2_state->pc).mask(SH12_AM).callimport();
|
||||
state_add( STATE_GENPCBASE, "CURPC", m_sh2_state->pc ).callimport().noshow();
|
||||
|
||||
@ -509,14 +659,13 @@ void sh2_device::device_start()
|
||||
//m_dvcr = 0;
|
||||
m_test_irq = 0;
|
||||
|
||||
|
||||
memset(m_irq_line_state, 0, sizeof(m_irq_line_state));
|
||||
memset(m_m, 0, sizeof(m_m));
|
||||
|
||||
m_nmi_line_state = 0;
|
||||
m_frc = 0;
|
||||
m_ocra = 0;
|
||||
m_ocrb = 0;
|
||||
m_icr = 0;
|
||||
m_frc_icr = 0;
|
||||
m_frc_base = 0;
|
||||
m_frt_input = 0;
|
||||
m_internal_irq_vector = 0;
|
||||
@ -641,7 +790,7 @@ void sh2_device::sh2_exception(const char *message, int irqline)
|
||||
}
|
||||
else
|
||||
{
|
||||
if(m_m[0x38] & 0x00010000)
|
||||
if(m_vecmd == true)
|
||||
{
|
||||
vector = standard_irq_callback(irqline);
|
||||
LOG("SH-2 exception #%d (external vector: $%x) after [%s]\n", irqline, vector, message);
|
||||
|
@ -81,10 +81,141 @@ public:
|
||||
}
|
||||
|
||||
|
||||
DECLARE_WRITE32_MEMBER( sh7604_w );
|
||||
DECLARE_READ32_MEMBER( sh7604_r );
|
||||
DECLARE_READ32_MEMBER(sh2_internal_a5);
|
||||
|
||||
// SCI
|
||||
DECLARE_READ8_MEMBER( smr_r );
|
||||
DECLARE_WRITE8_MEMBER( smr_w );
|
||||
DECLARE_READ8_MEMBER( brr_r );
|
||||
DECLARE_WRITE8_MEMBER( brr_w );
|
||||
DECLARE_READ8_MEMBER( scr_r );
|
||||
DECLARE_WRITE8_MEMBER( scr_w );
|
||||
DECLARE_READ8_MEMBER( tdr_r );
|
||||
DECLARE_WRITE8_MEMBER( tdr_w );
|
||||
DECLARE_READ8_MEMBER( ssr_r );
|
||||
DECLARE_WRITE8_MEMBER( ssr_w );
|
||||
DECLARE_READ8_MEMBER( rdr_r );
|
||||
|
||||
// FRT / FRC
|
||||
DECLARE_READ8_MEMBER( tier_r );
|
||||
DECLARE_WRITE8_MEMBER( tier_w );
|
||||
DECLARE_READ16_MEMBER( frc_r );
|
||||
DECLARE_WRITE16_MEMBER( frc_w );
|
||||
DECLARE_READ8_MEMBER( ftcsr_r );
|
||||
DECLARE_WRITE8_MEMBER( ftcsr_w );
|
||||
DECLARE_READ16_MEMBER( ocra_b_r );
|
||||
DECLARE_WRITE16_MEMBER( ocra_b_w );
|
||||
DECLARE_READ8_MEMBER( frc_tcr_r );
|
||||
DECLARE_WRITE8_MEMBER( frc_tcr_w );
|
||||
DECLARE_READ8_MEMBER( tocr_r );
|
||||
DECLARE_WRITE8_MEMBER( tocr_w );
|
||||
DECLARE_READ16_MEMBER( frc_icr_r );
|
||||
|
||||
// INTC
|
||||
DECLARE_READ16_MEMBER( ipra_r );
|
||||
DECLARE_WRITE16_MEMBER( ipra_w );
|
||||
DECLARE_READ16_MEMBER( iprb_r );
|
||||
DECLARE_WRITE16_MEMBER( iprb_w );
|
||||
DECLARE_READ16_MEMBER( vcra_r );
|
||||
DECLARE_WRITE16_MEMBER( vcra_w );
|
||||
DECLARE_READ16_MEMBER( vcrb_r );
|
||||
DECLARE_WRITE16_MEMBER( vcrb_w );
|
||||
DECLARE_READ16_MEMBER( vcrc_r );
|
||||
DECLARE_WRITE16_MEMBER( vcrc_w );
|
||||
DECLARE_READ16_MEMBER( vcrd_r );
|
||||
DECLARE_WRITE16_MEMBER( vcrd_w );
|
||||
DECLARE_READ16_MEMBER( vcrwdt_r );
|
||||
DECLARE_WRITE16_MEMBER( vcrwdt_w );
|
||||
DECLARE_READ32_MEMBER( vcrdiv_r );
|
||||
DECLARE_WRITE32_MEMBER( vcrdiv_w );
|
||||
DECLARE_READ16_MEMBER( intc_icr_r );
|
||||
DECLARE_WRITE16_MEMBER( intc_icr_w );
|
||||
|
||||
// DIVU
|
||||
DECLARE_READ32_MEMBER( dvsr_r );
|
||||
DECLARE_WRITE32_MEMBER( dvsr_w );
|
||||
DECLARE_READ32_MEMBER( dvdnt_r );
|
||||
DECLARE_WRITE32_MEMBER( dvdnt_w );
|
||||
DECLARE_READ32_MEMBER( dvdnth_r );
|
||||
DECLARE_WRITE32_MEMBER( dvdnth_w );
|
||||
DECLARE_READ32_MEMBER( dvdntl_r );
|
||||
DECLARE_WRITE32_MEMBER( dvdntl_w );
|
||||
|
||||
DECLARE_READ32_MEMBER( dvcr_r );
|
||||
DECLARE_WRITE32_MEMBER( dvcr_w );
|
||||
|
||||
// DMAC
|
||||
template <int Channel> READ32_MEMBER(vcrdma_r)
|
||||
{
|
||||
return m_vcrdma[Channel] & 0x7f;
|
||||
}
|
||||
|
||||
template <int Channel> WRITE32_MEMBER(vcrdma_w)
|
||||
{
|
||||
COMBINE_DATA(&m_vcrdma[Channel]);
|
||||
m_irq_vector.dmac[Channel] = m_vcrdma[Channel] & 0x7f;
|
||||
sh2_recalc_irq();
|
||||
}
|
||||
|
||||
template <int Channel> READ8_MEMBER(drcr_r) { return m_dmac[Channel].drcr & 3; }
|
||||
template <int Channel> WRITE8_MEMBER(drcr_w) { m_dmac[Channel].drcr = data & 3; sh2_recalc_irq(); }
|
||||
template <int Channel> READ32_MEMBER(sar_r) { return m_dmac[Channel].sar; }
|
||||
template <int Channel> WRITE32_MEMBER(sar_w) { COMBINE_DATA(&m_dmac[Channel].sar); }
|
||||
template <int Channel> READ32_MEMBER(dar_r) { return m_dmac[Channel].dar; }
|
||||
template <int Channel> WRITE32_MEMBER(dar_w) { COMBINE_DATA(&m_dmac[Channel].dar); }
|
||||
template <int Channel> READ32_MEMBER(dmac_tcr_r) { return m_dmac[Channel].tcr; }
|
||||
template <int Channel> WRITE32_MEMBER(dmac_tcr_w) { COMBINE_DATA(&m_dmac[Channel].tcr); m_dmac[Channel].tcr &= 0xffffff; }
|
||||
template <int Channel> READ32_MEMBER(chcr_r) { return m_dmac[Channel].chcr; }
|
||||
template <int Channel> WRITE32_MEMBER(chcr_w)
|
||||
{
|
||||
uint32_t old;
|
||||
old = m_dmac[Channel].chcr;
|
||||
COMBINE_DATA(&m_dmac[Channel].chcr);
|
||||
m_dmac[Channel].chcr = (data & ~2) | (old & m_dmac[Channel].chcr & 2);
|
||||
sh2_dmac_check(Channel);
|
||||
}
|
||||
READ32_MEMBER( dmaor_r ) { return m_dmaor & 0xf; }
|
||||
WRITE32_MEMBER( dmaor_w )
|
||||
{
|
||||
if(ACCESSING_BITS_0_7)
|
||||
{
|
||||
uint8_t old;
|
||||
old = m_dmaor & 0xf;
|
||||
m_dmaor = (data & ~6) | (old & m_dmaor & 6);
|
||||
sh2_dmac_check(0);
|
||||
sh2_dmac_check(1);
|
||||
}
|
||||
}
|
||||
|
||||
// WTC
|
||||
DECLARE_READ16_MEMBER( wtcnt_r );
|
||||
DECLARE_WRITE16_MEMBER( wtcnt_w );
|
||||
DECLARE_READ16_MEMBER( rstcsr_r );
|
||||
DECLARE_WRITE16_MEMBER( rstcsr_w );
|
||||
|
||||
// misc
|
||||
DECLARE_READ8_MEMBER( sbycr_r );
|
||||
DECLARE_WRITE8_MEMBER( sbycr_w );
|
||||
DECLARE_READ8_MEMBER( ccr_r );
|
||||
DECLARE_WRITE8_MEMBER( ccr_w );
|
||||
|
||||
// BSC
|
||||
DECLARE_READ32_MEMBER( bcr1_r );
|
||||
DECLARE_WRITE32_MEMBER( bcr1_w );
|
||||
DECLARE_READ32_MEMBER( bcr2_r );
|
||||
DECLARE_WRITE32_MEMBER( bcr2_w );
|
||||
DECLARE_READ32_MEMBER( wcr_r );
|
||||
DECLARE_WRITE32_MEMBER( wcr_w );
|
||||
DECLARE_READ32_MEMBER( mcr_r );
|
||||
DECLARE_WRITE32_MEMBER( mcr_w );
|
||||
DECLARE_READ32_MEMBER( rtcsr_r );
|
||||
DECLARE_WRITE32_MEMBER( rtcsr_w );
|
||||
DECLARE_READ32_MEMBER( rtcor_r );
|
||||
DECLARE_WRITE32_MEMBER( rtcor_w );
|
||||
DECLARE_READ32_MEMBER( rtcnt_r );
|
||||
DECLARE_WRITE32_MEMBER( rtcnt_w );
|
||||
|
||||
|
||||
virtual void set_frt_input(int state) override;
|
||||
void sh2_notify_dma_data_available();
|
||||
void func_fastirq();
|
||||
@ -128,11 +259,58 @@ private:
|
||||
int8_t m_irq_line_state[17];
|
||||
|
||||
address_space *m_internal;
|
||||
uint32_t m_m[0x200/4];
|
||||
// SCI
|
||||
uint8_t m_smr, m_brr, m_scr, m_tdr, m_ssr;
|
||||
// FRT / FRC
|
||||
uint8_t m_tier, m_ftcsr, m_frc_tcr, m_tocr;
|
||||
uint16_t m_frc;
|
||||
uint16_t m_ocra, m_ocrb, m_frc_icr;
|
||||
// INTC
|
||||
struct {
|
||||
uint8_t frc;
|
||||
uint8_t sci;
|
||||
uint8_t divu;
|
||||
uint8_t dmac;
|
||||
uint8_t wdt;
|
||||
} m_irq_level;
|
||||
struct {
|
||||
uint8_t fic;
|
||||
uint8_t foc;
|
||||
uint8_t fov;
|
||||
uint8_t divu;
|
||||
uint8_t dmac[2];
|
||||
} m_irq_vector;
|
||||
uint16_t m_ipra, m_iprb;
|
||||
uint16_t m_vcra, m_vcrb, m_vcrc, m_vcrd, m_vcrwdt, m_vcrdiv, m_intc_icr, m_vcrdma[2];
|
||||
bool m_vecmd, m_nmie;
|
||||
|
||||
// DIVU
|
||||
bool m_divu_ovf, m_divu_ovfie;
|
||||
uint32_t m_dvsr, m_dvdntl, m_dvdnth;
|
||||
|
||||
// WTC
|
||||
uint8_t m_wtcnt, m_wtcsr;
|
||||
uint8_t m_rstcsr;
|
||||
uint16_t m_wtcw[2];
|
||||
|
||||
// DMAC
|
||||
struct {
|
||||
uint8_t drcr;
|
||||
uint32_t sar;
|
||||
uint32_t dar;
|
||||
uint32_t tcr;
|
||||
uint32_t chcr;
|
||||
} m_dmac[2];
|
||||
uint8_t m_dmaor;
|
||||
|
||||
// misc
|
||||
uint8_t m_sbycr, m_ccr;
|
||||
|
||||
// BSC
|
||||
uint32_t m_bcr1, m_bcr2, m_wcr, m_mcr, m_rtcsr, m_rtcor, m_rtcnt;
|
||||
|
||||
int8_t m_nmi_line_state;
|
||||
|
||||
uint16_t m_frc;
|
||||
uint16_t m_ocra, m_ocrb, m_icr;
|
||||
uint64_t m_frc_base;
|
||||
|
||||
int m_frt_input;
|
||||
@ -150,8 +328,6 @@ private:
|
||||
uint32_t m_active_dma_src[2];
|
||||
uint32_t m_active_dma_dst[2];
|
||||
uint32_t m_active_dma_count[2];
|
||||
uint16_t m_wtcnt;
|
||||
uint8_t m_wtcsr;
|
||||
|
||||
int m_is_slave;
|
||||
dma_kludge_delegate m_dma_kludge_cb;
|
||||
@ -181,7 +357,7 @@ private:
|
||||
TIMER_CALLBACK_MEMBER( sh2_dma_current_active_callback );
|
||||
void sh2_timer_resync();
|
||||
void sh2_timer_activate();
|
||||
void sh2_do_dma(int dma);
|
||||
void sh2_do_dma(int dmach);
|
||||
virtual void sh2_exception(const char *message, int irqline) override;
|
||||
void sh2_dmac_check(int dma);
|
||||
void sh2_recalc_irq();
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -15,10 +15,11 @@
|
||||
|
||||
enum
|
||||
{
|
||||
ICF = 0x00800000,
|
||||
OCFA = 0x00080000,
|
||||
OCFB = 0x00040000,
|
||||
OVF = 0x00020000
|
||||
ICF = 0x80,
|
||||
OCFA = 0x08,
|
||||
OCFB = 0x04,
|
||||
OVF = 0x02,
|
||||
CCLRA = 0x01
|
||||
};
|
||||
|
||||
#define SH12_AM 0xc7ffffff
|
||||
|
Loading…
Reference in New Issue
Block a user