project64/Source/Project64/N64 System/Mips/TLB Class.h

145 lines
3.0 KiB
C++

/****************************************************************************
* *
* Project 64 - A Nintendo 64 emulator. *
* http://www.pj64-emu.com/ *
* Copyright (C) 2012 Project64. All rights reserved. *
* *
* License: *
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
* *
****************************************************************************/
#pragma once
class CDebugTlb;
class CTLB_CB
{
public:
virtual void TLB_Mapped(DWORD VAddr, DWORD Len, DWORD PAddr, bool bReadOnly) = 0;
virtual void TLB_Unmaped(DWORD VAddr, DWORD Len) = 0;
virtual void TLB_Changed() = 0;
};
class CTLB :
protected CSystemRegisters
{
public:
struct TLB_ENTRY
{
bool EntryDefined;
union
{
unsigned long Value;
unsigned char A[4];
struct
{
unsigned zero : 13;
unsigned Mask : 12;
unsigned zero2 : 7;
} ;
} PageMask;
union
{
unsigned long Value;
unsigned char A[4];
struct
{
unsigned ASID : 8;
unsigned Zero : 4;
unsigned G : 1;
unsigned VPN2 : 19;
};
} EntryHi;
union
{
unsigned long Value;
unsigned char A[4];
struct
{
unsigned GLOBAL: 1;
unsigned V : 1;
unsigned D : 1;
unsigned C : 3;
unsigned PFN : 20;
unsigned ZERO: 6;
} ;
} EntryLo0;
union
{
unsigned long Value;
unsigned char A[4];
struct
{
unsigned GLOBAL: 1;
unsigned V : 1;
unsigned D : 1;
unsigned C : 3;
unsigned PFN : 20;
unsigned ZERO: 6;
} ;
} EntryLo1;
};
public:
CTLB(CTLB_CB * CallBack);
~CTLB();
void Reset(bool InvalidateTLB);
//Used by opcodes of the same name to manipulate the tlb (reads the registers)
void Probe();
void ReadEntry();
void WriteEntry(int index, bool Random);
//See if a VAddr has an entry to translate to a PAddr
bool AddressDefined(DWORD VAddr);
const TLB_ENTRY & TlbEntry(int Entry) const
{
return m_tlb[Entry];
}
bool PAddrToVAddr(DWORD PAddr, DWORD & VAddr, DWORD & Index);
void RecordDifference(CLog &LogFile, const CTLB& rTLB);
bool operator == (const CTLB& rTLB) const;
bool operator != (const CTLB& rTLB) const;
private:
struct FASTTLB
{
DWORD VSTART;
DWORD VEND;
DWORD PHYSSTART;
DWORD PHYSEND;
DWORD Length;
bool VALID;
bool DIRTY;
bool GLOBAL;
bool ValidEntry;
bool Random;
bool Probed;
};
friend CDebugTlb; // enable debug window to read class
CTLB_CB * const m_CB;
TLB_ENTRY m_tlb[32];
FASTTLB m_FastTlb[64];
void SetupTLB_Entry(int index, bool Random);
};