Core: Handle rom written to better
This commit is contained in:
parent
d6a217ca86
commit
cffeceef70
|
@ -1,8 +1,10 @@
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "CartridgeDomain1Address1Handler.h"
|
#include "CartridgeDomain1Address1Handler.h"
|
||||||
|
#include <Project64-core\N64System\Mips\Register.h>
|
||||||
#include <Project64-core\N64System\N64Rom.h>
|
#include <Project64-core\N64System\N64Rom.h>
|
||||||
|
|
||||||
CartridgeDomain1Address1Handler::CartridgeDomain1Address1Handler(CN64Rom * DDRom) :
|
CartridgeDomain1Address1Handler::CartridgeDomain1Address1Handler(CRegisters & Reg, CN64Rom * DDRom) :
|
||||||
|
m_Reg(Reg),
|
||||||
m_DDRom(DDRom != nullptr ? DDRom->GetRomAddress() : nullptr),
|
m_DDRom(DDRom != nullptr ? DDRom->GetRomAddress() : nullptr),
|
||||||
m_DDRomSize(DDRom != nullptr ? DDRom->GetRomSize() : 0)
|
m_DDRomSize(DDRom != nullptr ? DDRom->GetRomSize() : 0)
|
||||||
{
|
{
|
||||||
|
@ -16,6 +18,7 @@ bool CartridgeDomain1Address1Handler::Read32(uint32_t Address, uint32_t & Value)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
m_Reg.PI_CART_ADDR_REG = (Address + 4) & ~1;
|
||||||
Value = ((Address & 0xFFFF) << 16) | (Address & 0xFFFF);
|
Value = ((Address & 0xFFFF) << 16) | (Address & 0xFFFF);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "MemoryHandler.h"
|
#include "MemoryHandler.h"
|
||||||
|
|
||||||
|
class CRegisters;
|
||||||
class CN64Rom;
|
class CN64Rom;
|
||||||
|
|
||||||
class CartridgeDomain1Address1Handler :
|
class CartridgeDomain1Address1Handler :
|
||||||
public MemoryHandler
|
public MemoryHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CartridgeDomain1Address1Handler(CN64Rom * DDRom);
|
CartridgeDomain1Address1Handler(CRegisters & Reg, CN64Rom * DDRom);
|
||||||
|
|
||||||
bool Read32(uint32_t Address, uint32_t & Value);
|
bool Read32(uint32_t Address, uint32_t & Value);
|
||||||
bool Write32(uint32_t Address, uint32_t Value, uint32_t Mask);
|
bool Write32(uint32_t Address, uint32_t Value, uint32_t Mask);
|
||||||
|
@ -17,6 +18,7 @@ private:
|
||||||
CartridgeDomain1Address1Handler(const CartridgeDomain1Address1Handler &);
|
CartridgeDomain1Address1Handler(const CartridgeDomain1Address1Handler &);
|
||||||
CartridgeDomain1Address1Handler & operator=(const CartridgeDomain1Address1Handler &);
|
CartridgeDomain1Address1Handler & operator=(const CartridgeDomain1Address1Handler &);
|
||||||
|
|
||||||
|
CRegisters & m_Reg;
|
||||||
uint32_t m_DDRomSize;
|
uint32_t m_DDRomSize;
|
||||||
uint8_t * m_DDRom;
|
uint8_t * m_DDRom;
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,43 +18,43 @@ RomMemoryHandler::RomMemoryHandler(CN64System & System, CRegisters & Reg, CN64Ro
|
||||||
|
|
||||||
bool RomMemoryHandler::Read32(uint32_t Address, uint32_t & Value)
|
bool RomMemoryHandler::Read32(uint32_t Address, uint32_t & Value)
|
||||||
{
|
{
|
||||||
|
uint32_t ReadAddr = (Address + 2) & ~0x3;
|
||||||
|
|
||||||
if (g_DDRom == nullptr)
|
if (g_DDRom == nullptr)
|
||||||
{
|
{
|
||||||
m_Reg.PI_CART_ADDR_REG = Address + 4;
|
m_Reg.PI_CART_ADDR_REG = (Address + 4) & ~1;
|
||||||
}
|
}
|
||||||
if (m_RomWrittenTo)
|
if (m_RomWrittenTo)
|
||||||
{
|
{
|
||||||
Value = m_RomWroteValue;
|
Value = m_RomWroteValue;
|
||||||
//LogMessage("%X: Read crap from ROM %08X from %08X",PROGRAM_COUNTER,*Value,PAddr);
|
|
||||||
m_RomWrittenTo = false;
|
m_RomWrittenTo = false;
|
||||||
}
|
}
|
||||||
else if ((Address & 0xFFFFFFF) < m_Rom.GetRomSize())
|
else if ((Address & 0xFFFFFFF) < m_Rom.GetRomSize())
|
||||||
{
|
{
|
||||||
Value = *(uint32_t *)&m_Rom.GetRomAddress()[(Address & 0xFFFFFFF)];
|
Value = *(uint32_t *)&m_Rom.GetRomAddress()[(ReadAddr & 0xFFFFFFF)];
|
||||||
}
|
if (LogRomHeader() && (ReadAddr & 0x1FFFFFFF) >= 0x10000000 && (ReadAddr & 0x1FFFFFFF) < 0x10000040)
|
||||||
else
|
|
||||||
{
|
{
|
||||||
Value = (Address << 16) | (Address & 0xFFFF);
|
switch (ReadAddr & 0x1FFFFFFF)
|
||||||
}
|
|
||||||
|
|
||||||
if (LogRomHeader() && (Address & 0x1FFFFFFF) >= 0x10000000 && (Address & 0x1FFFFFFF) < 0x10000040)
|
|
||||||
{
|
|
||||||
switch (Address & 0x1FFFFFFF)
|
|
||||||
{
|
{
|
||||||
case 0x10000004: LogMessage("%08X: read from ROM clock rate (%08X)", m_PC, Value); break;
|
case 0x10000004: LogMessage("%08X: read from ROM clock rate (%08X)", m_PC, Value); break;
|
||||||
case 0x10000008: LogMessage("%08X: read from ROM boot address offset (%08X)", m_PC, Value); break;
|
case 0x10000008: LogMessage("%08X: read from ROM boot address offset (%08X)", m_PC, Value); break;
|
||||||
case 0x1000000C: LogMessage("%08X: read from ROM release offset (%08X)", m_PC, Value); break;
|
case 0x1000000C: LogMessage("%08X: read from ROM release offset (%08X)", m_PC, Value); break;
|
||||||
case 0x10000010: LogMessage("%08X: read from ROM CRC1 (%08X)", m_PC, Value); break;
|
case 0x10000010: LogMessage("%08X: read from ROM CRC1 (%08X)", m_PC, Value); break;
|
||||||
case 0x10000014: LogMessage("%08X: read from ROM CRC2 (%08X)", m_PC, Value); break;
|
case 0x10000014: LogMessage("%08X: read from ROM CRC2 (%08X)", m_PC, Value); break;
|
||||||
default: LogMessage("%08X: read from ROM header 0x%X (%08X)", m_PC, Address & 0xFF, Value); break;
|
default: LogMessage("%08X: read from ROM header 0x%X (%08X)", m_PC, ReadAddr & 0xFF, Value); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Value = (Address << 16) | (Address & 0xFFFF);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RomMemoryHandler::Write32(uint32_t Address, uint32_t Value, uint32_t Mask)
|
bool RomMemoryHandler::Write32(uint32_t /*Address*/, uint32_t Value, uint32_t Mask)
|
||||||
{
|
{
|
||||||
if (((Address & 0x1FFFFFFF) - 0x10000000) < m_Rom.GetRomSize())
|
if (!m_RomWrittenTo)
|
||||||
{
|
{
|
||||||
m_RomWrittenTo = true;
|
m_RomWrittenTo = true;
|
||||||
m_RomWroteValue = (Value & Mask);
|
m_RomWroteValue = (Value & Mask);
|
||||||
|
|
|
@ -22,7 +22,7 @@ CMipsMemoryVM::CMipsMemoryVM(CN64System & System, bool SavesReadOnly) :
|
||||||
m_System(System),
|
m_System(System),
|
||||||
m_Reg(System.m_Reg),
|
m_Reg(System.m_Reg),
|
||||||
m_AudioInterfaceHandler(System, System.m_Reg),
|
m_AudioInterfaceHandler(System, System.m_Reg),
|
||||||
m_CartridgeDomain1Address1Handler(g_DDRom),
|
m_CartridgeDomain1Address1Handler(System.m_Reg, g_DDRom),
|
||||||
m_CartridgeDomain2Address1Handler(System.m_Reg),
|
m_CartridgeDomain2Address1Handler(System.m_Reg),
|
||||||
m_CartridgeDomain2Address2Handler(System, System.m_Reg, *this, SavesReadOnly),
|
m_CartridgeDomain2Address2Handler(System, System.m_Reg, *this, SavesReadOnly),
|
||||||
m_RDRAMRegistersHandler(System.m_Reg),
|
m_RDRAMRegistersHandler(System.m_Reg),
|
||||||
|
@ -602,7 +602,7 @@ bool CMipsMemoryVM::LB_NonMemory(uint32_t VAddr, uint8_t & Value)
|
||||||
else if (PAddr >= 0x10000000 && PAddr < 0x16000000)
|
else if (PAddr >= 0x10000000 && PAddr < 0x16000000)
|
||||||
{
|
{
|
||||||
uint32_t Value32;
|
uint32_t Value32;
|
||||||
if (!m_RomMemoryHandler.Read32((PAddr + 2) & ~0x3, Value32))
|
if (!m_RomMemoryHandler.Read32(PAddr, Value32))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -635,7 +635,7 @@ bool CMipsMemoryVM::LH_NonMemory(uint32_t VAddr, uint16_t & Value)
|
||||||
else if (PAddr >= 0x10000000 && PAddr < 0x16000000)
|
else if (PAddr >= 0x10000000 && PAddr < 0x16000000)
|
||||||
{
|
{
|
||||||
uint32_t Value32;
|
uint32_t Value32;
|
||||||
if (!m_RomMemoryHandler.Read32((PAddr + 2) & ~0x3, Value32))
|
if (!m_RomMemoryHandler.Read32(PAddr, Value32))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue