psx - memory domains

This commit is contained in:
zeromus 2014-12-11 01:56:21 +00:00
parent a488114832
commit 78c873982d
7 changed files with 91 additions and 13 deletions

View File

@ -19,7 +19,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
isPorted: true,
isReleased: false
)]
public unsafe class Octoshock : IEmulator, IVideoProvider, ISyncSoundProvider
public unsafe class Octoshock : IEmulator, IVideoProvider, ISyncSoundProvider, IMemoryDomains
{
public string SystemId { get { return "NULL"; } }
@ -167,7 +167,6 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
public Octoshock(CoreComm comm, DiscSystem.Disc disc)
{
ServiceProvider = new BasicServiceProvider(this);
var domains = new List<MemoryDomain>();
CoreComm = comm;
CoreComm.UsesDriveLed = true;
@ -197,6 +196,8 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
fixed (byte* pFirmware = firmware)
OctoshockDll.shock_Create(out psx, discInfo.region, pFirmware);
SetMemoryDomains();
//these should track values in octoshock gpu.cpp FillVideoParams
//if (discInfo.region == OctoshockDll.eRegion.EU)
@ -314,9 +315,9 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
fixed (short* samples = sbuff)
{
sbuffcontains = OctoshockDll.shock_GetSamples(null);
sbuffcontains = OctoshockDll.shock_GetSamples(psx, null);
if (sbuffcontains * 2 > sbuff.Length) throw new InvalidOperationException("shock_GetSamples returned too many samples: " + sbuffcontains);
OctoshockDll.shock_GetSamples(samples);
OctoshockDll.shock_GetSamples(psx, samples);
}
}
@ -342,6 +343,36 @@ namespace BizHawk.Emulation.Cores.Sony.PSX
public int BufferHeight { get; private set; }
public int BackgroundColor { get { return 0; } }
#region Debugging
unsafe void SetMemoryDomains()
{
var mmd = new List<MemoryDomain>();
IntPtr ptr;
int size;
OctoshockDll.shock_GetMemData(psx, out ptr, out size, OctoshockDll.eMemType.MainRAM);
mmd.Add(MemoryDomain.FromIntPtr("MainRAM", size, MemoryDomain.Endian.Little, ptr, true));
OctoshockDll.shock_GetMemData(psx, out ptr, out size, OctoshockDll.eMemType.GPURAM);
mmd.Add(MemoryDomain.FromIntPtr("GPURAM", size, MemoryDomain.Endian.Little, ptr, true));
OctoshockDll.shock_GetMemData(psx, out ptr, out size, OctoshockDll.eMemType.SPURAM);
mmd.Add(MemoryDomain.FromIntPtr("SPURAM", size, MemoryDomain.Endian.Little, ptr, true));
OctoshockDll.shock_GetMemData(psx, out ptr, out size, OctoshockDll.eMemType.BiosROM);
mmd.Add(MemoryDomain.FromIntPtr("BiosROM", size, MemoryDomain.Endian.Little, ptr, true));
OctoshockDll.shock_GetMemData(psx, out ptr, out size, OctoshockDll.eMemType.PIOMem);
mmd.Add(MemoryDomain.FromIntPtr("PIOMem", size, MemoryDomain.Endian.Little, ptr, true));
MemoryDomains = new MemoryDomainList(mmd, 0);
}
public MemoryDomainList MemoryDomains { get; private set; }
#endregion
#region ISoundProvider
private short[] sbuff = new short[1454*2]; //this is the most ive ever seen.. dont know why

View File

@ -24,6 +24,16 @@ public unsafe static class OctoshockDll
Normalize = 1
}
public enum eMemType
{
MainRAM = 0, //2048K
BiosROM = 1, //512K
PIOMem = 2, //64K
GPURAM = 3, //512K
SPURAM = 4 //512K
};
public enum ePeripheralType
{
None = 0, //can be used to signify disconnection
@ -126,5 +136,13 @@ public unsafe static class OctoshockDll
public static extern int shock_GetFramebuffer(IntPtr psx, ref ShockFramebufferInfo fb);
[DllImport("octoshock.dll")]
public static extern int shock_GetSamples(void* buffer);
public static extern int shock_GetSamples(IntPtr psx, void* buffer);
[DllImport("octoshock.dll")]
public static extern int shock_GetMemData(
IntPtr psx,
out IntPtr ptr,
out int size,
[MarshalAs(UnmanagedType.I4)] eMemType memType
);
}

Binary file not shown.

View File

@ -98,6 +98,9 @@ class PS_GPU
GPURAM[(A >> 10) & 0x1FF][A & 0x3FF] = V;
}
// Y, X
uint16 GPURAM[512][1024];
private:
void ProcessFIFO(void);
@ -105,9 +108,6 @@ class PS_GPU
uint32 ReadData(void);
void SoftReset(void);
// Y, X
uint16 GPURAM[512][1024];
uint32 DMAControl;
//

View File

@ -1741,7 +1741,7 @@ void NormalizeFramebuffer()
s_FramebufferCurrent = curr;
}
EW_EXPORT s32 shock_GetSamples(void* buffer)
EW_EXPORT s32 shock_GetSamples(void* psx, void* buffer)
{
//if buffer is NULL, user just wants to know how many samples, so dont do any copying
if(buffer != NULL)
@ -3156,3 +3156,20 @@ s32 ShockDiscRef::ReadLBA2048(s32 lba, void* dst2048)
return sector.mode;
}
//Returns information about a memory buffer for peeking (main memory, spu memory, etc.)
EW_EXPORT s32 shock_GetMemData(void* psx, void** ptr, s32* size, s32 memType)
{
switch(memType)
{
case eMemType_MainRAM: *ptr = MainRAM.data8; *size = 2048*1024; break;
case eMemType_BiosROM: *ptr = BIOSROM->data8; *size = 512*1024; break;
case eMemType_PIOMem: *ptr = PIOMem->data8; *size = 64*1024; break;
case eMemType_GPURAM: *ptr = GPU->GPURAM; *size = 2*512*1024; break;
case eMemType_SPURAM: *ptr = SPU->SPURAM; *size = 512*1024; break;
default:
return SHOCK_ERROR;
}
return SHOCK_OK;
}

View File

@ -131,6 +131,15 @@ enum eShockFramebufferFlags
eShockFramebufferFlags_Normalize = 1
};
enum eMemType
{
eMemType_MainRAM = 0, //2048K
eMemType_BiosROM = 1, //512K
eMemType_PIOMem = 2, //64K
eMemType_GPURAM = 3, //512K
eMemType_SPURAM = 4 //512K
};
enum ePeripheralType
{
ePeripheralType_None = 0, //can be used to signify disconnection
@ -283,4 +292,7 @@ EW_EXPORT s32 shock_GetFramebuffer(void* psx, ShockFramebufferInfo* fb);
//Returns the queued SPU output (usually ~737 samples per frame) as the normal 16bit interleaved stereo format
//The size of the queue will be returned. Make sure your buffer can handle it. Pass NULL just to get the required size.
EW_EXPORT s32 shock_GetSamples(void* buffer);
EW_EXPORT s32 shock_GetSamples(void* psx, void* buffer);
//Returns information about a memory buffer for peeking (main memory, spu memory, etc.)
EW_EXPORT s32 shock_GetMemData(void* psx, void** ptr, s32* size, s32 memType);

View File

@ -114,7 +114,9 @@ class PS_SPU
int32 UpdateFromCDC(int32 clocks);
//pscpu_timestamp_t Update(pscpu_timestamp_t timestamp);
private:
uint16 SPURAM[524288 / sizeof(uint16)];
private:
void CheckIRQAddr(uint32 addr);
void WriteSPURAM(uint32 addr, uint16 value);
@ -240,8 +242,6 @@ class PS_SPU
//pscpu_timestamp_t lastts;
int32 clock_divider;
uint16 SPURAM[524288 / sizeof(uint16)];
int last_rate;
uint32 last_quality;