work harder to update mednafen PSX.cpp from 1.24.0-UNSTABLE more exactly

This commit is contained in:
zeromus 2020-04-09 16:00:39 -04:00
parent f6a165752e
commit b8accdfd75
2 changed files with 1037 additions and 1044 deletions

View File

@ -115,6 +115,7 @@ void PSX_DBG(unsigned level, const char *format, ...) noexcept
static unsigned const psx_dbg_level = 0;
#endif
struct MDFN_PseudoRNG // Based off(but not the same as) public-domain "JKISS" PRNG.
{
MDFN_COLD MDFN_PseudoRNG()
@ -122,9 +123,9 @@ struct MDFN_PseudoRNG // Based off(but not the same as) public-domain "JKISS" PR
ResetState();
}
u32 RandU32(void)
uint32 RandU32(void)
{
u64 t;
uint64 t;
x = 314527869 * x + 1234567;
y ^= y << 5; y ^= y >> 7; y ^= y << 22;
@ -233,6 +234,7 @@ void PSX_SetDMACycleSteal(unsigned stealage)
DMACycleSteal = stealage;
}
//
// Event stuff
//
@ -353,7 +355,7 @@ void ForceEventUpdates(const pscpu_timestamp_t timestamp)
CPU->SetEventNT(events[PSX_EVENT__SYNFIRST].next->event_time);
}
bool PSX_EventHandler(const pscpu_timestamp_t timestamp)
bool MDFN_FASTCALL PSX_EventHandler(const pscpu_timestamp_t timestamp)
{
event_list_entry *e = events[PSX_EVENT__SYNFIRST].next;
@ -411,7 +413,6 @@ void PSX_RequestMLExit(void)
// End event stuff
//
// Remember to update MemPeek<>() and MemPoke<>() when we change address decoding in MemRW()
template<typename T, bool IsWrite, bool Access24> static INLINE void MemRW(pscpu_timestamp_t &timestamp, uint32 A, uint32 &V)
{
@ -498,7 +499,6 @@ template<typename T, bool IsWrite, bool Access24> static INLINE void MemRW(pscpu
if(timestamp >= events[PSX_EVENT__SYNFIRST].next->event_time)
PSX_EventHandler(timestamp);
//0.9.36.5 - clarified read order by turning into two statements
V = SPU->Read(timestamp, A);
V |= SPU->Read(timestamp, A | 2) << 16;
}
@ -562,15 +562,8 @@ template<typename T, bool IsWrite, bool Access24> static INLINE void MemRW(pscpu
if(!IsWrite)
timestamp++;
if (IsWrite)
{
if (A == 0x1F801820)
{
//per pcsx-rr:
GpuFrameForLag = true;
}
MDEC_Write(timestamp, A, V);
}
if(IsWrite)
MDEC_Write(timestamp, A, V);
else
V = MDEC_Read(timestamp, A);
@ -716,8 +709,8 @@ template<typename T, bool IsWrite, bool Access24> static INLINE void MemRW(pscpu
else switch(sizeof(T))
{
case 1: V = TextMem[(A & 0x7FFFFF) - 65536]; break;
case 2: V = MDFN_de16lsb<false>(&TextMem[(A & 0x7FFFFF) - 65536]); break;
case 4: V = MDFN_de32lsb<false>(&TextMem[(A & 0x7FFFFF) - 65536]); break;
case 2: V = MDFN_de16lsb(&TextMem[(A & 0x7FFFFF) - 65536]); break;
case 4: V = MDFN_de32lsb(&TextMem[(A & 0x7FFFFF) - 65536]); break;
}
}
}
@ -746,27 +739,27 @@ template<typename T, bool IsWrite, bool Access24> static INLINE void MemRW(pscpu
}
}
void PSX_MemWrite8(pscpu_timestamp_t timestamp, uint32 A, uint32 V)
void MDFN_FASTCALL PSX_MemWrite8(pscpu_timestamp_t timestamp, uint32 A, uint32 V)
{
MemRW<uint8, true, false>(timestamp, A, V);
}
void PSX_MemWrite16(pscpu_timestamp_t timestamp, uint32 A, uint32 V)
void MDFN_FASTCALL PSX_MemWrite16(pscpu_timestamp_t timestamp, uint32 A, uint32 V)
{
MemRW<uint16, true, false>(timestamp, A, V);
}
void PSX_MemWrite24(pscpu_timestamp_t timestamp, uint32 A, uint32 V)
void MDFN_FASTCALL PSX_MemWrite24(pscpu_timestamp_t timestamp, uint32 A, uint32 V)
{
MemRW<uint32, true, true>(timestamp, A, V);
}
void PSX_MemWrite32(pscpu_timestamp_t timestamp, uint32 A, uint32 V)
void MDFN_FASTCALL PSX_MemWrite32(pscpu_timestamp_t timestamp, uint32 A, uint32 V)
{
MemRW<uint32, true, false>(timestamp, A, V);
}
uint8 PSX_MemRead8(pscpu_timestamp_t &timestamp, uint32 A)
uint8 MDFN_FASTCALL PSX_MemRead8(pscpu_timestamp_t &timestamp, uint32 A)
{
uint32 V;
@ -775,7 +768,7 @@ uint8 PSX_MemRead8(pscpu_timestamp_t &timestamp, uint32 A)
return(V);
}
uint16 PSX_MemRead16(pscpu_timestamp_t &timestamp, uint32 A)
uint16 MDFN_FASTCALL PSX_MemRead16(pscpu_timestamp_t &timestamp, uint32 A)
{
uint32 V;
@ -784,7 +777,7 @@ uint16 PSX_MemRead16(pscpu_timestamp_t &timestamp, uint32 A)
return(V);
}
uint32 PSX_MemRead24(pscpu_timestamp_t &timestamp, uint32 A)
uint32 MDFN_FASTCALL PSX_MemRead24(pscpu_timestamp_t &timestamp, uint32 A)
{
uint32 V;
@ -793,7 +786,7 @@ uint32 PSX_MemRead24(pscpu_timestamp_t &timestamp, uint32 A)
return(V);
}
uint32 PSX_MemRead32(pscpu_timestamp_t &timestamp, uint32 A)
uint32 MDFN_FASTCALL PSX_MemRead32(pscpu_timestamp_t &timestamp, uint32 A)
{
uint32 V;
@ -905,8 +898,8 @@ template<typename T, bool Access24> static INLINE uint32 MemPeek(pscpu_timestamp
else switch(sizeof(T))
{
case 1: return(TextMem[(A & 0x7FFFFF) - 65536]); break;
case 2: return(MDFN_de16lsb<false>(&TextMem[(A & 0x7FFFFF) - 65536])); break;
case 4: return(MDFN_de32lsb<false>(&TextMem[(A & 0x7FFFFF) - 65536])); break;
case 2: return(MDFN_de16lsb(&TextMem[(A & 0x7FFFFF) - 65536])); break;
case 4: return(MDFN_de32lsb(&TextMem[(A & 0x7FFFFF) - 65536])); break;
}
}
}
@ -1993,23 +1986,23 @@ static MDFN_COLD void LoadEXE(const uint8 *data, const uint32 size, bool ignore_
po = &PIOMem->data8[0x0800];
MDFN_en32lsb<false>(po, (0x0 << 26) | (31 << 21) | (0x8 << 0)); // JR
MDFN_en32lsb(po, (0x0 << 26) | (31 << 21) | (0x8 << 0)); // JR
po += 4;
MDFN_en32lsb<false>(po, 0); // NOP(kinda)
MDFN_en32lsb(po, 0); // NOP(kinda)
po += 4;
po = &PIOMem->data8[0x1000];
// Load cacheable-region target PC into r2
MDFN_en32lsb<false>(po, (0xF << 26) | (0 << 21) | (1 << 16) | (0x9F001010 >> 16)); // LUI
MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | (0x9F001010 >> 16)); // LUI
po += 4;
MDFN_en32lsb<false>(po, (0xD << 26) | (1 << 21) | (2 << 16) | (0x9F001010 & 0xFFFF)); // ORI
MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (2 << 16) | (0x9F001010 & 0xFFFF)); // ORI
po += 4;
// Jump to r2
MDFN_en32lsb<false>(po, (0x0 << 26) | (2 << 21) | (0x8 << 0)); // JR
MDFN_en32lsb(po, (0x0 << 26) | (2 << 21) | (0x8 << 0)); // JR
po += 4;
MDFN_en32lsb<false>(po, 0); // NOP(kinda)
MDFN_en32lsb(po, 0); // NOP(kinda)
po += 4;
//
@ -2018,42 +2011,42 @@ static MDFN_COLD void LoadEXE(const uint8 *data, const uint32 size, bool ignore_
// Load source address into r8
uint32 sa = 0x9F000000 + 65536;
MDFN_en32lsb<false>(po, (0xF << 26) | (0 << 21) | (1 << 16) | (sa >> 16)); // LUI
MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | (sa >> 16)); // LUI
po += 4;
MDFN_en32lsb<false>(po, (0xD << 26) | (1 << 21) | (8 << 16) | (sa & 0xFFFF)); // ORI
MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (8 << 16) | (sa & 0xFFFF)); // ORI
po += 4;
// Load dest address into r9
MDFN_en32lsb<false>(po, (0xF << 26) | (0 << 21) | (1 << 16) | (TextMem_Start >> 16)); // LUI
MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | (TextMem_Start >> 16)); // LUI
po += 4;
MDFN_en32lsb<false>(po, (0xD << 26) | (1 << 21) | (9 << 16) | (TextMem_Start & 0xFFFF)); // ORI
MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (9 << 16) | (TextMem_Start & 0xFFFF)); // ORI
po += 4;
// Load size into r10
MDFN_en32lsb<false>(po, (0xF << 26) | (0 << 21) | (1 << 16) | (TextMem.size() >> 16)); // LUI
MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | (TextMem.size() >> 16)); // LUI
po += 4;
MDFN_en32lsb<false>(po, (0xD << 26) | (1 << 21) | (10 << 16) | (TextMem.size() & 0xFFFF)); // ORI
MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (10 << 16) | (TextMem.size() & 0xFFFF)); // ORI
po += 4;
//
// Loop begin
//
MDFN_en32lsb<false>(po, (0x24 << 26) | (8 << 21) | (1 << 16)); // LBU to r1
MDFN_en32lsb(po, (0x24 << 26) | (8 << 21) | (1 << 16)); // LBU to r1
po += 4;
MDFN_en32lsb<false>(po, (0x08 << 26) | (10 << 21) | (10 << 16) | 0xFFFF); // Decrement size
MDFN_en32lsb(po, (0x08 << 26) | (10 << 21) | (10 << 16) | 0xFFFF); // Decrement size
po += 4;
MDFN_en32lsb<false>(po, (0x28 << 26) | (9 << 21) | (1 << 16)); // SB from r1
MDFN_en32lsb(po, (0x28 << 26) | (9 << 21) | (1 << 16)); // SB from r1
po += 4;
MDFN_en32lsb<false>(po, (0x08 << 26) | (8 << 21) | (8 << 16) | 0x0001); // Increment source addr
MDFN_en32lsb(po, (0x08 << 26) | (8 << 21) | (8 << 16) | 0x0001); // Increment source addr
po += 4;
MDFN_en32lsb<false>(po, (0x05 << 26) | (0 << 21) | (10 << 16) | (-5 & 0xFFFF));
MDFN_en32lsb(po, (0x05 << 26) | (0 << 21) | (10 << 16) | (-5 & 0xFFFF));
po += 4;
MDFN_en32lsb<false>(po, (0x08 << 26) | (9 << 21) | (9 << 16) | 0x0001); // Increment dest addr
MDFN_en32lsb(po, (0x08 << 26) | (9 << 21) | (9 << 16) | 0x0001); // Increment dest addr
po += 4;
//
@ -2067,31 +2060,31 @@ static MDFN_COLD void LoadEXE(const uint8 *data, const uint32 size, bool ignore_
}
else
{
MDFN_en32lsb<false>(po, (0xF << 26) | (0 << 21) | (1 << 16) | (SP >> 16)); // LUI
MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | (SP >> 16)); // LUI
po += 4;
MDFN_en32lsb<false>(po, (0xD << 26) | (1 << 21) | (29 << 16) | (SP & 0xFFFF)); // ORI
MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (29 << 16) | (SP & 0xFFFF)); // ORI
po += 4;
// Load PC into r2
MDFN_en32lsb<false>(po, (0xF << 26) | (0 << 21) | (1 << 16) | ((PC >> 16) | 0x8000)); // LUI
MDFN_en32lsb(po, (0xF << 26) | (0 << 21) | (1 << 16) | ((PC >> 16) | 0x8000)); // LUI
po += 4;
MDFN_en32lsb<false>(po, (0xD << 26) | (1 << 21) | (2 << 16) | (PC & 0xFFFF)); // ORI
MDFN_en32lsb(po, (0xD << 26) | (1 << 21) | (2 << 16) | (PC & 0xFFFF)); // ORI
po += 4;
}
// Half-assed instruction cache flush. ;)
for(unsigned i = 0; i < 1024; i++)
{
MDFN_en32lsb<false>(po, 0);
MDFN_en32lsb(po, 0);
po += 4;
}
// Jump to r2
MDFN_en32lsb<false>(po, (0x0 << 26) | (2 << 21) | (0x8 << 0)); // JR
MDFN_en32lsb(po, (0x0 << 26) | (2 << 21) | (0x8 << 0)); // JR
po += 4;
MDFN_en32lsb<false>(po, 0); // NOP(kinda)
MDFN_en32lsb(po, 0); // NOP(kinda)
po += 4;
}

View File

@ -68,17 +68,17 @@ namespace MDFN_IEN_PSX
typedef int32 pscpu_timestamp_t;
bool PSX_EventHandler(const pscpu_timestamp_t timestamp);
bool MDFN_FASTCALL PSX_EventHandler(const pscpu_timestamp_t timestamp);
void PSX_MemWrite8(pscpu_timestamp_t timestamp, uint32 A, uint32 V);
void PSX_MemWrite16(pscpu_timestamp_t timestamp, uint32 A, uint32 V);
void PSX_MemWrite24(pscpu_timestamp_t timestamp, uint32 A, uint32 V);
void PSX_MemWrite32(pscpu_timestamp_t timestamp, uint32 A, uint32 V);
void MDFN_FASTCALL PSX_MemWrite8(pscpu_timestamp_t timestamp, uint32 A, uint32 V);
void MDFN_FASTCALL PSX_MemWrite16(pscpu_timestamp_t timestamp, uint32 A, uint32 V);
void MDFN_FASTCALL PSX_MemWrite24(pscpu_timestamp_t timestamp, uint32 A, uint32 V);
void MDFN_FASTCALL PSX_MemWrite32(pscpu_timestamp_t timestamp, uint32 A, uint32 V);
uint8 PSX_MemRead8(pscpu_timestamp_t &timestamp, uint32 A);
uint16 PSX_MemRead16(pscpu_timestamp_t &timestamp, uint32 A);
uint32 PSX_MemRead24(pscpu_timestamp_t &timestamp, uint32 A);
uint32 PSX_MemRead32(pscpu_timestamp_t &timestamp, uint32 A);
uint8 MDFN_FASTCALL PSX_MemRead8(pscpu_timestamp_t &timestamp, uint32 A);
uint16 MDFN_FASTCALL PSX_MemRead16(pscpu_timestamp_t &timestamp, uint32 A);
uint32 MDFN_FASTCALL PSX_MemRead24(pscpu_timestamp_t &timestamp, uint32 A);
uint32 MDFN_FASTCALL PSX_MemRead32(pscpu_timestamp_t &timestamp, uint32 A);
uint8 PSX_MemPeek8(uint32 A);
uint16 PSX_MemPeek16(uint32 A);
@ -129,10 +129,10 @@ namespace MDFN_IEN_PSX
class PS_CDC;
class PS_SPU;
extern PS_CPU *CPU;
extern PS_CDC *CDC;
extern PS_SPU *SPU;
extern MultiAccessSizeMem<2048 * 1024, false> MainRAM;
MDFN_HIDE extern PS_CPU *CPU;
MDFN_HIDE extern PS_CDC *CDC;
MDFN_HIDE extern PS_SPU *SPU;
MDFN_HIDE extern MultiAccessSizeMem<2048 * 1024, false> MainRAM;
}
enum eRegion