sh2.cpp: first pass over SH7604 SoC refactoring [Angelo Salese]

* Fixed division unit overflow flag clearance;
This commit is contained in:
Angelo Salese 2019-06-21 20:54:43 +02:00
parent fb50043856
commit d6b22fa2c0
4 changed files with 1021 additions and 428 deletions

View File

@ -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);

View File

@ -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

View File

@ -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