mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00
32x: start reworking sheduling
This commit is contained in:
parent
9b5713af95
commit
ed4402a7df
17 changed files with 180 additions and 163 deletions
|
@ -2978,13 +2978,12 @@ void sh2_drc_wcheck_da(unsigned int a, int val, int cpuid)
|
|||
1 + cpuid, SH2_DRCBLK_DA_SHIFT, 0xfff);
|
||||
}
|
||||
|
||||
void sh2_execute(SH2 *sh2c, int cycles)
|
||||
int sh2_execute(SH2 *sh2c, int cycles)
|
||||
{
|
||||
int ret_cycles;
|
||||
sh2 = sh2c; // XXX
|
||||
|
||||
sh2c->cycles_aim += cycles;
|
||||
cycles = sh2c->cycles_aim - sh2c->cycles_done;
|
||||
sh2c->cycles_timeslice = cycles;
|
||||
|
||||
// cycles are kept in SHR_SR unused bits (upper 20)
|
||||
// bit19 contains T saved for delay slot
|
||||
|
@ -2998,7 +2997,7 @@ void sh2_execute(SH2 *sh2c, int cycles)
|
|||
if (ret_cycles > 0)
|
||||
dbg(1, "warning: drc returned with cycles: %d", ret_cycles);
|
||||
|
||||
sh2c->cycles_done += cycles - ret_cycles;
|
||||
return sh2c->cycles_timeslice - ret_cycles;
|
||||
}
|
||||
|
||||
#if (DRC_DEBUG & 2)
|
||||
|
|
|
@ -61,14 +61,15 @@ static unsigned int op_refs[0x10000];
|
|||
|
||||
#ifndef DRC_SH2
|
||||
|
||||
void sh2_execute(SH2 *sh2_, int cycles)
|
||||
int sh2_execute(SH2 *sh2_, int cycles)
|
||||
{
|
||||
sh2 = sh2_;
|
||||
sh2->cycles_aim += cycles;
|
||||
sh2->icount = cycles = sh2->cycles_aim - sh2->cycles_done;
|
||||
sh2->icount = cycles;
|
||||
|
||||
if (sh2->icount <= 0)
|
||||
return;
|
||||
return cycles;
|
||||
|
||||
sh2->cycles_timeslice = cycles;
|
||||
|
||||
do
|
||||
{
|
||||
|
@ -122,7 +123,7 @@ void sh2_execute(SH2 *sh2_, int cycles)
|
|||
}
|
||||
while (sh2->icount > 0 || sh2->delay); /* can't interrupt before delay */
|
||||
|
||||
sh2->cycles_done += cycles - sh2->icount;
|
||||
return sh2->cycles_timeslice - sh2->icount;
|
||||
}
|
||||
|
||||
#else // DRC_SH2
|
||||
|
|
|
@ -20,7 +20,7 @@ int sh2_init(SH2 *sh2, int is_slave)
|
|||
{
|
||||
int ret = 0;
|
||||
|
||||
memset(sh2, 0, sizeof(*sh2));
|
||||
memset(sh2, 0, offsetof(SH2, mult_m68k_to_sh2));
|
||||
sh2->is_slave = is_slave;
|
||||
pdb_register_cpu(sh2, PDBCT_SH2, is_slave ? "ssh2" : "msh2");
|
||||
#ifdef DRC_SH2
|
||||
|
@ -59,7 +59,7 @@ void sh2_do_irq(SH2 *sh2, int level, int vector)
|
|||
sh2->pc = p32x_sh2_read32(sh2->vbr + vector * 4, sh2);
|
||||
|
||||
/* 13 cycles at best */
|
||||
sh2->cycles_done += 13;
|
||||
sh2->m68krcycles_done += C_SH2_TO_M68K(*sh2, 13);
|
||||
// sh2->icount -= 13;
|
||||
}
|
||||
|
||||
|
@ -105,8 +105,6 @@ void sh2_pack(const SH2 *sh2, unsigned char *buff)
|
|||
|
||||
p[0] = sh2->pending_int_irq;
|
||||
p[1] = sh2->pending_int_vector;
|
||||
p[2] = sh2->cycles_aim;
|
||||
p[3] = sh2->cycles_done;
|
||||
}
|
||||
|
||||
void sh2_unpack(SH2 *sh2, const unsigned char *buff)
|
||||
|
@ -118,7 +116,5 @@ void sh2_unpack(SH2 *sh2, const unsigned char *buff)
|
|||
|
||||
sh2->pending_int_irq = p[0];
|
||||
sh2->pending_int_vector = p[1];
|
||||
sh2->cycles_aim = p[2];
|
||||
sh2->cycles_done = p[3];
|
||||
}
|
||||
|
||||
|
|
|
@ -52,10 +52,20 @@ typedef struct SH2_
|
|||
int REGPARM(2) (*irq_callback)(struct SH2_ *sh2, int level);
|
||||
int is_slave;
|
||||
|
||||
unsigned int cycles_aim; // subtract sh2_icount to get global counter
|
||||
unsigned int cycles_done;
|
||||
unsigned int cycles_timeslice;
|
||||
|
||||
// we use 68k reference cycles for easier sync
|
||||
unsigned int m68krcycles_done;
|
||||
unsigned int mult_m68k_to_sh2;
|
||||
unsigned int mult_sh2_to_m68k;
|
||||
} SH2;
|
||||
|
||||
#define CYCLE_MULT_SHIFT 10
|
||||
#define C_M68K_TO_SH2(xsh2, c) \
|
||||
((int)((c) * (xsh2).mult_m68k_to_sh2) >> CYCLE_MULT_SHIFT)
|
||||
#define C_SH2_TO_M68K(xsh2, c) \
|
||||
((int)((c + 3) * (xsh2).mult_sh2_to_m68k) >> CYCLE_MULT_SHIFT)
|
||||
|
||||
extern SH2 *sh2; // active sh2. XXX: consider removing
|
||||
|
||||
int sh2_init(SH2 *sh2, int is_slave);
|
||||
|
@ -67,7 +77,7 @@ void sh2_do_irq(SH2 *sh2, int level, int vector);
|
|||
void sh2_pack(const SH2 *sh2, unsigned char *buff);
|
||||
void sh2_unpack(SH2 *sh2, const unsigned char *buff);
|
||||
|
||||
void sh2_execute(SH2 *sh2, int cycles);
|
||||
int sh2_execute(SH2 *sh2, int cycles);
|
||||
|
||||
// regs, pending_int*, cycles, reserved
|
||||
#define SH2_STATE_SIZE ((24 + 2 + 2 + 12) * 4)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue