summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-06-27 19:34:10 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-06-27 19:34:10 +0200
commit054be7fb7a39dc2e9162b9f4a13bf17f2c3360d3 (patch)
tree76a7e5bfc829fe01cf558845f2a99f8502893950 /plugins
parent1b1de373ca8e27882d8123757dd55d0e15200807 (diff)
ao psf/psf2/spu reentrancy WIP
Diffstat (limited to 'plugins')
-rw-r--r--plugins/ao/eng_psf/eng_psf.c66
-rw-r--r--plugins/ao/eng_psf/eng_psf2.c60
-rw-r--r--plugins/ao/eng_psf/eng_spu.c42
-rw-r--r--plugins/ao/eng_psf/peops/dma.c11
-rw-r--r--plugins/ao/eng_psf/peops/dma.h9
-rw-r--r--plugins/ao/eng_psf/peops/registers.c4
-rw-r--r--plugins/ao/eng_psf/peops/regs.h4
-rw-r--r--plugins/ao/eng_psf/peops/spu.c22
-rw-r--r--plugins/ao/eng_psf/peops/spu.h22
-rw-r--r--plugins/ao/eng_psf/peops2/dma2.c31
-rw-r--r--plugins/ao/eng_psf/peops2/registers2.c13
-rw-r--r--plugins/ao/eng_psf/peops2/regs.h2
-rw-r--r--plugins/ao/eng_psf/peops2/spu.h16
-rw-r--r--plugins/ao/eng_psf/peops2/spu2.c37
-rw-r--r--plugins/ao/eng_psf/psx.h35
-rw-r--r--plugins/ao/eng_psf/psx_hw.c312
16 files changed, 347 insertions, 339 deletions
diff --git a/plugins/ao/eng_psf/eng_psf.c b/plugins/ao/eng_psf/eng_psf.c
index 74b6528a..d37a553f 100644
--- a/plugins/ao/eng_psf/eng_psf.c
+++ b/plugins/ao/eng_psf/eng_psf.c
@@ -44,24 +44,25 @@
#define DEBUG_LOADER (0)
-char *spu_pOutput; // hack!
int psf_refresh = -1; // hack
typedef struct {
corlett_t *c;
char psfby[256];
mips_cpu_context *mips_cpu;
+ char *spu_pOutput;
} psf_synth_t;
-// main RAM
-extern uint32 psx_ram[((2*1024*1024)/4)+4];
-extern uint32 psx_scratch[0x400];
-extern uint32 initial_ram[((2*1024*1024)/4)+4];
-extern uint32 initial_scratch[0x400];
static uint32 initialPC, initialGP, initialSP;
extern void setlength(int32 stop, int32 fade);
+static void spu_update (unsigned char* pSound,long lBytes,void *data)
+{
+ psf_synth_t *s = data;
+ memcpy(s->spu_pOutput, pSound, lBytes);
+}
+
void *psf_start(uint8 *buffer, uint32 length)
{
psf_synth_t *s = malloc (sizeof (psf_synth_t));
@@ -74,9 +75,6 @@ void *psf_start(uint8 *buffer, uint32 length)
int i;
union cpuinfo mipsinfo;
- // clear PSX work RAM before we start scribbling in it
- memset(psx_ram, 0, 2*1024*1024);
-
// printf("Length = %d\n", length);
// Decode the current GSF
@@ -121,6 +119,7 @@ void *psf_start(uint8 *buffer, uint32 length)
printf("Top level: PC %x GP %x SP %x\n", PC, GP, SP);
#endif
+ s->mips_cpu = mips_alloc();
// Get the library file, if any
if (s->c->lib[0] != 0)
{
@@ -191,7 +190,7 @@ void *psf_start(uint8 *buffer, uint32 length)
#if DEBUG_LOADER
printf("library offset: %x plength: %d\n", offset, plength);
#endif
- memcpy(&psx_ram[offset/4], lib_decoded+2048, plength);
+ memcpy(&s->mips_cpu->psx_ram[offset/4], lib_decoded+2048, plength);
// Dispose the corlett structure for the lib - we don't use it
free(lib);
@@ -207,7 +206,7 @@ void *psf_start(uint8 *buffer, uint32 length)
{
plength = file_len-2048;
}
- memcpy(&psx_ram[offset/4], file+2048, plength);
+ memcpy(&s->mips_cpu->psx_ram[offset/4], file+2048, plength);
// load any auxiliary libraries now
for (i = 0; i < 8; i++)
@@ -257,7 +256,7 @@ void *psf_start(uint8 *buffer, uint32 length)
offset = alib_decoded[0x18] | alib_decoded[0x19]<<8 | alib_decoded[0x1a]<<16 | alib_decoded[0x1b]<<24;
offset &= 0x3fffffff; // kill any MIPS cache segment indicators
plength = alib_decoded[0x1c] | alib_decoded[0x1d]<<8 | alib_decoded[0x1e]<<16 | alib_decoded[0x1f]<<24;
- memcpy(&psx_ram[offset/4], alib_decoded+2048, plength);
+ memcpy(&s->mips_cpu->psx_ram[offset/4], alib_decoded+2048, plength);
// Dispose the corlett structure for the lib - we don't use it
free(lib);
@@ -279,9 +278,11 @@ void *psf_start(uint8 *buffer, uint32 length)
}
}
- s->mips_cpu = mips_alloc();
mips_init (s->mips_cpu);
mips_reset(s->mips_cpu, NULL);
+// // clear PSX work RAM before we start scribbling in it
+// memset(s->mips_cpu->psx_ram, 0, 2*1024*1024);
+
// set the initial PC, SP, GP
#if DEBUG_LOADER
@@ -315,8 +316,8 @@ void *psf_start(uint8 *buffer, uint32 length)
#endif
psx_hw_init(s->mips_cpu);
- SPUinit();
- SPUopen();
+ SPUinit(s->mips_cpu, spu_update, s);
+ SPUopen(s->mips_cpu);
lengthMS = psfTimeToMS(s->c->inf_length);
fadeMS = psfTimeToMS(s->c->inf_fade);
@@ -339,11 +340,11 @@ void *psf_start(uint8 *buffer, uint32 length)
{
if (!strcmp(s->c->inf_game, "Chocobo Dungeon 2"))
{
- if (psx_ram[0xbc090/4] == LE32(0x0802f040))
+ if (s->mips_cpu->psx_ram[0xbc090/4] == LE32(0x0802f040))
{
- psx_ram[0xbc090/4] = LE32(0);
- psx_ram[0xbc094/4] = LE32(0x0802f040);
- psx_ram[0xbc098/4] = LE32(0);
+ s->mips_cpu->psx_ram[0xbc090/4] = LE32(0);
+ s->mips_cpu->psx_ram[0xbc094/4] = LE32(0x0802f040);
+ s->mips_cpu->psx_ram[0xbc098/4] = LE32(0);
}
}
}
@@ -351,8 +352,8 @@ void *psf_start(uint8 *buffer, uint32 length)
// psx_ram[0x118b8/4] = LE32(0); // crash 2 hack
// backup the initial state for restart
- memcpy(initial_ram, psx_ram, 2*1024*1024);
- memcpy(initial_scratch, psx_scratch, 0x400);
+ memcpy(s->mips_cpu->initial_ram, s->mips_cpu->psx_ram, 2*1024*1024);
+ memcpy(s->mips_cpu->initial_scratch, s->mips_cpu->psx_scratch, 0x400);
initialPC = PC;
initialGP = GP;
initialSP = SP;
@@ -362,11 +363,6 @@ void *psf_start(uint8 *buffer, uint32 length)
return s;
}
-void spu_update (unsigned char* pSound,long lBytes)
-{
- memcpy(spu_pOutput, pSound, lBytes);
-}
-
int32 psf_gen(void *handle, int16 *buffer, uint32 samples)
{
psf_synth_t *s = handle;
@@ -375,11 +371,11 @@ int32 psf_gen(void *handle, int16 *buffer, uint32 samples)
for (i = 0; i < samples; i++)
{
psx_hw_slice(s->mips_cpu);
- SPUasync(384);
+ SPUasync(s->mips_cpu, 384);
}
- spu_pOutput = (char *)buffer;
- SPU_flushboot();
+ s->spu_pOutput = (char *)buffer;
+ SPU_flushboot(s->mips_cpu);
psx_hw_frame(s->mips_cpu);
@@ -389,7 +385,7 @@ int32 psf_gen(void *handle, int16 *buffer, uint32 samples)
int32 psf_stop(void *handle)
{
psf_synth_t *s = handle;
- SPUclose();
+ SPUclose(s->mips_cpu);
free(s->c);
free (s);
@@ -405,16 +401,16 @@ int32 psf_command(void *handle, int32 command, int32 parameter)
switch (command)
{
case COMMAND_RESTART:
- SPUclose();
+ SPUclose(s->mips_cpu);
- memcpy(psx_ram, initial_ram, 2*1024*1024);
- memcpy(psx_scratch, initial_scratch, 0x400);
+ memcpy(s->mips_cpu->psx_ram, s->mips_cpu->initial_ram, 2*1024*1024);
+ memcpy(s->mips_cpu->psx_scratch, s->mips_cpu->initial_scratch, 0x400);
// mips_init();
mips_reset(s->mips_cpu, NULL);
psx_hw_init(s->mips_cpu);
- SPUinit();
- SPUopen();
+ SPUinit(s->mips_cpu, spu_update, s);
+ SPUopen(s->mips_cpu);
lengthMS = psfTimeToMS(s->c->inf_length);
fadeMS = psfTimeToMS(s->c->inf_fade);
diff --git a/plugins/ao/eng_psf/eng_psf2.c b/plugins/ao/eng_psf/eng_psf2.c
index 8db99dc5..2da270b9 100644
--- a/plugins/ao/eng_psf/eng_psf2.c
+++ b/plugins/ao/eng_psf/eng_psf2.c
@@ -68,10 +68,7 @@
#define ELF32_R_TYPE(val) ((val) & 0xff)
// main RAM
-extern uint32 psx_ram[(2*1024*1024)/4];
-extern uint32 initial_ram[(2*1024*1024)/4];
static uint32 loadAddr, lengthMS, fadeMS;
-static char *spu_pOutput;
static uint8 *filesys[MAX_FS];
static uint32 fssize[MAX_FS];
static int num_fs;
@@ -83,10 +80,18 @@ typedef struct {
uint8 *lib_raw_file;
mips_cpu_context *mips_cpu;
+ char *spu_pOutput;
} psf2_synth_t;
extern void setlength2(int32 stop, int32 fade);
+void ps2_update(unsigned char *pSound, long lBytes, void *data)
+{
+ psf2_synth_t *s = data;
+ memcpy(s->spu_pOutput, pSound, lBytes); // (for direct 44.1kHz output)
+}
+
+#if 0
static uint32 secname(uint8 *start, uint32 strndx, uint32 shoff, uint32 shentsize, uint32 name)
{
uint32 offset, shent;
@@ -101,6 +106,7 @@ static uint32 secname(uint8 *start, uint32 strndx, uint32 shoff, uint32 shentsiz
return offset;
}
+#endif
static void do_iopmod(uint8 *start, uint32 offset)
{
@@ -179,7 +185,7 @@ uint32 psf2_load_elf(mips_cpu_context *cpu, uint8 *start, uint32 len)
break;
case 1: // PROGBITS: copy data to destination
- memcpy(&psx_ram[(loadAddr + addr)/4], &start[offset], size);
+ memcpy(&cpu->psx_ram[(loadAddr + addr)/4], &start[offset], size);
totallen += size;
break;
@@ -190,7 +196,7 @@ uint32 psf2_load_elf(mips_cpu_context *cpu, uint8 *start, uint32 len)
break;
case 8: // NOBITS: BSS region, zero out destination
- memset(&psx_ram[(loadAddr + addr)/4], 0, size);
+ memset(&cpu->psx_ram[(loadAddr + addr)/4], 0, size);
totallen += size;
break;
@@ -202,7 +208,7 @@ uint32 psf2_load_elf(mips_cpu_context *cpu, uint8 *start, uint32 len)
offs = start[offset+(rec*8)] | start[offset+1+(rec*8)]<<8 | start[offset+2+(rec*8)]<<16 | start[offset+3+(rec*8)]<<24;
info = start[offset+4+(rec*8)] | start[offset+5+(rec*8)]<<8 | start[offset+6+(rec*8)]<<16 | start[offset+7+(rec*8)]<<24;
- target = LE32(psx_ram[(loadAddr+offs)/4]);
+ target = LE32(cpu->psx_ram[(loadAddr+offs)/4]);
// printf("[%04d] offs %08x type %02x info %08x => %08x\n", rec, offs, ELF32_R_TYPE(info), ELF32_R_SYM(info), target);
@@ -241,7 +247,7 @@ uint32 psf2_load_elf(mips_cpu_context *cpu, uint8 *start, uint32 len)
val = loadAddr + vallo;
target = (target & ~0xffff) | (val & 0xffff);
- psx_ram[(loadAddr+hi16offs)/4] = LE32(hi16target);
+ cpu->psx_ram[(loadAddr+hi16offs)/4] = LE32(hi16target);
break;
default:
@@ -250,7 +256,7 @@ uint32 psf2_load_elf(mips_cpu_context *cpu, uint8 *start, uint32 len)
break;
}
- psx_ram[(loadAddr+offs)/4] = LE32(target);
+ cpu->psx_ram[(loadAddr+offs)/4] = LE32(target);
}
break;
@@ -337,7 +343,7 @@ static uint32 load_file_ex(uint8 *top, uint8 *start, uint32 len, char *file, uin
uerr = uncompress(&buf[uofs], &dlength, &top[cofs], usize);
if (uerr != Z_OK)
{
- printf("Decompress fail: %x %d!\n", dlength, uerr);
+ printf("Decompress fail: %x %d!\n", (unsigned int)dlength, uerr);
return 0xffffffff;
}
@@ -466,9 +472,6 @@ void *psf2_start(uint8 *buffer, uint32 length)
loadAddr = 0x23f00; // this value makes allocations work out similarly to how they would
// in Highly Experimental (as per Shadow Hearts' hard-coded assumptions)
- // clear IOP work RAM before we start scribbling in it
- memset(psx_ram, 0, 2*1024*1024);
-
// Decode the current PSF2
if (corlett_decode(buffer, length, &file, &file_len, &s->c) != AO_SUCCESS)
{
@@ -476,7 +479,7 @@ void *psf2_start(uint8 *buffer, uint32 length)
return NULL;
}
- if (file_len > 0) printf("ERROR: PSF2 can't have a program section! ps %08x\n", file_len);
+ if (file_len > 0) printf("ERROR: PSF2 can't have a program section! ps %08x\n", (unsigned int)file_len);
#if DEBUG_LOADER
printf("FS section: size %x\n", s->c->res_size);
@@ -572,28 +575,23 @@ void *psf2_start(uint8 *buffer, uint32 length)
mipsinfo.i = 0x80000004; // argv
mips_set_info(s->mips_cpu, CPUINFO_INT_REGISTER + MIPS_R5, &mipsinfo);
- psx_ram[1] = LE32(0x80000008);
+ s->mips_cpu->psx_ram[1] = LE32(0x80000008);
- buf = (uint8 *)&psx_ram[2];
+ buf = (uint8 *)(&s->mips_cpu->psx_ram[2]);
strcpy((char *)buf, "aofile:/");
- psx_ram[0] = LE32(FUNCT_HLECALL);
+ s->mips_cpu->psx_ram[0] = LE32(FUNCT_HLECALL);
// back up initial RAM image to quickly restart songs
- memcpy(initial_ram, psx_ram, 2*1024*1024);
+ memcpy(s->mips_cpu->initial_ram, s->mips_cpu->psx_ram, 2*1024*1024);
psx_hw_init(s->mips_cpu);
- SPU2init();
- SPU2open(NULL);
+ SPU2init(s->mips_cpu, ps2_update, s);
+ SPU2open(s->mips_cpu, NULL);
return s;
}
-void ps2_update(unsigned char *pSound, long lBytes)
-{
- memcpy(spu_pOutput, pSound, lBytes); // (for direct 44.1kHz output)
-}
-
int32 psf2_gen(void *handle, int16 *buffer, uint32 samples)
{
int i;
@@ -602,11 +600,11 @@ int32 psf2_gen(void *handle, int16 *buffer, uint32 samples)
// memset (buffer, 0, samples * 4);
// return AO_SUCCESS;
//
- spu_pOutput = (char *)buffer;
+ s->spu_pOutput = (char *)buffer;
for (i = 0; i < samples; i++)
{
- SPU2async(1);
+ SPU2async(s->mips_cpu, 1);
ps2_hw_slice(s->mips_cpu);
}
@@ -618,7 +616,7 @@ int32 psf2_gen(void *handle, int16 *buffer, uint32 samples)
int32 psf2_stop(void *handle)
{
psf2_synth_t *s = handle;
- SPU2close();
+ SPU2close(s->mips_cpu);
if (s->c->lib[0] != 0)
{
free(s->lib_raw_file);
@@ -638,15 +636,15 @@ int32 psf2_command(void *handle, int32 command, int32 parameter)
switch (command)
{
case COMMAND_RESTART:
- SPU2close();
+ SPU2close(s->mips_cpu);
- memcpy(psx_ram, initial_ram, 2*1024*1024);
+ memcpy(s->mips_cpu->psx_ram, s->mips_cpu->initial_ram, 2*1024*1024);
mips_init(s->mips_cpu);
mips_reset(s->mips_cpu, NULL);
psx_hw_init(s->mips_cpu);
- SPU2init();
- SPU2open(NULL);
+ SPU2init(s->mips_cpu, ps2_update, s);
+ SPU2open(s->mips_cpu, NULL);
mipsinfo.i = s->initialPC;
mips_set_info(s->mips_cpu, CPUINFO_INT_PC, &mipsinfo);
diff --git a/plugins/ao/eng_psf/eng_spu.c b/plugins/ao/eng_psf/eng_spu.c
index b3752f32..b27aa98d 100644
--- a/plugins/ao/eng_psf/eng_spu.c
+++ b/plugins/ao/eng_psf/eng_spu.c
@@ -40,23 +40,27 @@
#include "cpuintrf.h"
#include "psx.h"
#include "peops/externals.h"
+#include "peops/spu.h"
+#include "peops/regs.h"
-extern int SPUinit(void);
-extern int SPUopen(void);
-extern int SPUclose(void);
-extern void SPUinjectRAMImage(unsigned short *source);
extern void setlength(int32 stop, int32 fade);
-extern void SPUwriteRegister(u32 reg, u16 val);
-extern u16 SPUreadRegister(u32 reg);
typedef struct {
uint8 *start_of_file, *song_ptr;
uint32 cur_tick, cur_event, num_events, next_tick, end_tick;
int old_fmt;
char name[128], song[128], company[128];
+ char *spu_pOutput;
+ mips_cpu_context *mips_cpu;
} spu_synth_t;
-extern char *spu_pOutput; // hack!
+
+static void spu_update (unsigned char* pSound,long lBytes,void *data)
+{
+ spu_synth_t *s = data;
+ memcpy(s->spu_pOutput, pSound, lBytes);
+}
+
void *spu_start(uint8 *buffer, uint32 length)
{
@@ -74,19 +78,20 @@ void *spu_start(uint8 *buffer, uint32 length)
s->start_of_file = buffer;
- SPUinit();
- SPUopen();
+ s->mips_cpu = mips_alloc ();
+ SPUinit(s->mips_cpu, spu_update, s);
+ SPUopen(s->mips_cpu);
setlength(~0, 0);
// upload the SPU RAM image
- SPUinjectRAMImage((unsigned short *)&buffer[0]);
+ SPUinjectRAMImage(s->mips_cpu, (unsigned short *)&buffer[0]);
// apply the register image
for (i = 0; i < 512; i += 2)
{
reg = buffer[0x80000+i] | buffer[0x80000+i+1]<<8;
- SPUwriteRegister((i/2)+0x1f801c00, reg);
+ SPUwriteRegister(s->mips_cpu, (i/2)+0x1f801c00, reg);
}
s->old_fmt = 1;
@@ -127,9 +132,6 @@ void *spu_start(uint8 *buffer, uint32 length)
return s;
}
-extern int SPUasync(uint32 cycles);
-extern void SPU_flushboot(void);
-
static void spu_tick(spu_synth_t *s)
{
uint32 time, reg, size;
@@ -145,7 +147,7 @@ static void spu_tick(spu_synth_t *s)
reg = s->song_ptr[4] | s->song_ptr[5]<<8 | s->song_ptr[6]<<16 | s->song_ptr[7]<<24;
rdata = s->song_ptr[8] | s->song_ptr[9]<<8;
- SPUwriteRegister(reg, rdata);
+ SPUwriteRegister(s->mips_cpu, reg, rdata);
s->cur_event++;
s->song_ptr += 12;
@@ -168,7 +170,7 @@ static void spu_tick(spu_synth_t *s)
reg = s->song_ptr[0] | s->song_ptr[1]<<8 | s->song_ptr[2]<<16 | s->song_ptr[3]<<24;
rdata = s->song_ptr[4] | s->song_ptr[5]<<8;
- SPUwriteRegister(reg, rdata);
+ SPUwriteRegister(s->mips_cpu, reg, rdata);
s->next_tick = s->song_ptr[6] | s->song_ptr[7]<<8 | s->song_ptr[8]<<16 | s->song_ptr[9]<<24;
s->song_ptr += 10;
@@ -176,7 +178,7 @@ static void spu_tick(spu_synth_t *s)
case 1: // read register
reg = s->song_ptr[0] | s->song_ptr[1]<<8 | s->song_ptr[2]<<16 | s->song_ptr[3]<<24;
- SPUreadRegister(reg);
+ SPUreadRegister(s->mips_cpu, reg);
s->next_tick = s->song_ptr[4] | s->song_ptr[5]<<8 | s->song_ptr[6]<<16 | s->song_ptr[7]<<24;
s->song_ptr += 8;
break;
@@ -247,11 +249,11 @@ int32 spu_gen(void *handle, int16 *buffer, uint32 samples)
for (i = 0; i < samples; i++)
{
spu_tick(s);
- SPUasync(384);
+ SPUasync(s->mips_cpu, 384);
}
- spu_pOutput = (char *)buffer;
- SPU_flushboot();
+ s->spu_pOutput = (char *)buffer;
+ SPU_flushboot(s->mips_cpu);
}
else
{
diff --git a/plugins/ao/eng_psf/peops/dma.c b/plugins/ao/eng_psf/peops/dma.c
index 9aab3090..dfa0564c 100644
--- a/plugins/ao/eng_psf/peops/dma.c
+++ b/plugins/ao/eng_psf/peops/dma.c
@@ -28,17 +28,14 @@
#define _IN_DMA
-extern uint32 psx_ram[(2*1024*1024)/4];
-
-//#include "externals.h"
////////////////////////////////////////////////////////////////////////
// READ DMA (many values)
////////////////////////////////////////////////////////////////////////
-void SPUreadDMAMem(u32 usPSXMem,int iSize)
+void SPUreadDMAMem(mips_cpu_context *cpu, u32 usPSXMem,int iSize)
{
int i;
- u16 *ram16 = (u16 *)&psx_ram[0];
+ u16 *ram16 = (u16 *)&cpu->psx_ram[0];
for(i=0;i<iSize;i++)
{
@@ -61,10 +58,10 @@ void SPUreadDMAMem(u32 usPSXMem,int iSize)
// WRITE DMA (many values)
////////////////////////////////////////////////////////////////////////
-void SPUwriteDMAMem(u32 usPSXMem,int iSize)
+void SPUwriteDMAMem(mips_cpu_context *cpu, u32 usPSXMem,int iSize)
{
int i;
- u16 *ram16 = (u16 *)&psx_ram[0];
+ u16 *ram16 = (u16 *)&cpu->psx_ram[0];
for(i=0;i<iSize;i++)
{
diff --git a/plugins/ao/eng_psf/peops/dma.h b/plugins/ao/eng_psf/peops/dma.h
index 8c1a7e19..b8a32751 100644
--- a/plugins/ao/eng_psf/peops/dma.h
+++ b/plugins/ao/eng_psf/peops/dma.h
@@ -24,8 +24,9 @@
//
//*************************************************************************//
+#include "../psx.h"
-u16 CALLBACK SPUreadDMA(void);
-void CALLBACK SPUreadDMAMem(u16 * pusPSXMem,int iSize);
-void CALLBACK SPUwriteDMA(u16 val);
-void CALLBACK SPUwriteDMAMem(u16 * pusPSXMem,int iSize);
+u16 CALLBACK SPUreadDMA(mips_cpu_context *cpu);
+void CALLBACK SPUreadDMAMem(mips_cpu_context *cpu, u16 * pusPSXMem,int iSize);
+void CALLBACK SPUwriteDMA(mips_cpu_context *cpu, u16 val);
+void CALLBACK SPUwriteDMAMem(mips_cpu_context *cpu, u16 * pusPSXMem,int iSize);
diff --git a/plugins/ao/eng_psf/peops/registers.c b/plugins/ao/eng_psf/peops/registers.c
index bcafc8c0..5393888f 100644
--- a/plugins/ao/eng_psf/peops/registers.c
+++ b/plugins/ao/eng_psf/peops/registers.c
@@ -57,7 +57,7 @@ static void SetPitch(int ch,u16 val);
// WRITE REGISTERS: called by main emu
////////////////////////////////////////////////////////////////////////
-void SPUwriteRegister(u32 reg, u16 val)
+void SPUwriteRegister(mips_cpu_context *cpu, u32 reg, u16 val)
{
const u32 r=reg&0xfff;
regArea[(r-0xc00)>>1] = val;
@@ -297,7 +297,7 @@ void SPUwriteRegister(u32 reg, u16 val)
// READ REGISTER: called by main emu
////////////////////////////////////////////////////////////////////////
-u16 SPUreadRegister(u32 reg)
+u16 SPUreadRegister(mips_cpu_context *cpu, u32 reg)
{
const u32 r=reg&0xfff;
diff --git a/plugins/ao/eng_psf/peops/regs.h b/plugins/ao/eng_psf/peops/regs.h
index 8288830e..ffa11606 100644
--- a/plugins/ao/eng_psf/peops/regs.h
+++ b/plugins/ao/eng_psf/peops/regs.h
@@ -24,4 +24,6 @@
//
//*************************************************************************//
-void SPUwriteRegister(u32 reg, u16 val);
+#include "../psx.h"
+
+void SPUwriteRegister(mips_cpu_context *cpu, u32 reg, u16 val);
diff --git a/plugins/ao/eng_psf/peops/spu.c b/plugins/ao/eng_psf/peops/spu.c
index b121cd11..4dca0d79 100644
--- a/plugins/ao/eng_psf/peops/spu.c
+++ b/plugins/ao/eng_psf/peops/spu.c
@@ -124,7 +124,7 @@ static const int f[5][2] = {
{ 115, -52 },
{ 98, -55 },
{ 122, -60 } };
-s16 * pS;
+static s16 * pS;
static s32 ttemp;
////////////////////////////////////////////////////////////////////////
@@ -202,7 +202,7 @@ void setlength(s32 stop, s32 fade)
}
#define CLIP(_x) {if(_x>32767) _x=32767; if(_x<-32767) _x=-32767;}
-int SPUasync(u32 cycles)
+int SPUasync(mips_cpu_context *cpu, u32 cycles)
{
int volmul=iVolume;
static s32 dosampies;
@@ -490,12 +490,12 @@ int SPUasync(u32 cycles)
return(1);
}
-extern void spu_update (unsigned char* pSound,long lBytes); // HACK!
-void SPU_flushboot(void)
+void SPU_flushboot(mips_cpu_context *cpu)
{
if((u8*)pS>((u8*)pSpuBuffer+1024))
{
- spu_update((u8*)pSpuBuffer,(u8*)pS-(u8*)pSpuBuffer);
+ //spu_update(cpu, (u8*)pSpuBuffer,(u8*)pS-(u8*)pSpuBuffer);
+ cpu->spu_callback ((u8*)pSpuBuffer,(u8*)pS-(u8*)pSpuBuffer, cpu->spu_callback_data);
pS=(s16 *)pSpuBuffer;
}
}
@@ -522,8 +522,10 @@ static u64 gettime64(void)
// SPUINIT: this func will be called first by the main emu
////////////////////////////////////////////////////////////////////////
-int SPUinit(void)
+int SPUinit(mips_cpu_context *cpu, void (*update_cb)(unsigned char *pSound, long lBytes, void *data), void *data)
{
+ cpu->spu_callback = update_cb;
+ cpu->spu_callback_data = data;
spuMemC=(u8*)spuMem; // just small setup
memset((void *)s_chan,0,MAXCHAN*sizeof(SPUCHAN));
memset((void *)&rvb,0,sizeof(REVERBInfo));
@@ -584,7 +586,7 @@ void RemoveStreams(void)
// SPUOPEN: called by main emu after init
////////////////////////////////////////////////////////////////////////
-int SPUopen(void)
+int SPUopen(mips_cpu_context *cpu)
{
if(bSPUIsOpen) return 0; // security for some stupid main emus
spuIrq=0;
@@ -611,7 +613,7 @@ int SPUopen(void)
// SPUCLOSE: called before shutdown
////////////////////////////////////////////////////////////////////////
-int SPUclose(void)
+int SPUclose(mips_cpu_context *cpu)
{
if(!bSPUIsOpen) return 0; // some security
@@ -626,12 +628,12 @@ int SPUclose(void)
// SPUSHUTDOWN: called by main emu on final exit
////////////////////////////////////////////////////////////////////////
-int SPUshutdown(void)
+int SPUshutdown(mips_cpu_context *cpu)
{
return 0;
}
-void SPUinjectRAMImage(u16 *pIncoming)
+void SPUinjectRAMImage(mips_cpu_context *cpu, u16 *pIncoming)
{
int i;
diff --git a/plugins/ao/eng_psf/peops/spu.h b/plugins/ao/eng_psf/peops/spu.h
index 3c2cee41..e438ce27 100644
--- a/plugins/ao/eng_psf/peops/spu.h
+++ b/plugins/ao/eng_psf/peops/spu.h
@@ -24,16 +24,18 @@
//
//*************************************************************************//
+#include "externals.h"
+#include "../psx.h"
void sexyd_update(unsigned char* pSound,long lBytes);
-int SPUasync(u32 cycles);
-void SPU_flushboot(void);
-int SPUinit(void);
-int SPUopen(void);
-int SPUclose(void);
-int SPUshutdown(void);
-void SPUinjectRAMImage(u16 *pIncoming);
-void SPUreadDMAMem(u32 usPSXMem,int iSize);
-void SPUwriteDMAMem(u32 usPSXMem,int iSize);
-u16 SPUreadRegister(u32 reg);
+int SPUasync(mips_cpu_context *cpu, u32 cycles);
+void SPU_flushboot(mips_cpu_context *cpu);
+int SPUinit(mips_cpu_context *cpu, void (*update_cb)(unsigned char *pSound, long lBytes, void *data), void *data);
+int SPUopen(mips_cpu_context *cpu);
+int SPUclose(mips_cpu_context *cpu);
+int SPUshutdown(mips_cpu_context *cpu);
+void SPUinjectRAMImage(mips_cpu_context *cpu, u16 *pIncoming);
+void SPUreadDMAMem(mips_cpu_context *cpu, u32 usPSXMem,int iSize);
+void SPUwriteDMAMem(mips_cpu_context *cpu, u32 usPSXMem,int iSize);
+u16 SPUreadRegister(mips_cpu_context *cpu, u32 reg);
diff --git a/plugins/ao/eng_psf/peops2/dma2.c b/plugins/ao/eng_psf/peops2/dma2.c
index d137dfc2..2d07c059 100644
--- a/plugins/ao/eng_psf/peops2/dma2.c
+++ b/plugins/ao/eng_psf/peops2/dma2.c
@@ -34,17 +34,18 @@
#include "../peops2/externals.h"
#include "../peops2/registers.h"
//#include "debug.h"
+#include "../psx.h"
-extern uint32 psx_ram[(2*1024*1024)/4];
+//extern uint32 psx_ram[(2*1024*1024)/4];
////////////////////////////////////////////////////////////////////////
// READ DMA (many values)
////////////////////////////////////////////////////////////////////////
-EXPORT_GCC void CALLBACK SPU2readDMA4Mem(u32 usPSXMem,int iSize)
+EXPORT_GCC void CALLBACK SPU2readDMA4Mem(mips_cpu_context *cpu, u32 usPSXMem,int iSize)
{
int i;
- u16 *ram16 = (u16 *)&psx_ram[0];
+ u16 *ram16 = (u16 *)&cpu->psx_ram[0];
for(i=0;i<iSize;i++)
{
@@ -64,10 +65,10 @@ EXPORT_GCC void CALLBACK SPU2readDMA4Mem(u32 usPSXMem,int iSize)
spuStat2[0]=0x80; // DMA complete
}
-EXPORT_GCC void CALLBACK SPU2readDMA7Mem(u32 usPSXMem,int iSize)
+EXPORT_GCC void CALLBACK SPU2readDMA7Mem(mips_cpu_context *cpu, u32 usPSXMem,int iSize)
{
int i;
- u16 *ram16 = (u16 *)&psx_ram[0];
+ u16 *ram16 = (u16 *)&cpu->psx_ram[0];
for(i=0;i<iSize;i++)
{
@@ -98,10 +99,10 @@ EXPORT_GCC void CALLBACK SPU2readDMA7Mem(u32 usPSXMem,int iSize)
// WRITE DMA (many values)
////////////////////////////////////////////////////////////////////////
-EXPORT_GCC void CALLBACK SPU2writeDMA4Mem(u32 usPSXMem,int iSize)
+EXPORT_GCC void CALLBACK SPU2writeDMA4Mem(mips_cpu_context *cpu, u32 usPSXMem,int iSize)
{
int i;
- u16 *ram16 = (u16 *)&psx_ram[0];
+ u16 *ram16 = (u16 *)&cpu->psx_ram[0];
for(i=0;i<iSize;i++)
{
@@ -117,10 +118,10 @@ EXPORT_GCC void CALLBACK SPU2writeDMA4Mem(u32 usPSXMem,int iSize)
spuStat2[0]=0x80; // DMA complete
}
-EXPORT_GCC void CALLBACK SPU2writeDMA7Mem(u32 usPSXMem,int iSize)
+EXPORT_GCC void CALLBACK SPU2writeDMA7Mem(mips_cpu_context *cpu, u32 usPSXMem,int iSize)
{
int i;
- u16 *ram16 = (u16 *)&psx_ram[0];
+ u16 *ram16 = (u16 *)&cpu->psx_ram[0];
for(i=0;i<iSize;i++)
{
@@ -139,7 +140,7 @@ EXPORT_GCC void CALLBACK SPU2writeDMA7Mem(u32 usPSXMem,int iSize)
// INTERRUPTS
////////////////////////////////////////////////////////////////////////
-void InterruptDMA4(void)
+void InterruptDMA4(mips_cpu_context *cpu)
{
// taken from linuzappz NULL spu2
// spu2Rs16(CORE0_ATTR)&= ~0x30;
@@ -151,12 +152,12 @@ void InterruptDMA4(void)
spuStat2[0]|=0x80;
}
-EXPORT_GCC void CALLBACK SPU2interruptDMA4(void)
+EXPORT_GCC void CALLBACK SPU2interruptDMA4(mips_cpu_context *cpu)
{
- InterruptDMA4();
+ InterruptDMA4(cpu);
}
-void InterruptDMA7(void)
+void InterruptDMA7(mips_cpu_context *cpu)
{
// taken from linuzappz NULL spu2
// spu2Rs16(CORE1_ATTR)&= ~0x30;
@@ -168,8 +169,8 @@ void InterruptDMA7(void)
spuStat2[1]|=0x80;
}
-EXPORT_GCC void CALLBACK SPU2interruptDMA7(void)
+EXPORT_GCC void CALLBACK SPU2interruptDMA7(mips_cpu_context *cpu)
{
- InterruptDMA7();
+ InterruptDMA7(cpu);
}
diff --git a/plugins/ao/eng_psf/peops2/registers2.c b/plugins/ao/eng_psf/peops2/registers2.c
index 0f3a8242..7eec264b 100644
--- a/plugins/ao/eng_psf/peops2/registers2.c
+++ b/plugins/ao/eng_psf/peops2/registers2.c
@@ -45,6 +45,7 @@
#include "../peops2/registers.h"
#include "../peops2/regs.h"
#include "../peops2/reverb.h"
+#include "../psx.h"
/*
// adsr time values (in ms) by James Higgs ... see the end of
@@ -75,7 +76,7 @@ void VolumeOn(int start,int end,unsigned short val,int iRight);
// WRITE REGISTERS: called by main emu
////////////////////////////////////////////////////////////////////////
-EXPORT_GCC void CALLBACK SPU2write(unsigned long reg, unsigned short val)
+EXPORT_GCC void CALLBACK SPU2write(mips_cpu_context *cpu, unsigned long reg, unsigned short val)
{
long r=reg&0xffff;
@@ -786,7 +787,7 @@ EXPORT_GCC void CALLBACK SPU2write(unsigned long reg, unsigned short val)
// READ REGISTER: called by main emu
////////////////////////////////////////////////////////////////////////
-EXPORT_GCC unsigned short CALLBACK SPU2read(unsigned long reg)
+EXPORT_GCC unsigned short CALLBACK SPU2read(mips_cpu_context *cpu, unsigned long reg)
{
long r=reg&0xffff;
@@ -906,13 +907,13 @@ EXPORT_GCC unsigned short CALLBACK SPU2read(unsigned long reg)
return regArea[r>>1];
}
-EXPORT_GCC void CALLBACK SPU2writePS1Port(unsigned long reg, unsigned short val)
+EXPORT_GCC void CALLBACK SPU2writePS1Port(mips_cpu_context *cpu, unsigned long reg, unsigned short val)
{
const u32 r=reg&0xfff;
if(r>=0xc00 && r<0xd80) // channel info
{
- SPU2write(r-0xc00, val);
+ SPU2write(cpu, r-0xc00, val);
return;
}
@@ -1070,13 +1071,13 @@ EXPORT_GCC void CALLBACK SPU2writePS1Port(unsigned long reg, unsigned short val)
}
}
-EXPORT_GCC unsigned short CALLBACK SPU2readPS1Port(unsigned long reg)
+EXPORT_GCC unsigned short CALLBACK SPU2readPS1Port(mips_cpu_context *cpu, unsigned long reg)
{
const u32 r=reg&0xfff;
if(r>=0x0c00 && r<0x0d80)
{
- return SPU2read(r-0xc00);
+ return SPU2read(cpu, r-0xc00);
}
switch(r)
diff --git a/plugins/ao/eng_psf/peops2/regs.h b/plugins/ao/eng_psf/peops2/regs.h
index 2cacafe1..5136b77a 100644
--- a/plugins/ao/eng_psf/peops2/regs.h
+++ b/plugins/ao/eng_psf/peops2/regs.h
@@ -39,5 +39,5 @@ void SetPitch(int ch,unsigned short val);
void ReverbOn(int start,int end,unsigned short val,int iRight);
void SetReverbAddr(int core);
-EXPORT_GCC void CALLBACK SPU2write(unsigned long reg, unsigned short val);
+//EXPORT_GCC void CALLBACK SPU2write(unsigned long reg, unsigned short val);
diff --git a/plugins/ao/eng_psf/peops2/spu.h b/plugins/ao/eng_psf/peops2/spu.h
index 89e2e900..be69a4ea 100644
--- a/plugins/ao/eng_psf/peops2/spu.h
+++ b/plugins/ao/eng_psf/peops2/spu.h
@@ -26,14 +26,16 @@
// - generic cleanup for the Peops release
//
//*************************************************************************//
+
+#include "../psx.h"
-void SetupTimer(void);
-void RemoveTimer(void);
-EXPORT_GCC void CALLBACK SPU2playADPCMchannel(xa_decode_t *xap);
+//void SetupTimer(mips_cpu_context *cpu);
+//void RemoveTimer(mips_cpu_context *cpu);
+//EXPORT_GCC void CALLBACK SPU2playADPCMchannel(mips_cpu_context *cpu, xa_decode_t *xap);
-EXPORT_GCC long CALLBACK SPU2init(void);
-EXPORT_GCC long CALLBACK SPU2open(void *pDsp);
-EXPORT_GCC void CALLBACK SPU2async(unsigned long cycle);
-EXPORT_GCC void CALLBACK SPU2close(void);
+EXPORT_GCC long CALLBACK SPU2init(mips_cpu_context *cpu, void (*callback)(unsigned char *, long, void *), void *data);
+EXPORT_GCC long CALLBACK SPU2open(mips_cpu_context *cpu, void *pDsp);
+EXPORT_GCC void CALLBACK SPU2async(mips_cpu_context *cpu, unsigned long cycle);
+EXPORT_GCC void CALLBACK SPU2close(mips_cpu_context *cpu);
diff --git a/plugins/ao/eng_psf/peops2/spu2.c b/plugins/ao/eng_psf/peops2/spu2.c
index ef04d3c4..4ae14247 100644
--- a/plugins/ao/eng_psf/peops2/spu2.c
+++ b/plugins/ao/eng_psf/peops2/spu2.c
@@ -102,6 +102,7 @@
#include "../peops2/externals.h"
#include "../peops2/regs.h"
#include "../peops2/dma.h"
+#include "../peops2/spu.h"
////////////////////////////////////////////////////////////////////////
// globals
@@ -168,8 +169,6 @@ static int lastch=-1; // last channel processed on spu irq in timer mode
static int lastns=0; // last ns pos
static int iSecureStart=0; // secure start counter
-extern void ps2_update(unsigned char *samples, long lBytes);
-
////////////////////////////////////////////////////////////////////////
// CODE AREA
////////////////////////////////////////////////////////////////////////
@@ -359,7 +358,7 @@ void setlength2(s32 stop, s32 fade)
int iSpuAsyncWait=0;
-static void *MAINThread(int samp2run)
+static void *MAINThread(mips_cpu_context *cpu, int samp2run)
{
int s_1,s_2,fa,voldiv=iVolume;
unsigned char * start;unsigned int nSample;
@@ -762,7 +761,7 @@ ENDX: ;
// wanna have around 1/60 sec (16.666 ms) updates
if ((((unsigned char *)pS)-((unsigned char *)pSpuBuffer)) == (735*4))
{
- ps2_update((u8*)pSpuBuffer,(u8*)pS-(u8*)pSpuBuffer);
+ cpu->spu_callback((u8*)pSpuBuffer,(u8*)pS-(u8*)pSpuBuffer, cpu->spu_callback_data);
pS=(short *)pSpuBuffer;
}
}
@@ -783,7 +782,7 @@ ENDX: ;
// 1 time every 'cycle' cycles... harhar
////////////////////////////////////////////////////////////////////////
-EXPORT_GCC void CALLBACK SPU2async(unsigned long cycle)
+EXPORT_GCC void CALLBACK SPU2async(mips_cpu_context *cpu, unsigned long cycle)
{
if(iSpuAsyncWait)
{
@@ -792,7 +791,7 @@ EXPORT_GCC void CALLBACK SPU2async(unsigned long cycle)
iSpuAsyncWait=0;
}
- MAINThread(0); // -> linux high-compat mode
+ MAINThread(cpu, 0); // -> linux high-compat mode
}
////////////////////////////////////////////////////////////////////////
@@ -804,8 +803,10 @@ EXPORT_GCC void CALLBACK SPU2async(unsigned long cycle)
////////////////////////////////////////////////////////////////////////
-EXPORT_GCC long CALLBACK SPU2init(void)
+EXPORT_GCC long CALLBACK SPU2init(mips_cpu_context *cpu, void (*callback)(unsigned char *, long, void *), void *data)
{
+ cpu->spu_callback = callback;
+ cpu->spu_callback_data = data;
spuMemC=(unsigned char *)spuMem; // just small setup
memset((void *)s_chan,0,MAXCHAN*sizeof(SPUCHAN));
memset(rvb,0,2*sizeof(REVERBInfo));
@@ -821,7 +822,7 @@ EXPORT_GCC long CALLBACK SPU2init(void)
// SETUPTIMER: init of certain buffers and threads/timers
////////////////////////////////////////////////////////////////////////
-static void SetupTimer(void)
+static void SetupTimer(mips_cpu_context *cpu)
{
memset(SSumR,0,NSSIZE*sizeof(int)); // init some mixing buffers
memset(SSumL,0,NSSIZE*sizeof(int));
@@ -836,7 +837,7 @@ static void SetupTimer(void)
// REMOVETIMER: kill threads/timers
////////////////////////////////////////////////////////////////////////
-static void RemoveTimer(void)
+static void RemoveTimer(mips_cpu_context *cpu)
{
bEndThread=1; // raise flag to end thread
bThreadEnded=0; // no more spu is running
@@ -847,7 +848,7 @@ static void RemoveTimer(void)
// SETUPSTREAMS: init most of the spu buffers
////////////////////////////////////////////////////////////////////////
-static void SetupStreams(void)
+static void SetupStreams(mips_cpu_context *cpu)
{
int i;
@@ -882,7 +883,7 @@ static void SetupStreams(void)
// REMOVESTREAMS: free most buffer
////////////////////////////////////////////////////////////////////////
-static void RemoveStreams(void)
+static void RemoveStreams(mips_cpu_context *cpu)
{
free(pSpuBuffer); // free mixing buffer
pSpuBuffer=NULL;
@@ -908,7 +909,7 @@ static void RemoveStreams(void)
// SPUOPEN: called by main emu after init
////////////////////////////////////////////////////////////////////////
-EXPORT_GCC long CALLBACK SPU2open(void *pDsp)
+EXPORT_GCC long CALLBACK SPU2open(mips_cpu_context *cpu, void *pDsp)
{
if(bSPUIsOpen) return 0; // security for some stupid main emus
@@ -942,9 +943,9 @@ EXPORT_GCC long CALLBACK SPU2open(void *pDsp)
// SetupSound(); // setup midas (before init!)
- SetupStreams(); // prepare streaming
+ SetupStreams(cpu); // prepare streaming
- SetupTimer(); // timer for feeding data
+ SetupTimer(cpu); // timer for feeding data
bSPUIsOpen=1;
@@ -957,17 +958,17 @@ EXPORT_GCC long CALLBACK SPU2open(void *pDsp)
// SPUCLOSE: called before shutdown
////////////////////////////////////////////////////////////////////////
-EXPORT_GCC void CALLBACK SPU2close(void)
+EXPORT_GCC void CALLBACK SPU2close(mips_cpu_context *cpu)
{
if(!bSPUIsOpen) return; // some security
bSPUIsOpen=0; // no more open
- RemoveTimer(); // no more feeding
+ RemoveTimer(cpu); // no more feeding
-// RemoveSound(); // no more sound handling
+// RemoveSound(cpu); // no more sound handling
- RemoveStreams(); // no more streaming
+ RemoveStreams(cpu); // no more streaming
}
////////////////////////////////////////////////////////////////////////
diff --git a/plugins/ao/eng_psf/psx.h b/plugins/ao/eng_psf/psx.h
index 400ca3b5..5674553a 100644
--- a/plugins/ao/eng_psf/psx.h
+++ b/plugins/ao/eng_psf/psx.h
@@ -2,6 +2,7 @@
#define _MIPS_H
#include "ao.h"
+#include "osd_cpu.h"
//#include "driver.h"
typedef void genf(void);
@@ -78,6 +79,16 @@ typedef struct mips_cpu_context_s
PAIR cp2dr[ 32 ];
int (*irq_callback)(struct mips_cpu_context_s *cpu, int irqline);
int mips_ICount;
+ // PSX main RAM
+ uint32 psx_ram[(2*1024*1024)/4];
+ uint32 psx_scratch[0x400];
+ // backup image to restart songs
+ uint32 initial_ram[(2*1024*1024)/4];
+ uint32 initial_scratch[0x400];
+
+ // spu callback
+ void (*spu_callback)(unsigned char *, long, void *);
+ void *spu_callback_data;
} mips_cpu_context;
union cpuinfo
@@ -296,11 +307,11 @@ enum
#define CF_RFE ( 16 )
#ifdef MAME_DEBUG
-extern unsigned DasmMIPS(char *buff, unsigned _pc);
+unsigned DasmMIPS(char *buff, unsigned _pc);
#endif
#if (HAS_PSXCPU)
-extern void psxcpu_get_info(mips_cpu_context *cpu, UINT32 state, union cpuinfo *info);
+void psxcpu_get_info(mips_cpu_context *cpu, UINT32 state, union cpuinfo *info);
#endif
mips_cpu_context *mips_alloc(void);
@@ -316,16 +327,18 @@ int mips_execute( mips_cpu_context *cpu, int cycles );
int mips_get_icount(mips_cpu_context *cpu);
void mips_set_icount(mips_cpu_context *cpu, int count);
+uint32 mips_get_cause(mips_cpu_context *cpu);
+uint32 mips_get_status(mips_cpu_context *cpu);
+void mips_set_status(mips_cpu_context *cpu, uint32 status);
+uint32 mips_get_ePC(mips_cpu_context *cpu);
+
+
void psx_hw_init(mips_cpu_context *cpu);
void psx_hw_slice(mips_cpu_context *cpu);
void psx_hw_frame(mips_cpu_context *cpu);
void ps2_hw_slice(mips_cpu_context *cpu);
void ps2_hw_frame(mips_cpu_context *cpu);
-uint16 SPUreadRegister(uint32 reg);
-void SPUwriteRegister(uint32 reg, uint16 val);
-void SPUwriteDMAMem(uint32 usPSXMem,int iSize);
-void SPUreadDMAMem(uint32 usPSXMem,int iSize);
void mips_shorten_frame(mips_cpu_context *cpu);
uint32 psf2_load_file(mips_cpu_context *cpu, char *file, uint8 *buf, uint32 buflen);
uint32 psf2_load_elf(mips_cpu_context *cpu, uint8 *start, uint32 len);
@@ -341,4 +354,14 @@ void program_write_byte_32le(mips_cpu_context *cpu, offs_t address, uint8 data);
void program_write_word_32le(mips_cpu_context *cpu, offs_t address, uint16 data);
void program_write_dword_32le(mips_cpu_context *cpu, offs_t address, uint32 data);
+// SPU2
+void SPU2write(mips_cpu_context *cpu, unsigned long reg, unsigned short val);
+unsigned short SPU2read(mips_cpu_context *cpu, unsigned long reg);
+void SPU2readDMA4Mem(mips_cpu_context *cpu, uint32 usPSXMem,int iSize);
+void SPU2writeDMA4Mem(mips_cpu_context *cpu, uint32 usPSXMem,int iSize);
+void SPU2readDMA7Mem(mips_cpu_context *cpu, uint32 usPSXMem,int iSize);
+void SPU2writeDMA7Mem(mips_cpu_context *cpu, uint32 usPSXMem,int iSize);
+void SPU2interruptDMA4(mips_cpu_context *cpu);
+void SPU2interruptDMA7(mips_cpu_context *cpu);
+
#endif
diff --git a/plugins/ao/eng_psf/psx_hw.c b/plugins/ao/eng_psf/psx_hw.c
index a699cf26..d81d59a9 100644
--- a/plugins/ao/eng_psf/psx_hw.c
+++ b/plugins/ao/eng_psf/psx_hw.c
@@ -50,6 +50,8 @@
#include "ao.h"
#include "cpuintrf.h"
#include "psx.h"
+#include "peops/spu.h"
+#include "peops/regs.h"
#define DEBUG_HLE_BIOS (0) // debug PS1 HLE BIOS
#define DEBUG_HLE_IOP (0) // debug PS2 IOP OS calls
@@ -59,16 +61,6 @@
extern int psf_refresh;
extern int psxcpu_verbose;
-// SPU2
-extern void SPU2write(unsigned long reg, unsigned short val);
-extern unsigned short SPU2read(unsigned long reg);
-extern void SPU2readDMA4Mem(uint32 usPSXMem,int iSize);
-extern void SPU2writeDMA4Mem(uint32 usPSXMem,int iSize);
-extern void SPU2readDMA7Mem(uint32 usPSXMem,int iSize);
-extern void SPU2writeDMA7Mem(uint32 usPSXMem,int iSize);
-extern void SPU2interruptDMA4(void);
-extern void SPU2interruptDMA7(void);
-
#define MAX_FILE_SLOTS (32)
static volatile int softcall_target = 0;
@@ -215,13 +207,6 @@ static EvtCtrlBlk *CounterEvent;
#define EvMdINTR 0x1000
#define EvMdNOINTR 0x2000
-// PSX main RAM
-uint32 psx_ram[(2*1024*1024)/4];
-uint32 psx_scratch[0x400];
-// backup image to restart songs
-uint32 initial_ram[(2*1024*1024)/4];
-uint32 initial_scratch[0x400];
-
static uint32 spu_delay, dma_icr, irq_data, irq_mask, dma_timer, WAI;
static uint32 dma4_madr, dma4_bcr, dma4_chcr, dma4_delay;
static uint32 dma7_madr, dma7_bcr, dma7_chcr, dma7_delay;
@@ -457,18 +442,18 @@ void psx_irq_set(mips_cpu_context *cpu, uint32 irq)
static uint32 gpu_stat = 0;
-uint32 psx_hw_read(offs_t offset, uint32 mem_mask)
+uint32 psx_hw_read(mips_cpu_context *cpu, offs_t offset, uint32 mem_mask)
{
if (offset >= 0x00000000 && offset <= 0x007fffff)
{
offset &= 0x1fffff;
- return LE32(psx_ram[offset>>2]);
+ return LE32(cpu->psx_ram[offset>>2]);
}
if (offset >= 0x80000000 && offset <= 0x807fffff)
{
offset &= 0x1fffff;
- return LE32(psx_ram[offset>>2]);
+ return LE32(cpu->psx_ram[offset>>2]);
}
if (offset == 0xbfc00180 || offset == 0xbfc00184) // exception vector
@@ -496,11 +481,11 @@ uint32 psx_hw_read(offs_t offset, uint32 mem_mask)
{
if ((mem_mask == 0xffff0000) || (mem_mask == 0xffffff00))
{
- return SPUreadRegister(offset) & ~mem_mask;
+ return SPUreadRegister(cpu, offset) & ~mem_mask;
}
else if (mem_mask == 0x0000ffff)
{
- return SPUreadRegister(offset)<<16;
+ return SPUreadRegister(cpu, offset)<<16;
}
else printf("SPU: read unknown mask %08x\n", mem_mask);
}
@@ -509,15 +494,15 @@ uint32 psx_hw_read(offs_t offset, uint32 mem_mask)
{
if ((mem_mask == 0xffff0000) || (mem_mask == 0xffffff00))
{
- return SPU2read(offset) & ~mem_mask;
+ return SPU2read(cpu, offset) & ~mem_mask;
}
else if (mem_mask == 0x0000ffff)
{
- return SPU2read(offset)<<16;
+ return SPU2read(cpu, offset)<<16;
}
else if (mem_mask == 0)
{
- return SPU2read(offset) | SPU2read(offset+2)<<16;
+ return SPU2read(cpu, offset) | SPU2read(cpu, offset+2)<<16;
}
else printf("SPU2: read unknown mask %08x\n", mem_mask);
}
@@ -573,30 +558,30 @@ uint32 psx_hw_read(offs_t offset, uint32 mem_mask)
{
union cpuinfo mipsinfo;
- mips_get_info(CPUINFO_INT_PC, &mipsinfo);
+ mips_get_info(cpu, CPUINFO_INT_PC, &mipsinfo);
printf("Unknown read: %08x, mask %08x (PC=%x)\n", offset&~3, mem_mask, mipsinfo.i);
}
#endif
return 0;
}
-static void psx_dma4(uint32 madr, uint32 bcr, uint32 chcr)
+static void psx_dma4(mips_cpu_context *cpu, uint32 madr, uint32 bcr, uint32 chcr)
{
if (chcr == 0x01000201) // cpu to SPU
{
// printf("DMA4: RAM %08x to SPU\n", madr);
bcr = (bcr>>16) * (bcr & 0xffff) * 2;
- SPUwriteDMAMem(madr&0x1fffff, bcr);
+ SPUwriteDMAMem(cpu, madr&0x1fffff, bcr);
}
else
{
// printf("DMA4: SPU to RAM %08x\n", madr);
bcr = (bcr>>16) * (bcr & 0xffff) * 2;
- SPUreadDMAMem(madr&0x1fffff, bcr);
+ SPUreadDMAMem(cpu, madr&0x1fffff, bcr);
}
}
-static void ps2_dma4(uint32 madr, uint32 bcr, uint32 chcr)
+static void ps2_dma4(mips_cpu_context *cpu, uint32 madr, uint32 bcr, uint32 chcr)
{
if (chcr == 0x01000201) // cpu to SPU2
{
@@ -604,7 +589,7 @@ static void ps2_dma4(uint32 madr, uint32 bcr, uint32 chcr)
printf("DMA4: RAM %08x to SPU2\n", madr);
#endif
bcr = (bcr>>16) * (bcr & 0xffff) * 4;
- SPU2writeDMA4Mem(madr&0x1fffff, bcr);
+ SPU2writeDMA4Mem(cpu, madr&0x1fffff, bcr);
}
else
{
@@ -612,13 +597,13 @@ static void ps2_dma4(uint32 madr, uint32 bcr, uint32 chcr)
printf("DMA4: SPU2 to RAM %08x\n", madr);
#endif
bcr = (bcr>>16) * (bcr & 0xffff) * 4;
- SPU2readDMA4Mem(madr&0x1fffff, bcr);
+ SPU2readDMA4Mem(cpu, madr&0x1fffff, bcr);
}
dma4_delay = 80;
}
-static void ps2_dma7(uint32 madr, uint32 bcr, uint32 chcr)
+static void ps2_dma7(mips_cpu_context *cpu, uint32 madr, uint32 bcr, uint32 chcr)
{
if ((chcr == 0x01000201) || (chcr == 0x00100010) || (chcr == 0x000f0010) || (chcr == 0x00010010)) // cpu to SPU2
{
@@ -626,7 +611,7 @@ static void ps2_dma7(uint32 madr, uint32 bcr, uint32 chcr)
printf("DMA7: RAM %08x to SPU2\n", madr);
#endif
bcr = (bcr>>16) * (bcr & 0xffff) * 4;
- SPU2writeDMA7Mem(madr&0x1fffff, bcr);
+ SPU2writeDMA7Mem(cpu, madr&0x1fffff, bcr);
}
else
{
@@ -651,8 +636,8 @@ void psx_hw_write(mips_cpu_context *cpu, offs_t offset, uint32 data, uint32 mem_
mips_get_info(cpu, CPUINFO_INT_PC, &mipsinfo);
- psx_ram[offset>>2] &= LE32(mem_mask);
- psx_ram[offset>>2] |= LE32(data);
+ cpu->psx_ram[offset>>2] &= LE32(mem_mask);
+ cpu->psx_ram[offset>>2] |= LE32(data);
return;
}
@@ -661,8 +646,8 @@ void psx_hw_write(mips_cpu_context *cpu, offs_t offset, uint32 data, uint32 mem_
offset &= 0x1fffff;
// if (offset < 0x10000) printf("Write %x to kernel @ %x\n", data, offset);
mips_get_info(cpu, CPUINFO_INT_PC, &mipsinfo);
- psx_ram[offset>>2] &= LE32(mem_mask);
- psx_ram[offset>>2] |= LE32(data);
+ cpu->psx_ram[offset>>2] &= LE32(mem_mask);
+ cpu->psx_ram[offset>>2] |= LE32(data);
return;
}
@@ -678,12 +663,12 @@ void psx_hw_write(mips_cpu_context *cpu, offs_t offset, uint32 data, uint32 mem_
// printf("SPU2 wrote %x to SPU1 address %x!\n", data, offset);
if (mem_mask == 0xffff0000)
{
- SPUwriteRegister(offset, data);
+ SPUwriteRegister(cpu, offset, data);
return;
}
else if (mem_mask == 0x0000ffff)
{
- SPUwriteRegister(offset, data>>16);
+ SPUwriteRegister(cpu, offset, data>>16);
return;
}
else printf("SPU: write unknown mask %08x\n", mem_mask);
@@ -693,18 +678,18 @@ void psx_hw_write(mips_cpu_context *cpu, offs_t offset, uint32 data, uint32 mem_
{
if (mem_mask == 0xffff0000)
{
- SPU2write(offset, data);
+ SPU2write(cpu, offset, data);
return;
}
else if (mem_mask == 0x0000ffff)
{
- SPU2write(offset, data>>16);
+ SPU2write(cpu, offset, data>>16);
return;
}
else if (mem_mask == 0)
{
- SPU2write(offset, data & 0xffff);
- SPU2write(offset+2, data>>16);
+ SPU2write(cpu, offset, data & 0xffff);
+ SPU2write(cpu, offset+2, data>>16);
return;
}
else printf("SPU2: write unknown mask %08x\n", mem_mask);
@@ -747,7 +732,7 @@ void psx_hw_write(mips_cpu_context *cpu, offs_t offset, uint32 data, uint32 mem_
else if (offset == 0x1f8010c8)
{
dma4_chcr = data;
- psx_dma4(dma4_madr, dma4_bcr, dma4_chcr);
+ psx_dma4(cpu, dma4_madr, dma4_bcr, dma4_chcr);
if (dma_icr & (1 << (16+4)))
{
@@ -792,7 +777,7 @@ void psx_hw_write(mips_cpu_context *cpu, offs_t offset, uint32 data, uint32 mem_
else if (offset == 0xbf8010c8)
{
dma4_chcr = data;
- ps2_dma4(dma4_madr, dma4_bcr, dma4_chcr);
+ ps2_dma4(cpu, dma4_madr, dma4_bcr, dma4_chcr);
if (dma_icr & (1 << (16+4)))
{
@@ -817,7 +802,7 @@ void psx_hw_write(mips_cpu_context *cpu, offs_t offset, uint32 data, uint32 mem_
else if (offset == 0xbf801504)
{
dma7_chcr = data;
- ps2_dma7(dma7_madr, dma7_bcr, dma7_chcr);
+ ps2_dma7(cpu, dma7_madr, dma7_bcr, dma7_chcr);
return;
}
@@ -924,11 +909,6 @@ enum
static uint32 heap_addr, entry_int = 0;
-extern uint32 mips_get_cause(void);
-extern uint32 mips_get_status(void);
-extern void mips_set_status(uint32 status);
-extern uint32 mips_get_ePC(void);
-
static uint32 irq_regs[37];
static int irq_mutex = 0;
@@ -978,7 +958,7 @@ static void call_irq_routine(mips_cpu_context *cpu, uint32 routine, uint32 param
mips_set_info(cpu, CPUINFO_INT_REGISTER + MIPS_R31, &mipsinfo);
// make sure we're set
- psx_ram[0x1000/4] = LE32(FUNCT_HLECALL);
+ cpu->psx_ram[0x1000/4] = LE32(FUNCT_HLECALL);
softcall_target = 0;
oldICount = mips_get_icount(cpu);
@@ -1021,7 +1001,7 @@ void psx_bios_exception(mips_cpu_context *cpu, uint32 pc)
mips_get_info(cpu, CPUINFO_INT_REGISTER + MIPS_R4, &mipsinfo);
a0 = mipsinfo.i;
- switch (mips_get_cause() & 0x3c)
+ switch (mips_get_cause(cpu) & 0x3c)
{
case 0: // IRQ
// printf("IRQ: %x, mask %x\n", irq_data, irq_mask);
@@ -1050,7 +1030,7 @@ void psx_bios_exception(mips_cpu_context *cpu, uint32 pc)
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_R31, &mipsinfo);
// make sure we're set
- psx_ram[0x1000/4] = LE32(FUNCT_HLECALL);
+ cpu->psx_ram[0x1000/4] = LE32(FUNCT_HLECALL);
softcall_target = 0;
oldICount = mips_get_icount(cpu);
@@ -1082,7 +1062,7 @@ void psx_bios_exception(mips_cpu_context *cpu, uint32 pc)
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_R31, &mipsinfo);
// make sure we're set
- psx_ram[0x1000/4] = LE32(FUNCT_HLECALL);
+ cpu->psx_ram[0x1000/4] = LE32(FUNCT_HLECALL);
softcall_target = 0;
oldICount = mips_get_icount(cpu);
@@ -1112,25 +1092,25 @@ void psx_bios_exception(mips_cpu_context *cpu, uint32 pc)
// printf("taking entry_int\n");
// RA (and PC)
- mipsinfo.i = LE32(psx_ram[((a0&0x1fffff)+0)/4]);
+ mipsinfo.i = LE32(cpu->psx_ram[((a0&0x1fffff)+0)/4]);
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_R31, &mipsinfo);
mips_set_info(cpu,CPUINFO_INT_PC, &mipsinfo);
// SP
- mipsinfo.i = LE32(psx_ram[((a0&0x1fffff)+4)/4]);
+ mipsinfo.i = LE32(cpu->psx_ram[((a0&0x1fffff)+4)/4]);
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_R29, &mipsinfo);
// FP
- mipsinfo.i = LE32(psx_ram[((a0&0x1fffff)+8)/4]);
+ mipsinfo.i = LE32(cpu->psx_ram[((a0&0x1fffff)+8)/4]);
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_R30, &mipsinfo);
// S0-S7 are next
for (i = 0; i < 8; i++)
{
- mipsinfo.i = LE32(psx_ram[((a0&0x1fffff)+12+(i*4))/4]);
+ mipsinfo.i = LE32(cpu->psx_ram[((a0&0x1fffff)+12+(i*4))/4]);
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_R16 + i, &mipsinfo);
}
// GP
- mipsinfo.i = LE32(psx_ram[((a0&0x1fffff)+44)/4]);
+ mipsinfo.i = LE32(cpu->psx_ram[((a0&0x1fffff)+44)/4]);
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_R28, &mipsinfo);
// v0 = 1
@@ -1152,18 +1132,18 @@ void psx_bios_exception(mips_cpu_context *cpu, uint32 pc)
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_HI, &mipsinfo);
mipsinfo.i = irq_regs[33];
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_LO, &mipsinfo);
- mipsinfo.i = mips_get_ePC();
+ mipsinfo.i = mips_get_ePC(cpu);
mips_set_info(cpu,CPUINFO_INT_PC, &mipsinfo);
- status = mips_get_status();
+ status = mips_get_status(cpu);
status = (status & 0xfffffff0) | ((status & 0x3c)>>2);
- mips_set_status(status);
+ mips_set_status(cpu, status);
}
break;
case 0x20: // syscall
// syscall always farks with the status, so get it now
- status = mips_get_status();
+ status = mips_get_status(cpu);
switch (a0)
{
@@ -1189,12 +1169,12 @@ void psx_bios_exception(mips_cpu_context *cpu, uint32 pc)
}
// PC = ePC + 4
- mipsinfo.i = mips_get_ePC() + 4;
+ mipsinfo.i = mips_get_ePC(cpu) + 4;
mips_set_info(cpu,CPUINFO_INT_PC, &mipsinfo);
// and update the status accordingly
status = (status & 0xfffffff0) | ((status & 0x3c)>>2);
- mips_set_status(status);
+ mips_set_status(cpu, status);
break;
default:
@@ -1280,11 +1260,11 @@ void psx_hw_init(mips_cpu_context *cpu)
iNumTimers = 0;
// set PS1 BIOS HLE breakpoints
- psx_ram[0xa0/4] = LE32(FUNCT_HLECALL);
- psx_ram[0xb0/4] = LE32(FUNCT_HLECALL);
- psx_ram[0xc0/4] = LE32(FUNCT_HLECALL);
+ cpu->psx_ram[0xa0/4] = LE32(FUNCT_HLECALL);
+ cpu->psx_ram[0xb0/4] = LE32(FUNCT_HLECALL);
+ cpu->psx_ram[0xc0/4] = LE32(FUNCT_HLECALL);
- Event = (EvtCtrlBlk *)&psx_ram[0x1000/4];
+ Event = (EvtCtrlBlk *)&cpu->psx_ram[0x1000/4];
CounterEvent = (Event + (32*2));
dma_icr = 0;
@@ -1361,27 +1341,27 @@ void psx_bios_hle(mips_cpu_context *cpu, uint32 pc)
case 0x13: // setjmp
// RA
mips_get_info(cpu, CPUINFO_INT_REGISTER + MIPS_R31, &mipsinfo);
- psx_ram[((a0&0x1fffff)+0)/4] = LE32(mipsinfo.i);
+ cpu->psx_ram[((a0&0x1fffff)+0)/4] = LE32(mipsinfo.i);
#if DEBUG_HLE_BIOS
printf("HLEBIOS: setjmp(%08x) => PC %08x\n", a0, mipsinfo.i);
#endif
// SP
mips_get_info(cpu, CPUINFO_INT_REGISTER + MIPS_R29, &mipsinfo);
- psx_ram[((a0&0x1fffff)+4)/4] = LE32(mipsinfo.i);
+ cpu->psx_ram[((a0&0x1fffff)+4)/4] = LE32(mipsinfo.i);
// FP
mips_get_info(cpu, CPUINFO_INT_REGISTER + MIPS_R30, &mipsinfo);
- psx_ram[((a0&0x1fffff)+8)/4] = LE32(mipsinfo.i);
+ cpu->psx_ram[((a0&0x1fffff)+8)/4] = LE32(mipsinfo.i);
// S0-S7 are next
for (i = 0; i < 8; i++)
{
mips_get_info(cpu, CPUINFO_INT_REGISTER + MIPS_R16 + i, &mipsinfo);
- psx_ram[((a0&0x1fffff)+12+(i*4))/4] = LE32(mipsinfo.i);
+ cpu->psx_ram[((a0&0x1fffff)+12+(i*4))/4] = LE32(mipsinfo.i);
}
// GP
mips_get_info(cpu, CPUINFO_INT_REGISTER + MIPS_R28, &mipsinfo);
- psx_ram[((a0&0x1fffff)+44)/4] = LE32(mipsinfo.i);
+ cpu->psx_ram[((a0&0x1fffff)+44)/4] = LE32(mipsinfo.i);
// v0 = 0
mipsinfo.i = 0;
@@ -1396,8 +1376,8 @@ void psx_bios_hle(mips_cpu_context *cpu, uint32 pc)
printf("HLEBIOS: strncmp(%08x, %08x, %d)\n", a0, a1, a2);
#endif
- dst = (uint8 *)psx_ram;
- src = (uint8 *)psx_ram;
+ dst = (uint8 *)cpu->psx_ram;
+ src = (uint8 *)cpu->psx_ram;
dst += (a0 & 0x1fffff);
src += (a1 & 0x1fffff);
@@ -1415,8 +1395,8 @@ void psx_bios_hle(mips_cpu_context *cpu, uint32 pc)
printf("HLEBIOS: strcpy(%08x, %08x)\n", a0, a1);
#endif
- dst = (uint8 *)psx_ram;
- src = (uint8 *)psx_ram;
+ dst = (uint8 *)cpu->psx_ram;
+ src = (uint8 *)cpu->psx_ram;
dst += (a0 & 0x1fffff);
src += (a1 & 0x1fffff);
@@ -1441,7 +1421,7 @@ void psx_bios_hle(mips_cpu_context *cpu, uint32 pc)
printf("HLEBIOS: bzero(%08x, %08x)\n", a0, a1);
#endif
- dst = (uint8 *)psx_ram;
+ dst = (uint8 *)cpu->psx_ram;
dst += (a0 & 0x1fffff);
memset(dst, 0, a1);
}
@@ -1455,8 +1435,8 @@ void psx_bios_hle(mips_cpu_context *cpu, uint32 pc)
printf("HLEBIOS: memcpy(%08x, %08x, %08x)\n", a0, a1, a2);
#endif
- dst = (uint8 *)psx_ram;
- src = (uint8 *)psx_ram;
+ dst = (uint8 *)cpu->psx_ram;
+ src = (uint8 *)cpu->psx_ram;
dst += (a0 & 0x1fffff);
src += (a1 & 0x1fffff);
@@ -1482,7 +1462,7 @@ void psx_bios_hle(mips_cpu_context *cpu, uint32 pc)
printf("HLEBIOS: memset(%08x, %08x, %08x)\n", a0, a1, a2);
#endif
- dst = (uint8 *)psx_ram;
+ dst = (uint8 *)cpu->psx_ram;
dst += (a0 & 0x1fffff);
while (a2)
@@ -1526,22 +1506,22 @@ void psx_bios_hle(mips_cpu_context *cpu, uint32 pc)
chunk = heap_addr;
// find a free block that's big enough
- while ((a0 > LE32(psx_ram[(chunk+BLK_SIZE)/4])) ||
- (LE32(psx_ram[(chunk+BLK_STAT)/4]) == 1))
+ while ((a0 > LE32(cpu->psx_ram[(chunk+BLK_SIZE)/4])) ||
+ (LE32(cpu->psx_ram[(chunk+BLK_STAT)/4]) == 1))
{
- chunk = LE32(psx_ram[(chunk+BLK_FD)]);
+ chunk = LE32(cpu->psx_ram[(chunk+BLK_FD)]);
}
// split free block
fd = chunk + 16 + a0; // free block starts after block record and allocation size
- psx_ram[(fd+BLK_STAT)/4] = psx_ram[(chunk+BLK_STAT)/4];
- psx_ram[(fd+BLK_SIZE)/4] = LE32(LE32(psx_ram[(chunk+BLK_SIZE)/4]) - a0);
- psx_ram[(fd+BLK_FD)/4] = psx_ram[(chunk+BLK_FD)/4];
- psx_ram[(fd+BLK_BK)/4] = chunk;
+ cpu->psx_ram[(fd+BLK_STAT)/4] = cpu->psx_ram[(chunk+BLK_STAT)/4];
+ cpu->psx_ram[(fd+BLK_SIZE)/4] = LE32(LE32(cpu->psx_ram[(chunk+BLK_SIZE)/4]) - a0);
+ cpu->psx_ram[(fd+BLK_FD)/4] = cpu->psx_ram[(chunk+BLK_FD)/4];
+ cpu->psx_ram[(fd+BLK_BK)/4] = chunk;
- psx_ram[(chunk+BLK_STAT)/4] = LE32(1);
- psx_ram[(chunk+BLK_SIZE)/4] = LE32(a0);
- psx_ram[(chunk+BLK_FD)/4] = LE32(fd);
+ cpu->psx_ram[(chunk+BLK_STAT)/4] = LE32(1);
+ cpu->psx_ram[(chunk+BLK_SIZE)/4] = LE32(a0);
+ cpu->psx_ram[(chunk+BLK_FD)/4] = LE32(fd);
mipsinfo.i = chunk + 16;
mipsinfo.i |= 0x80000000;
@@ -1560,24 +1540,24 @@ void psx_bios_hle(mips_cpu_context *cpu, uint32 pc)
heap_addr = a0 & 0x3fffffff;
- psx_ram[(heap_addr+BLK_STAT)/4] = LE32(0);
- psx_ram[(heap_addr+BLK_FD)/4] = LE32(0);
- psx_ram[(heap_addr+BLK_BK)/4] = LE32(0);
+ cpu->psx_ram[(heap_addr+BLK_STAT)/4] = LE32(0);
+ cpu->psx_ram[(heap_addr+BLK_FD)/4] = LE32(0);
+ cpu->psx_ram[(heap_addr+BLK_BK)/4] = LE32(0);
// if heap size out of range, clamp it
if (((a0 & 0x1fffff) + a1) >= 2*1024*1024)
{
- psx_ram[(heap_addr+BLK_SIZE)/4] = LE32(0x1ffffc - (a0 & 0x1fffff));
+ cpu->psx_ram[(heap_addr+BLK_SIZE)/4] = LE32(0x1ffffc - (a0 & 0x1fffff));
}
else
{
- psx_ram[(heap_addr+BLK_SIZE)/4] = LE32(a1);
+ cpu->psx_ram[(heap_addr+BLK_SIZE)/4] = LE32(a1);
}
break;
case 0x3f: // printf
#if DEBUG_HLE_BIOS
- printf("HLEBIOS: printf(%08x) = %s\n", a0, &psx_ram[(a0&0x1fffff)/4]);
+ printf("HLEBIOS: printf(%08x) = %s\n", a0, &cpu->psx_ram[(a0&0x1fffff)/4]);
#endif
break;
@@ -1761,14 +1741,14 @@ void psx_bios_hle(mips_cpu_context *cpu, uint32 pc)
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_HI, &mipsinfo);
mipsinfo.i = irq_regs[33];
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_LO, &mipsinfo);
- mipsinfo.i = mips_get_ePC();
+ mipsinfo.i = mips_get_ePC(cpu);
// printf("ReturnFromException: IRQ state %x\n", irq_data & irq_mask);
// printf("HLEBIOS: ReturnFromException, cause = %08x, PC = %08x\n", mips_get_cause(), mipsinfo.i);
mips_set_info(cpu,CPUINFO_INT_PC, &mipsinfo);
- status = mips_get_status();
+ status = mips_get_status(cpu);
status = (status & 0xfffffff0) | ((status & 0x3c)>>2);
- mips_set_status(status);
+ mips_set_status(cpu, status);
return; // force return to avoid PC=RA below
break;
@@ -1806,11 +1786,11 @@ void psx_bios_hle(mips_cpu_context *cpu, uint32 pc)
#endif
// v0 = (a0*4)+0x8600
- mipsinfo.i = LE32(psx_ram[((a0<<2) + 0x8600)/4]);
+ mipsinfo.i = LE32(cpu->psx_ram[((a0<<2) + 0x8600)/4]);
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_R2, &mipsinfo);
// (a0*4)+0x8600 = a1;
- psx_ram[((a0<<2) + 0x8600)/4] = LE32(a1);
+ cpu->psx_ram[((a0<<2) + 0x8600)/4] = LE32(a1);
break;
default:
@@ -1843,7 +1823,7 @@ void psx_hw_runcounters(mips_cpu_context *cpu)
if (dma4_delay == 0)
{
- SPU2interruptDMA4();
+ SPU2interruptDMA4(cpu);
if (dma4_cb)
{
@@ -1858,7 +1838,7 @@ void psx_hw_runcounters(mips_cpu_context *cpu)
if (dma7_delay == 0)
{
- SPU2interruptDMA7();
+ SPU2interruptDMA7(cpu);
if (dma7_cb)
{
@@ -1955,16 +1935,16 @@ uint8 program_read_byte_32le(mips_cpu_context *cpu, offs_t address)
switch (address & 0x3)
{
case 0:
- return psx_hw_read(address, 0xffffff00);
+ return psx_hw_read(cpu, address, 0xffffff00);
break;
case 1:
- return psx_hw_read(address, 0xffff00ff)>>8;
+ return psx_hw_read(cpu, address, 0xffff00ff)>>8;
break;
case 2:
- return psx_hw_read(address, 0xff00ffff)>>16;
+ return psx_hw_read(cpu, address, 0xff00ffff)>>16;
break;
case 3:
- return psx_hw_read(address, 0x00ffffff)>>24;
+ return psx_hw_read(cpu, address, 0x00ffffff)>>24;
break;
}
return 0;
@@ -1973,14 +1953,14 @@ uint8 program_read_byte_32le(mips_cpu_context *cpu, offs_t address)
uint16 program_read_word_32le(mips_cpu_context *cpu, offs_t address)
{
if (address & 2)
- return psx_hw_read(address, 0x0000ffff)>>16;
+ return psx_hw_read(cpu, address, 0x0000ffff)>>16;
- return psx_hw_read(address, 0xffff0000);
+ return psx_hw_read(cpu, address, 0xffff0000);
}
uint32 program_read_dword_32le(mips_cpu_context *cpu, offs_t address)
{
- return psx_hw_read(address, 0);
+ return psx_hw_read(cpu, address, 0);
}
void program_write_byte_32le(mips_cpu_context *cpu, offs_t address, uint8 data)
@@ -2093,7 +2073,7 @@ static void iop_sprintf(mips_cpu_context *cpu, char *out, char *fmt, uint32 psta
mips_get_info(cpu, curparm, &mipsinfo);
curparm++;
- pstr = (char *)psx_ram;
+ pstr = (char *)cpu->psx_ram;
pstr += (mipsinfo.i & 0x1fffff);
sprintf(temp, tfmt, pstr);
@@ -2136,19 +2116,19 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
a3 = mipsinfo.i;
scan = (pc&0x0fffffff)/4;
- while ((psx_ram[scan] != LE32(0x41e00000)) && (scan >= (0x10000/4)))
+ while ((cpu->psx_ram[scan] != LE32(0x41e00000)) && (scan >= (0x10000/4)))
{
scan--;
}
- if (psx_ram[scan] != LE32(0x41e00000))
+ if (cpu->psx_ram[scan] != LE32(0x41e00000))
{
printf("FATAL ERROR: couldn't find IOP link signature\n");
return;
}
scan += 3; // skip zero and version
- memcpy(name, &psx_ram[scan], 8);
+ memcpy(name, &cpu->psx_ram[scan], 8);
name[8] = '\0';
// printf("IOP: call module [%s] service %d (PC=%08x)\n", name, callnum, pc);
@@ -2158,7 +2138,7 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
switch (callnum)
{
case 4: // printf
- mname = (char *)psx_ram;
+ mname = (char *)cpu->psx_ram;
mname += a0 & 0x1fffff;
mname += (a0 & 3);
@@ -2238,7 +2218,7 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
a0 /= 4;
#if DEBUG_THREADING
printf(" : flags %x routine %08x pri %x stacksize %d refCon %08x\n",
- psx_ram[a0], psx_ram[a0+1], psx_ram[a0+2], psx_ram[a0+3], psx_ram[a0+4]);
+ cpu->psx_ram[a0], cpu->psx_ram[a0+1], cpu->psx_ram[a0+2], cpu->psx_ram[a0+3], cpu->psx_ram[a0+4]);
#endif
newAlloc = psf2_get_loadaddr();
@@ -2248,14 +2228,14 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
newAlloc &= ~0xf;
newAlloc += 16;
}
- psf2_set_loadaddr(newAlloc + LE32(psx_ram[a0+3]));
+ psf2_set_loadaddr(newAlloc + LE32(cpu->psx_ram[a0+3]));
threads[iNumThreads].iState = TS_CREATED;
threads[iNumThreads].stackloc = newAlloc;
- threads[iNumThreads].flags = LE32(psx_ram[a0]);
- threads[iNumThreads].routine = LE32(psx_ram[a0+2]);
- threads[iNumThreads].stacksize = LE32(psx_ram[a0+3]);
- threads[iNumThreads].refCon = LE32(psx_ram[a0+4]);
+ threads[iNumThreads].flags = LE32(cpu->psx_ram[a0]);
+ threads[iNumThreads].routine = LE32(cpu->psx_ram[a0+2]);
+ threads[iNumThreads].stacksize = LE32(cpu->psx_ram[a0+3]);
+ threads[iNumThreads].refCon = LE32(cpu->psx_ram[a0+4]);
mipsinfo.i = iNumThreads;
iNumThreads++;
@@ -2350,8 +2330,8 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
a0 &= 0x1fffff;
a0 /= 4;
- psx_ram[a0] = LE32(sys_time & 0xffffffff); // low
- psx_ram[a0+1] = LE32(sys_time >> 32); // high
+ cpu->psx_ram[a0] = LE32(sys_time & 0xffffffff); // low
+ cpu->psx_ram[a0+1] = LE32(sys_time >> 32); // high
mipsinfo.i = 0;
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_R2, &mipsinfo);
@@ -2372,8 +2352,8 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
hi = dTicks>>32;
lo = dTicks & 0xffffffff;
- psx_ram[((a1 & 0x1fffff)/4)] = LE32(lo);
- psx_ram[((a1 & 0x1fffff)/4)+1] = LE32(hi);
+ cpu->psx_ram[((a1 & 0x1fffff)/4)] = LE32(lo);
+ cpu->psx_ram[((a1 & 0x1fffff)/4)+1] = LE32(hi);
mipsinfo.i = 0;
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_R2, &mipsinfo);
@@ -2396,8 +2376,8 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
a1 /= 4;
a2 /= 4;
- temp = LE32(psx_ram[a0]);
- temp |= (uint64)LE32(psx_ram[a0+1])<<32;
+ temp = LE32(cpu->psx_ram[a0]);
+ temp |= (uint64)LE32(cpu->psx_ram[a0+1])<<32;
temp *= (uint64)1000000;
temp /= (uint64)36864000;
@@ -2406,8 +2386,8 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
seconds = (temp / 1000000) & 0xffffffff;
usec = (temp % 1000000) & 0xffffffff;
- psx_ram[a1] = LE32(seconds);
- psx_ram[a2] = LE32(usec);
+ cpu->psx_ram[a1] = LE32(seconds);
+ cpu->psx_ram[a2] = LE32(usec);
}
break;
@@ -2429,9 +2409,9 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
a0 &= 0x1fffff;
a0 /= 4;
- evflags[iNumFlags].type = LE32(psx_ram[a0]);
- evflags[iNumFlags].value = LE32(psx_ram[a0+1]);
- evflags[iNumFlags].param = LE32(psx_ram[a0+2]);
+ evflags[iNumFlags].type = LE32(cpu->psx_ram[a0]);
+ evflags[iNumFlags].value = LE32(cpu->psx_ram[a0+1]);
+ evflags[iNumFlags].param = LE32(cpu->psx_ram[a0+2]);
evflags[iNumFlags].inUse = 1;
#if DEBUG_HLE_IOP
@@ -2558,14 +2538,14 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
a0 &= 0x7fffffff;
a0 /= 4;
-// printf("Sema %d Parms: %08x %08x %08x %08x\n", mipsinfo.i, psx_ram[a0], psx_ram[a0+1], psx_ram[a0+2], psx_ram[a0+3]);
+// printf("Sema %d Parms: %08x %08x %08x %08x\n", mipsinfo.i, cpu->psx_ram[a0], cpu->psx_ram[a0+1], cpu->psx_ram[a0+2], cpu->psx_ram[a0+3]);
if (mipsinfo.i != -1)
{
- semaphores[mipsinfo.i].attr = LE32(psx_ram[a0]);
- semaphores[mipsinfo.i].option = LE32(psx_ram[a0+1]);
- semaphores[mipsinfo.i].init = LE32(psx_ram[a0+2]);
- semaphores[mipsinfo.i].max = LE32(psx_ram[a0+3]);
+ semaphores[mipsinfo.i].attr = LE32(cpu->psx_ram[a0]);
+ semaphores[mipsinfo.i].option = LE32(cpu->psx_ram[a0+1]);
+ semaphores[mipsinfo.i].init = LE32(cpu->psx_ram[a0+2]);
+ semaphores[mipsinfo.i].max = LE32(cpu->psx_ram[a0+3]);
semaphores[mipsinfo.i].current = semaphores[mipsinfo.i].init;
@@ -2774,8 +2754,8 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
printf("IOP: memcpy(%08x, %08x, %d)\n", a0, a1, a2);
#endif
- dst = (uint8 *)&psx_ram[(a0&0x1fffff)/4];
- src = (uint8 *)&psx_ram[(a1&0x1fffff)/4];
+ dst = (uint8 *)&cpu->psx_ram[(a0&0x1fffff)/4];
+ src = (uint8 *)&cpu->psx_ram[(a1&0x1fffff)/4];
// get exact byte alignment
dst += a0 % 4;
src += a1 % 4;
@@ -2802,8 +2782,8 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
printf("IOP: memmove(%08x, %08x, %d)\n", a0, a1, a2);
#endif
- dst = (uint8 *)&psx_ram[(a0&0x1fffff)/4];
- src = (uint8 *)&psx_ram[(a1&0x1fffff)/4];
+ dst = (uint8 *)&cpu->psx_ram[(a0&0x1fffff)/4];
+ src = (uint8 *)&cpu->psx_ram[(a1&0x1fffff)/4];
// get exact byte alignment
dst += a0 % 4;
src += a1 % 4;
@@ -2834,7 +2814,7 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
printf("IOP: memset(%08x, %02x, %d) [PC=%x]\n", a0, a1, a2, mipsinfo.i);
#endif
- dst = (uint8 *)&psx_ram[(a0&0x1fffff)/4];
+ dst = (uint8 *)&cpu->psx_ram[(a0&0x1fffff)/4];
dst += (a0 & 3);
memset(dst, a1, a2);
@@ -2849,15 +2829,15 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
printf("IOP: bzero(%08x, %08x)\n", a0, a1);
#endif
- dst = (uint8 *)&psx_ram[(a0&0x1fffff)/4];
+ dst = (uint8 *)&cpu->psx_ram[(a0&0x1fffff)/4];
dst += (a0 & 3);
memset(dst, 0, a1);
}
break;
case 19: // sprintf
- mname = (char *)psx_ram;
- str1 = (char *)psx_ram;
+ mname = (char *)cpu->psx_ram;
+ str1 = (char *)cpu->psx_ram;
mname += a0 & 0x1fffff;
str1 += a1 & 0x1fffff;
@@ -2882,8 +2862,8 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
printf("IOP: strcpy(%08x, %08x)\n", a0, a1);
#endif
- dst = (uint8 *)&psx_ram[(a0&0x1fffff)/4];
- src = (uint8 *)&psx_ram[(a1&0x1fffff)/4];
+ dst = (uint8 *)&cpu->psx_ram[(a0&0x1fffff)/4];
+ src = (uint8 *)&cpu->psx_ram[(a1&0x1fffff)/4];
// get exact byte alignment
dst += a0 % 4;
src += a1 % 4;
@@ -2911,7 +2891,7 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
printf("IOP: strlen(%08x) [PC=%x]\n", a0, mipsinfo.i);
#endif
- dst = (char *)&psx_ram[(a0&0x1fffff)/4];
+ dst = (char *)&cpu->psx_ram[(a0&0x1fffff)/4];
dst += (a0 & 3);
mipsinfo.i = strlen(dst);
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_R2, &mipsinfo);
@@ -2926,8 +2906,8 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
printf("IOP: strncpy(%08x, %08x, %d)\n", a0, a1, a2);
#endif
- dst = (char *)&psx_ram[(a0&0x1fffff)/4];
- src = (char *)&psx_ram[(a1&0x1fffff)/4];
+ dst = (char *)&cpu->psx_ram[(a0&0x1fffff)/4];
+ src = (char *)&cpu->psx_ram[(a1&0x1fffff)/4];
// get exact byte alignment
dst += a0 % 4;
src += a1 % 4;
@@ -2949,7 +2929,7 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
case 36: // strtol
- mname = (char *)&psx_ram[(a0 & 0x1fffff)/4];
+ mname = (char *)&cpu->psx_ram[(a0 & 0x1fffff)/4];
mname += (a0 & 3);
if (a1)
@@ -3087,10 +3067,10 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
printf("IOP: RegisterLibraryEntries(%08x) (PC=%x)\n", a0, mipsinfo.i);
#endif
- if (psx_ram[a0/4] == LE32(0x41c00000))
+ if (cpu->psx_ram[a0/4] == LE32(0x41c00000))
{
a0 += 3*4;
- memcpy(&reglibs[iNumLibs].name, &psx_ram[a0/4], 8);
+ memcpy(&reglibs[iNumLibs].name, &cpu->psx_ram[a0/4], 8);
reglibs[iNumLibs].name[8] = '\0';
#if DEBUG_HLE_IOP
printf("Lib name [%s]\n", &reglibs[iNumLibs].name);
@@ -3176,7 +3156,7 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
break;
case 14: // Kprintf
- mname = (char *)psx_ram;
+ mname = (char *)cpu->psx_ram;
mname += a0 & 0x1fffff;
mname += (a0 & 3);
@@ -3209,7 +3189,7 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
{
FILE *f;
f = fopen("psxram.bin", "wb");
- fwrite(psx_ram, 2*1024*1024, 1, f);
+ fwrite(cpu->psx_ram, 2*1024*1024, 1, f);
fclose(f);
}
#endif
@@ -3228,9 +3208,9 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
switch (callnum)
{
case 7: // LoadStartModule
- mname = (char *)&psx_ram[(a0 & 0x1fffff)/4];
+ mname = (char *)&cpu->psx_ram[(a0 & 0x1fffff)/4];
mname += 8;
- str1 = (char *)&psx_ram[(a2 & 0x1fffff)/4];
+ str1 = (char *)&cpu->psx_ram[(a2 & 0x1fffff)/4];
#if DEBUG_HLE_IOP
printf("LoadStartModule: %s\n", mname);
#endif
@@ -3256,7 +3236,7 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
if (start != 0xffffffff)
{
uint32 args[20], numargs = 1, argofs;
- uint8 *argwalk = (uint8 *)psx_ram, *argbase;
+ uint8 *argwalk = (uint8 *)cpu->psx_ram, *argbase;
argwalk += (a2 & 0x1fffff);
argbase = argwalk;
@@ -3288,7 +3268,7 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
#if DEBUG_HLE_IOP
// printf("Arg %d: %08x [%s]\n", i, args[i], &argbase[args[i]-a2]);
#endif
- psx_ram[(newAlloc/4)+i] = LE32(args[i]);
+ cpu->psx_ram[(newAlloc/4)+i] = LE32(args[i]);
}
// set argv and argc
@@ -3338,7 +3318,7 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
return;
}
- mname = (char *)psx_ram;
+ mname = (char *)cpu->psx_ram;
mname += (a0 & 0x1fffff);
if (!strncmp(mname, "aofile:", 7))
@@ -3406,7 +3386,7 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
a2 = filesize[a0] - filepos[a0];
}
- rp = (uint8 *)psx_ram;
+ rp = (uint8 *)cpu->psx_ram;
rp += (a1 & 0x1fffff);
memcpy(rp, &filedata[a0][filepos[a0]], a2);
@@ -3489,7 +3469,7 @@ void psx_iop_call(mips_cpu_context *cpu, uint32 pc, uint32 callnum)
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_DELAYV, &mipsinfo);
mips_set_info(cpu,CPUINFO_INT_REGISTER + MIPS_DELAYR, &mipsinfo);
- mipsinfo.i = LE32(psx_ram[(reglibs[lib].dispatch/4) + callnum]);
+ mipsinfo.i = LE32(cpu->psx_ram[(reglibs[lib].dispatch/4) + callnum]);
// (NOTE: we get called in the delay slot!)
#if DEBUG_HLE_IOP