bugfixes, new config system and messed code for it

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@393 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2008-03-24 23:11:47 +00:00
parent c46ffd310f
commit 1ca2ea4f60
16 changed files with 352 additions and 192 deletions

View file

@ -4,8 +4,6 @@
#define u32 unsigned int
static u32 *block_table[0x5090/2];
static u32 *block_table_iram[15][0x800/2];
static u32 *tcache_ptr = NULL;
static int nblocks = 0;
@ -21,7 +19,9 @@ extern ssp1601_t *ssp;
#ifndef ARM
#define DUMP_BLOCK 0x0c9a
unsigned int tcache[512*1024];
u32 *ssp_block_table[0x5090/2];
u32 *ssp_block_table_iram[15][0x800/2];
u32 tcache[SSP_TCACHE_SIZE/4];
void ssp_drc_next(void){}
void ssp_drc_next_patch(void){}
void ssp_drc_end(void){}
@ -1676,7 +1676,7 @@ static void emit_block_epilogue(int cycles, int cond, int pc, int end_pc)
emit_jump(A_COND_AL, ssp_drc_next);
}
else if (cond == A_COND_AL) {
u32 *target = (pc < 0x400) ? block_table_iram[ssp->drc.iram_context][pc] : block_table[pc];
u32 *target = (pc < 0x400) ? ssp_block_table_iram[ssp->drc.iram_context][pc] : ssp_block_table[pc];
if (target != NULL)
emit_jump(A_COND_AL, target);
else {
@ -1686,8 +1686,8 @@ static void emit_block_epilogue(int cycles, int cond, int pc, int end_pc)
}
}
else {
u32 *target1 = (pc < 0x400) ? block_table_iram[ssp->drc.iram_context][pc] : block_table[pc];
u32 *target2 = (end_pc < 0x400) ? block_table_iram[ssp->drc.iram_context][end_pc] : block_table[end_pc];
u32 *target1 = (pc < 0x400) ? ssp_block_table_iram[ssp->drc.iram_context][pc] : ssp_block_table[pc];
u32 *target2 = (end_pc < 0x400) ? ssp_block_table_iram[ssp->drc.iram_context][end_pc] : ssp_block_table[end_pc];
if (target1 != NULL)
emit_jump(cond, target1);
else emit_call(cond, ssp_drc_next_patch);
@ -1743,7 +1743,7 @@ void *ssp_translate_block(int pc)
tr_flush_dirty_pmcrs();
emit_block_epilogue(ccount, end_cond, jump_pc, pc);
if (tcache_ptr - tcache > TCACHE_SIZE/4) {
if (tcache_ptr - tcache > SSP_TCACHE_SIZE/4) {
printf("tcache overflow!\n");
fflush(stdout);
exit(1);
@ -1780,9 +1780,9 @@ static void ssp1601_state_load(void)
int ssp1601_dyn_startup(void)
{
memset(tcache, 0, TCACHE_SIZE);
memset(block_table, 0, sizeof(block_table));
memset(block_table_iram, 0, sizeof(block_table_iram));
memset(tcache, 0, SSP_TCACHE_SIZE);
memset(ssp_block_table, 0, sizeof(ssp_block_table));
memset(ssp_block_table_iram, 0, sizeof(ssp_block_table_iram));
tcache_ptr = tcache;
PicoLoadStateHook = ssp1601_state_load;
@ -1790,14 +1790,14 @@ int ssp1601_dyn_startup(void)
n_in_ops = 0;
#ifdef ARM
// hle'd blocks
block_table[0x800/2] = (void *) ssp_hle_800;
block_table[0x902/2] = (void *) ssp_hle_902;
block_table_iram[ 7][0x030/2] = (void *) ssp_hle_07_030;
block_table_iram[ 7][0x036/2] = (void *) ssp_hle_07_036;
block_table_iram[ 7][0x6d6/2] = (void *) ssp_hle_07_6d6;
block_table_iram[11][0x12c/2] = (void *) ssp_hle_11_12c;
block_table_iram[11][0x384/2] = (void *) ssp_hle_11_384;
block_table_iram[11][0x38a/2] = (void *) ssp_hle_11_38a;
ssp_block_table[0x800/2] = (void *) ssp_hle_800;
ssp_block_table[0x902/2] = (void *) ssp_hle_902;
ssp_block_table_iram[ 7][0x030/2] = (void *) ssp_hle_07_030;
ssp_block_table_iram[ 7][0x036/2] = (void *) ssp_hle_07_036;
ssp_block_table_iram[ 7][0x6d6/2] = (void *) ssp_hle_07_6d6;
ssp_block_table_iram[11][0x12c/2] = (void *) ssp_hle_11_12c;
ssp_block_table_iram[11][0x384/2] = (void *) ssp_hle_11_384;
ssp_block_table_iram[11][0x38a/2] = (void *) ssp_hle_11_38a;
#endif
return 0;
@ -1814,12 +1814,12 @@ void ssp1601_dyn_reset(ssp1601_t *ssp)
fclose(f);
for (i = 0; i < 0x5090/2; i++)
if (block_table[i])
printf("%06x -> __:%04x\n", (block_table[i] - tcache)*4, i<<1);
if (ssp_block_table[i])
printf("%06x -> __:%04x\n", (ssp_block_table[i] - tcache)*4, i<<1);
for (u = 1; u < 15; u++)
for (i = 0; i < 0x800/2; i++)
if (block_table_iram[u][i])
printf("%06x -> %02i:%04x\n", (block_table_iram[u][i] - tcache)*4, u, i<<1);
if (ssp_block_table_iram[u][i])
printf("%06x -> %02i:%04x\n", (ssp_block_table_iram[u][i] - tcache)*4, u, i<<1);
}
ssp1601_reset(ssp);
@ -1829,8 +1829,8 @@ void ssp1601_dyn_reset(ssp1601_t *ssp)
ssp->drc.ptr_rom = (u32) Pico.rom;
ssp->drc.ptr_iram_rom = (u32) svp->iram_rom;
ssp->drc.ptr_dram = (u32) svp->dram;
ssp->drc.ptr_btable = (u32) block_table;
ssp->drc.ptr_btable_iram = (u32) block_table_iram;
ssp->drc.ptr_btable = (u32) ssp_block_table;
ssp->drc.ptr_btable_iram = (u32) ssp_block_table_iram;
// prevent new versions of IRAM from appearing
memset(svp->iram_rom, 0, 0x800);

View file

@ -1,6 +1,12 @@
#define TCACHE_SIZE (1024*1024)
#define SSP_TCACHE_SIZE (512*1024)
#define SSP_BLOCKTAB_SIZE (0x5090/2*4)
#define SSP_BLOCKTAB_IRAM_SIZE (15*0x800/2*4)
#define SSP_BLOCKTAB_ALIGN_SIZE 3808
#define SSP_DRC_SIZE (SSP_TCACHE_SIZE + SSP_BLOCKTAB_SIZE + SSP_BLOCKTAB_IRAM_SIZE + SSP_BLOCKTAB_ALIGN_SIZE)
extern unsigned int tcache[];
extern unsigned int tcache[SSP_TCACHE_SIZE/4];
extern unsigned int *ssp_block_table[0x5090/2];
extern unsigned int *ssp_block_table_iram[15][0x800/2];
int ssp_drc_entry(int cycles);
void ssp_drc_next(void);

View file

@ -5,6 +5,8 @@
.endif
.global tcache
.global ssp_block_table
.global ssp_block_table_iram
.global flush_inval_caches
.global ssp_drc_entry
@ -20,12 +22,19 @@
.global ssp_hle_11_384
.global ssp_hle_11_38a
@ translation cache buffer
@ translation cache buffer + pointer table
.text
.align 12 @ 4096
.size tcache, TCACHE_SIZE
.size tcache, SSP_TCACHE_SIZE
.size ssp_block_table, SSP_BLOCKTAB_SIZE
.size ssp_block_table_iram, SSP_BLOCKTAB_IRAM_SIZE
tcache:
.space TCACHE_SIZE
.space SSP_TCACHE_SIZE
ssp_block_table:
.space SSP_BLOCKTAB_SIZE
ssp_block_table_iram:
.space SSP_BLOCKTAB_IRAM_SIZE
.space SSP_BLOCKTAB_ALIGN_SIZE
.text

View file

@ -14,6 +14,7 @@
svp_t *svp = NULL;
int PicoSVPCycles = 820; // cycles/line, just a guess
static int svp_dyn_ready = 0;
/* save state stuff */
typedef enum {
@ -37,17 +38,17 @@ static void PicoSVPReset(void)
memcpy(svp->iram_rom + 0x800, Pico.rom + 0x800, 0x20000 - 0x800);
ssp1601_reset(&svp->ssp1601);
if (!(PicoOpt&0x20000))
if ((PicoOpt&0x20000) && svp_dyn_ready)
ssp1601_dyn_reset(&svp->ssp1601);
}
static void PicoSVPLine(int count)
{
if (PicoOpt&0x20000)
ssp1601_run(PicoSVPCycles * count);
else
if ((PicoOpt&0x20000) && svp_dyn_ready)
ssp1601_dyn_run(PicoSVPCycles * count);
else
ssp1601_run(PicoSVPCycles * count);
// test mode
//if (Pico.m.frame_count == 13) PicoPad[0] |= 0xff;
@ -83,7 +84,7 @@ void PicoSVPInit(void)
{
#ifdef __GP2X__
int ret;
ret = munmap(tcache, TCACHE_SIZE);
ret = munmap(tcache, SSP_DRC_SIZE);
printf("munmap tcache: %i\n", ret);
#endif
}
@ -111,19 +112,21 @@ void PicoSVPStartup(void)
return;
}
//PicoOpt |= 0x20000;
//PicoOpt &= ~0x20000;
Pico.rom = tmp;
svp = (void *) ((char *)tmp + 0x200000);
memset(svp, 0, sizeof(*svp));
#ifdef __GP2X__
tmp = mmap(tcache, TCACHE_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
tmp = mmap(tcache, SSP_DRC_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
printf("mmap tcache: %p, asked %p\n", tmp, tcache);
#endif
// init SVP compiler
if (!(PicoOpt&0x20000)) {
svp_dyn_ready = 0;
if (PicoOpt&0x20000) {
if (ssp1601_dyn_startup()) return;
svp_dyn_ready = 1;
}
// init ok, setup hooks..