psx - memory domains
This commit is contained in:
parent
a488114832
commit
78c873982d
|
@ -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
|
||||
|
|
|
@ -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.
|
@ -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;
|
||||
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue