mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-06 23:58:04 -04:00
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:
parent
c46ffd310f
commit
1ca2ea4f60
16 changed files with 352 additions and 192 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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..
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue