psx - update to mednafen 0.9.38.4
This commit is contained in:
parent
e2aabbab60
commit
f2c62161a9
Binary file not shown.
|
@ -218,6 +218,22 @@ INLINE T PS_CPU::PeekMemory(uint32 address)
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void PS_CPU::PokeMemory(uint32 address, T value)
|
||||||
|
{
|
||||||
|
address &= addr_mask[address >> 29];
|
||||||
|
|
||||||
|
if(address >= 0x1F800000 && address <= 0x1F8003FF)
|
||||||
|
return ScratchRAM.Write<T>(address & 0x3FF, value);
|
||||||
|
|
||||||
|
if(sizeof(T) == 1)
|
||||||
|
PSX_MemPoke8(address, value);
|
||||||
|
else if(sizeof(T) == 2)
|
||||||
|
PSX_MemPoke16(address, value);
|
||||||
|
else
|
||||||
|
PSX_MemPoke32(address, value);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
INLINE T PS_CPU::ReadMemory(pscpu_timestamp_t ×tamp, uint32 address, bool DS24, bool LWC_timing)
|
INLINE T PS_CPU::ReadMemory(pscpu_timestamp_t ×tamp, uint32 address, bool DS24, bool LWC_timing)
|
||||||
{
|
{
|
||||||
|
@ -2381,7 +2397,21 @@ uint32 PS_CPU::PeekMem32(uint32 A)
|
||||||
{
|
{
|
||||||
return PeekMemory<uint32>(A);
|
return PeekMemory<uint32>(A);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PS_CPU::PokeMem8(uint32 A, uint8 V)
|
||||||
|
{
|
||||||
|
PokeMemory<uint8>(A, V);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PS_CPU::PokeMem16(uint32 A, uint16 V)
|
||||||
|
{
|
||||||
|
PokeMemory<uint16>(A, V);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PS_CPU::PokeMem32(uint32 A, uint32 V)
|
||||||
|
{
|
||||||
|
PokeMemory<uint32>(A, V);
|
||||||
|
}
|
||||||
|
|
||||||
#undef BEGIN_OPF
|
#undef BEGIN_OPF
|
||||||
#undef END_OPF
|
#undef END_OPF
|
||||||
|
|
|
@ -214,6 +214,7 @@ class PS_CPU
|
||||||
template<bool DebugMode, bool BIOSPrintMode, bool ILHMode> pscpu_timestamp_t RunReal(pscpu_timestamp_t timestamp_in) NO_INLINE;
|
template<bool DebugMode, bool BIOSPrintMode, bool ILHMode> pscpu_timestamp_t RunReal(pscpu_timestamp_t timestamp_in) NO_INLINE;
|
||||||
|
|
||||||
template<typename T> T PeekMemory(uint32 address) MDFN_COLD;
|
template<typename T> T PeekMemory(uint32 address) MDFN_COLD;
|
||||||
|
template<typename T> void PokeMemory(uint32 address, T value) MDFN_COLD;
|
||||||
template<typename T> T ReadMemory(pscpu_timestamp_t ×tamp, uint32 address, bool DS24 = false, bool LWC_timing = false);
|
template<typename T> T ReadMemory(pscpu_timestamp_t ×tamp, uint32 address, bool DS24 = false, bool LWC_timing = false);
|
||||||
template<typename T> void WriteMemory(pscpu_timestamp_t ×tamp, uint32 address, uint32 value, bool DS24 = false);
|
template<typename T> void WriteMemory(pscpu_timestamp_t ×tamp, uint32 address, uint32 value, bool DS24 = false);
|
||||||
|
|
||||||
|
@ -243,9 +244,15 @@ class PS_CPU
|
||||||
uint32 GetRegister(unsigned int which, char *special, const uint32 special_len);
|
uint32 GetRegister(unsigned int which, char *special, const uint32 special_len);
|
||||||
void SetRegister(unsigned int which, uint32 value);
|
void SetRegister(unsigned int which, uint32 value);
|
||||||
bool PeekCheckICache(uint32 PC, uint32 *iw);
|
bool PeekCheckICache(uint32 PC, uint32 *iw);
|
||||||
|
|
||||||
uint8 PeekMem8(uint32 A);
|
uint8 PeekMem8(uint32 A);
|
||||||
uint16 PeekMem16(uint32 A);
|
uint16 PeekMem16(uint32 A);
|
||||||
uint32 PeekMem32(uint32 A);
|
uint32 PeekMem32(uint32 A);
|
||||||
|
|
||||||
|
void PokeMem8(uint32 A, uint8 V);
|
||||||
|
void PokeMem16(uint32 A, uint16 V);
|
||||||
|
void PokeMem32(uint32 A, uint32 V);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void (*CPUHook)(const pscpu_timestamp_t timestamp, uint32 pc);
|
void (*CPUHook)(const pscpu_timestamp_t timestamp, uint32 pc);
|
||||||
void (*ADDBT)(uint32 from, uint32 to, bool exception);
|
void (*ADDBT)(uint32 from, uint32 to, bool exception);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -169,7 +169,7 @@ void PS_GPU::FillVideoParams(MDFNGI* gi)
|
||||||
// For Justifier and Guncon.
|
// For Justifier and Guncon.
|
||||||
//
|
//
|
||||||
gi->mouse_scale_x = (float)gi->lcm_width / gi->nominal_width;
|
gi->mouse_scale_x = (float)gi->lcm_width / gi->nominal_width;
|
||||||
gi->mouse_offs_x = 0;
|
gi->mouse_offs_x = (float)(2800 - gi->lcm_width) / 2;
|
||||||
|
|
||||||
gi->mouse_scale_y = 1.0;
|
gi->mouse_scale_y = 1.0;
|
||||||
gi->mouse_offs_y = LineVisFirst;
|
gi->mouse_offs_y = LineVisFirst;
|
||||||
|
@ -401,6 +401,7 @@ INLINE void PS_GPU::Command_FBCopy(const uint32 *cb)
|
||||||
if(!height)
|
if(!height)
|
||||||
height = 0x200;
|
height = 0x200;
|
||||||
|
|
||||||
|
InvalidateTexCache();
|
||||||
//printf("FB Copy: %d %d %d %d %d %d\n", sourceX, sourceY, destX, destY, width, height);
|
//printf("FB Copy: %d %d %d %d %d %d\n", sourceX, sourceY, destX, destY, width, height);
|
||||||
|
|
||||||
DrawTimeAvail -= (width * height) * 2;
|
DrawTimeAvail -= (width * height) * 2;
|
||||||
|
@ -453,6 +454,8 @@ INLINE void PS_GPU::Command_FBWrite(const uint32 *cb)
|
||||||
FBRW_CurX = FBRW_X;
|
FBRW_CurX = FBRW_X;
|
||||||
FBRW_CurY = FBRW_Y;
|
FBRW_CurY = FBRW_Y;
|
||||||
|
|
||||||
|
InvalidateTexCache();
|
||||||
|
|
||||||
if(FBRW_W != 0 && FBRW_H != 0)
|
if(FBRW_W != 0 && FBRW_H != 0)
|
||||||
InCmd = INCMD_FBWRITE;
|
InCmd = INCMD_FBWRITE;
|
||||||
}
|
}
|
||||||
|
@ -491,28 +494,50 @@ INLINE void PS_GPU::RecalcTexPageStuff(uint32 tpage)
|
||||||
|
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
INLINE void PS_GPU::SetTPage(const uint32 cmdw)
|
||||||
|
{
|
||||||
|
const unsigned NewTexPageX = (cmdw & 0xF) * 64;
|
||||||
|
const unsigned NewTexPageY = (cmdw & 0x10) * 16;
|
||||||
|
const unsigned NewTexMode = (cmdw >> 7) & 0x3;
|
||||||
|
|
||||||
|
abr = (cmdw >> 5) & 0x3;
|
||||||
|
|
||||||
|
if(!NewTexMode != !TexMode || NewTexPageX != TexPageX || NewTexPageY != TexPageY)
|
||||||
|
{
|
||||||
|
InvalidateTexCache();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(TexDisableAllowChange)
|
||||||
|
{
|
||||||
|
bool NewTexDisable = (cmdw >> 11) & 1;
|
||||||
|
|
||||||
|
if(NewTexDisable != TexDisable)
|
||||||
|
InvalidateTexCache();
|
||||||
|
|
||||||
|
TexDisable = NewTexDisable;
|
||||||
|
//printf("TexDisable: %02x\n", TexDisable);
|
||||||
|
}
|
||||||
|
|
||||||
|
TexPageX = NewTexPageX;
|
||||||
|
TexPageY = NewTexPageY;
|
||||||
|
TexMode = NewTexMode;
|
||||||
|
|
||||||
|
//
|
||||||
|
//
|
||||||
|
RecalcTexWindowStuff();
|
||||||
|
}
|
||||||
|
|
||||||
INLINE void PS_GPU::Command_DrawMode(const uint32 *cb)
|
INLINE void PS_GPU::Command_DrawMode(const uint32 *cb)
|
||||||
{
|
{
|
||||||
const uint32 cmdw = *cb;
|
const uint32 cmdw = *cb;
|
||||||
|
|
||||||
TexPageX = (cmdw & 0xF) * 64;
|
SetTPage(cmdw);
|
||||||
TexPageY = (cmdw & 0x10) * 16;
|
|
||||||
|
|
||||||
SpriteFlip = cmdw & 0x3000;
|
SpriteFlip = cmdw & 0x3000;
|
||||||
|
|
||||||
abr = (cmdw >> 5) & 0x3;
|
|
||||||
TexMode = (cmdw >> 7) & 0x3;
|
|
||||||
|
|
||||||
dtd = (cmdw >> 9) & 1;
|
dtd = (cmdw >> 9) & 1;
|
||||||
dfe = (cmdw >> 10) & 1;
|
dfe = (cmdw >> 10) & 1;
|
||||||
|
|
||||||
if(TexDisableAllowChange)
|
|
||||||
{
|
|
||||||
TexDisable = (cmdw >> 11) & 1;
|
|
||||||
//printf("TexDisable: %02x\n", TexDisable);
|
|
||||||
}
|
|
||||||
|
|
||||||
RecalcTexWindowStuff();
|
|
||||||
//printf("*******************DFE: %d -- scanline=%d\n", dfe, scanline);
|
//printf("*******************DFE: %d -- scanline=%d\n", dfe, scanline);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -557,12 +582,18 @@ INLINE void PS_GPU::Command_MaskSetting(const uint32 *cb)
|
||||||
MaskEvalAND = (*cb & 2) ? 0x8000 : 0x0000;
|
MaskEvalAND = (*cb & 2) ? 0x8000 : 0x0000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INLINE void PS_GPU::InvalidateTexCache(void)
|
||||||
|
{
|
||||||
|
for(int i=0;i<ARRAY_SIZE(TexCache);i++)
|
||||||
|
TexCache[i].Tag = ~0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void PS_GPU::InvalidateCache(void)
|
void PS_GPU::InvalidateCache(void)
|
||||||
{
|
{
|
||||||
CLUT_Cache_VB = ~0U;
|
CLUT_Cache_VB = ~0U;
|
||||||
|
|
||||||
for(int i=0;i<ARRAY_SIZE(TexCache);i++)
|
InvalidateTexCache();
|
||||||
TexCache[i].Tag = ~0U;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
INLINE void PS_GPU::Command_ClearCache(const uint32 *cb)
|
INLINE void PS_GPU::Command_ClearCache(const uint32 *cb)
|
||||||
|
@ -818,14 +849,7 @@ void PS_GPU::ProcessFIFO(void)
|
||||||
//
|
//
|
||||||
// Don't alter SpriteFlip here.
|
// Don't alter SpriteFlip here.
|
||||||
//
|
//
|
||||||
const uint32 tpage = CB[4 + ((cc >> 4) & 0x1)] >> 16;
|
SetTPage(CB[4 + ((cc >> 4) & 0x1)] >> 16);
|
||||||
|
|
||||||
TexPageX = (tpage & 0xF) * 64;
|
|
||||||
TexPageY = (tpage & 0x10) * 16;
|
|
||||||
|
|
||||||
abr = (tpage >> 5) & 0x3;
|
|
||||||
TexMode = (tpage >> 7) & 0x3;
|
|
||||||
RecalcTexWindowStuff();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!command->func[abr][TexMode])
|
if(!command->func[abr][TexMode])
|
||||||
|
|
|
@ -131,8 +131,11 @@ class PS_GPU
|
||||||
uint32 Tag;
|
uint32 Tag;
|
||||||
} TexCache[256];
|
} TexCache[256];
|
||||||
|
|
||||||
|
void InvalidateTexCache(void);
|
||||||
void InvalidateCache(void);
|
void InvalidateCache(void);
|
||||||
|
|
||||||
|
void SetTPage(uint32);
|
||||||
|
|
||||||
void ProcessFIFO(void);
|
void ProcessFIFO(void);
|
||||||
void WriteCB(uint32 data);
|
void WriteCB(uint32 data);
|
||||||
uint32 ReadData(void);
|
uint32 ReadData(void);
|
||||||
|
|
|
@ -118,32 +118,32 @@ void InputDevice_Multitap::SetSubDevice(unsigned int sub_index, InputDevice *dev
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void InputDevice_Multitap::Power(void)
|
void InputDevice_Multitap::Power(void)
|
||||||
{
|
{
|
||||||
selected_device = -1;
|
selected_device = -1;
|
||||||
bit_counter = 0;
|
bit_counter = 0;
|
||||||
receive_buffer = 0;
|
receive_buffer = 0;
|
||||||
byte_counter = 0;
|
byte_counter = 0;
|
||||||
|
|
||||||
mc_mode = false;
|
mc_mode = false;
|
||||||
full_mode = false;
|
full_mode = false;
|
||||||
full_mode_setting = false;
|
full_mode_setting = false;
|
||||||
|
|
||||||
prev_fm_success = false;
|
prev_fm_success = false;
|
||||||
memset(sb, 0, sizeof(sb));
|
memset(sb, 0, sizeof(sb));
|
||||||
|
|
||||||
fm_dp = 0;
|
fm_dp = 0;
|
||||||
memset(fm_buffer, 0, sizeof(fm_buffer));
|
memset(fm_buffer, 0, sizeof(fm_buffer));
|
||||||
fm_deferred_error_temp = false;
|
fm_command_error = false;
|
||||||
|
|
||||||
for(int i = 0; i < 4; i++)
|
for(int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
if(pad_devices[i])
|
if(pad_devices[i])
|
||||||
pad_devices[i]->Power();
|
pad_devices[i]->Power();
|
||||||
|
|
||||||
if(mc_devices[i])
|
if(mc_devices[i])
|
||||||
mc_devices[i]->Power();
|
mc_devices[i]->Power();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//void InputDevice_Multitap::StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix)
|
//void InputDevice_Multitap::StateAction(StateMem* sm, const unsigned load, const bool data_only, const char* sname_prefix)
|
||||||
|
|
|
@ -46,8 +46,6 @@ class InputDevice_Multitap final : public InputDevice
|
||||||
|
|
||||||
uint8 sb[4][8];
|
uint8 sb[4][8];
|
||||||
|
|
||||||
bool fm_deferred_error_temp;
|
|
||||||
bool fm_deferred_error;
|
|
||||||
bool fm_command_error;
|
bool fm_command_error;
|
||||||
|
|
||||||
uint8 command;
|
uint8 command;
|
||||||
|
|
|
@ -403,7 +403,7 @@ void PSX_RequestMLExit(void)
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
// Remember to update MemPeek<>() when we change address decoding in MemRW()
|
// 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 ×tamp, uint32 A, uint32 &V)
|
template<typename T, bool IsWrite, bool Access24> static INLINE void MemRW(pscpu_timestamp_t ×tamp, uint32 A, uint32 &V)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -918,6 +918,60 @@ uint32 PSX_MemPeek32(uint32 A)
|
||||||
return MemPeek<uint32, false>(0, A);
|
return MemPeek<uint32, false>(0, A);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T, bool Access24> static INLINE void MemPoke(pscpu_timestamp_t timestamp, uint32 A, T V)
|
||||||
|
{
|
||||||
|
if(A < 0x00800000)
|
||||||
|
{
|
||||||
|
if(Access24)
|
||||||
|
MainRAM.WriteU24(A & 0x1FFFFF, V);
|
||||||
|
else
|
||||||
|
MainRAM.Write<T>(A & 0x1FFFFF, V);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(A >= 0x1FC00000 && A <= 0x1FC7FFFF)
|
||||||
|
{
|
||||||
|
if(Access24)
|
||||||
|
BIOSROM->WriteU24(A & 0x7FFFF, V);
|
||||||
|
else
|
||||||
|
BIOSROM->Write<T>(A & 0x7FFFF, V);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(A >= 0x1F801000 && A <= 0x1F802FFF)
|
||||||
|
{
|
||||||
|
if(A >= 0x1F801000 && A <= 0x1F801023)
|
||||||
|
{
|
||||||
|
unsigned index = (A & 0x1F) >> 2;
|
||||||
|
SysControl.Regs[index] = (V << ((A & 3) * 8)) & SysControl_Mask[index];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(A == 0xFFFE0130)
|
||||||
|
{
|
||||||
|
CPU->SetBIU(V);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PSX_MemPoke8(uint32 A, uint8 V)
|
||||||
|
{
|
||||||
|
MemPoke<uint8, false>(0, A, V);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PSX_MemPoke16(uint32 A, uint16 V)
|
||||||
|
{
|
||||||
|
MemPoke<uint16, false>(0, A, V);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PSX_MemPoke32(uint32 A, uint32 V)
|
||||||
|
{
|
||||||
|
MemPoke<uint32, false>(0, A, V);
|
||||||
|
}
|
||||||
|
|
||||||
static void PSX_Power(bool powering_up)
|
static void PSX_Power(bool powering_up)
|
||||||
{
|
{
|
||||||
PSX_PRNG.ResetState(); // Should occur first!
|
PSX_PRNG.ResetState(); // Should occur first!
|
||||||
|
|
|
@ -64,11 +64,9 @@ namespace MDFN_IEN_PSX
|
||||||
uint32 PSX_MemPeek32(uint32 A);
|
uint32 PSX_MemPeek32(uint32 A);
|
||||||
|
|
||||||
// Should write to WO-locations if possible
|
// Should write to WO-locations if possible
|
||||||
#if 0
|
|
||||||
void PSX_MemPoke8(uint32 A, uint8 V);
|
void PSX_MemPoke8(uint32 A, uint8 V);
|
||||||
void PSX_MemPoke16(uint32 A, uint16 V);
|
void PSX_MemPoke16(uint32 A, uint16 V);
|
||||||
void PSX_MemPoke32(uint32 A, uint32 V);
|
void PSX_MemPoke32(uint32 A, uint32 V);
|
||||||
#endif
|
|
||||||
|
|
||||||
void PSX_RequestMLExit(void);
|
void PSX_RequestMLExit(void);
|
||||||
void ForceEventUpdates(const pscpu_timestamp_t timestamp);
|
void ForceEventUpdates(const pscpu_timestamp_t timestamp);
|
||||||
|
|
Loading…
Reference in New Issue