mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-10-26 16:29:37 -04:00
sh2: sync sh2 core with latest mame
This commit is contained in:
parent
009ef50c60
commit
f4c0720c24
7 changed files with 594 additions and 576 deletions
|
|
@ -454,8 +454,8 @@ static u32 p32x_sh2reg_read16(u32 a, int cpuid)
|
|||
case 0x00: // adapter/irq ctl
|
||||
return (r[0] & P32XS_FM) | Pico32x.sh2_regs[0] | Pico32x.sh2irq_mask[cpuid];
|
||||
case 0x04: // H count (often as comm too)
|
||||
if (p32x_poll_detect(&sh2_poll[cpuid], a, ash2_cycles_done(), 0))
|
||||
ash2_end_run(8);
|
||||
if (p32x_poll_detect(&sh2_poll[cpuid], a, ash2_cycles_done(&sh2s[cpuid]), 0))
|
||||
ash2_end_run(&sh2s[cpuid], 8);
|
||||
return Pico32x.sh2_regs[4 / 2];
|
||||
case 0x10: // DREQ len
|
||||
return r[a / 2];
|
||||
|
|
@ -469,8 +469,8 @@ static u32 p32x_sh2reg_read16(u32 a, int cpuid)
|
|||
int comreg = 1 << (a & 0x0f) / 2;
|
||||
if (Pico32x.comm_dirty_68k & comreg)
|
||||
Pico32x.comm_dirty_68k &= ~comreg;
|
||||
else if (p32x_poll_detect(&sh2_poll[cpuid], a, ash2_cycles_done(), 0))
|
||||
ash2_end_run(8);
|
||||
else if (p32x_poll_detect(&sh2_poll[cpuid], a, ash2_cycles_done(&sh2s[cpuid]), 0))
|
||||
ash2_end_run(&sh2s[cpuid], 8);
|
||||
return r[a / 2];
|
||||
}
|
||||
if ((a & 0x30) == 0x30) {
|
||||
|
|
@ -695,7 +695,7 @@ static void sh2_peripheral_write32(u32 a, u32 d, int id)
|
|||
dmac0->tcr0 &= 0xffffff;
|
||||
|
||||
// HACK: assume 68k starts writing soon and end the timeslice
|
||||
ash2_end_run(16);
|
||||
ash2_end_run(&sh2s[id], 16);
|
||||
|
||||
// DREQ is only sent after first 4 words are written.
|
||||
// we do multiple of 4 words to avoid messing up alignment
|
||||
|
|
@ -1016,8 +1016,8 @@ static u32 sh2_read8_cs0(u32 a, int id)
|
|||
|
||||
if ((a & 0x3ff00) == 0x4100) {
|
||||
d = p32x_vdp_read16(a);
|
||||
if (p32x_poll_detect(&sh2_poll[id], a, ash2_cycles_done(), 1))
|
||||
ash2_end_run(8);
|
||||
if (p32x_poll_detect(&sh2_poll[id], a, ash2_cycles_done(&sh2s[id]), 1))
|
||||
ash2_end_run(&sh2s[id], 8);
|
||||
goto out_16to8;
|
||||
}
|
||||
|
||||
|
|
@ -1071,8 +1071,8 @@ static u32 sh2_read16_cs0(u32 a, int id)
|
|||
|
||||
if ((a & 0x3ff00) == 0x4100) {
|
||||
d = p32x_vdp_read16(a);
|
||||
if (p32x_poll_detect(&sh2_poll[id], a, ash2_cycles_done(), 1))
|
||||
ash2_end_run(8);
|
||||
if (p32x_poll_detect(&sh2_poll[id], a, ash2_cycles_done(&sh2s[id]), 1))
|
||||
ash2_end_run(&sh2s[id], 8);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -237,23 +237,23 @@ extern SH2 sh2s[2];
|
|||
#define ssh2 sh2s[1]
|
||||
|
||||
#ifndef DRC_SH2
|
||||
# define ash2_end_run(after) do { \
|
||||
if (sh2->icount > (after)) { \
|
||||
sh2->cycles_timeslice -= sh2->icount; \
|
||||
sh2->icount = after; \
|
||||
# define ash2_end_run(sh2, after) do { \
|
||||
if ((sh2)->icount > (after)) { \
|
||||
(sh2)->cycles_timeslice -= (sh2)->icount; \
|
||||
(sh2)->icount = after; \
|
||||
} \
|
||||
} while (0)
|
||||
# define ash2_cycles_done() (sh2->cycles_timeslice - sh2->icount)
|
||||
# define ash2_cycles_done(sh2) ((sh2)->cycles_timeslice - (sh2)->icount)
|
||||
#else
|
||||
# define ash2_end_run(after) do { \
|
||||
int left = sh2->sr >> 12; \
|
||||
# define ash2_end_run(sh2, after) do { \
|
||||
int left = (sh2)->sr >> 12; \
|
||||
if (left > (after)) { \
|
||||
sh2->cycles_timeslice -= left; \
|
||||
sh2->sr &= 0xfff; \
|
||||
sh2->sr |= (after) << 12; \
|
||||
(sh2)->cycles_timeslice -= left; \
|
||||
(sh2)->sr &= 0xfff; \
|
||||
(sh2)->sr |= (after) << 12; \
|
||||
} \
|
||||
} while (0)
|
||||
# define ash2_cycles_done() (sh2->cycles_timeslice - (sh2->sr >> 12))
|
||||
# define ash2_cycles_done(sh2) ((sh2)->cycles_timeslice - ((sh2)->sr >> 12))
|
||||
#endif
|
||||
|
||||
//#define sh2_pc(c) (c) ? ssh2.ppc : msh2.ppc
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue