Skip to content

Commit

Permalink
Core: Add handler for cartridge domains
Browse files Browse the repository at this point in the history
  • Loading branch information
project64 committed Apr 25, 2022
1 parent 1975a99 commit 2f1074a
Show file tree
Hide file tree
Showing 18 changed files with 349 additions and 252 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#include "stdafx.h"
#include "CartridgeDomain1Address1Handler.h"
#include <Project64-core\N64System\N64Rom.h>

CartridgeDomain1Address1Handler::CartridgeDomain1Address1Handler(CN64Rom * DDRom) :
m_DDRom(DDRom != nullptr ? DDRom->GetRomAddress() : nullptr),
m_DDRomSize(DDRom != nullptr ? DDRom->GetRomSize() : 0)
{
}

bool CartridgeDomain1Address1Handler::Read32(uint32_t Address, uint32_t & Value)
{
if (m_DDRom != nullptr && (Address & 0xFFFFFF) < m_DDRomSize)
{
Value = *(uint32_t *)&m_DDRom[Address & 0xFFFFFF];
}
else
{
Value = ((Address & 0xFFFF) << 16) | (Address & 0xFFFF);
}
return true;
}

bool CartridgeDomain1Address1Handler::Write32(uint32_t /*Address*/, uint32_t /*Value*/, uint32_t /*Mask*/)
{
return true;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once
#include "MemoryHandler.h"

class CN64Rom;

class CartridgeDomain1Address1Handler :
public MemoryHandler
{
public:
CartridgeDomain1Address1Handler(CN64Rom * DDRom);

bool Read32(uint32_t Address, uint32_t & Value);
bool Write32(uint32_t Address, uint32_t Value, uint32_t Mask);

private:
CartridgeDomain1Address1Handler();
CartridgeDomain1Address1Handler(const CartridgeDomain1Address1Handler &);
CartridgeDomain1Address1Handler & operator=(const CartridgeDomain1Address1Handler &);

uint32_t m_DDRomSize;
uint8_t * m_DDRom;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#include "stdafx.h"
#include "CartridgeDomain1Address3Handler.h"

CartridgeDomain1Address3Handler::CartridgeDomain1Address3Handler()
{
}

bool CartridgeDomain1Address3Handler::Read32(uint32_t Address, uint32_t & Value)
{
Value = ((Address & 0xFFFF) << 16) | (Address & 0xFFFF);
return true;
}

bool CartridgeDomain1Address3Handler::Write32(uint32_t Address, uint32_t Value, uint32_t Mask)
{
return true;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#pragma once
#include "MemoryHandler.h"

class CartridgeDomain1Address3Handler :
public MemoryHandler
{
public:
CartridgeDomain1Address3Handler();

bool Read32(uint32_t Address, uint32_t & Value);
bool Write32(uint32_t Address, uint32_t Value, uint32_t Mask);

private:
CartridgeDomain1Address3Handler(const CartridgeDomain1Address3Handler &);
CartridgeDomain1Address3Handler & operator=(const CartridgeDomain1Address3Handler &);
};
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ class CartridgeDomain2Address1Handler :
{
public:
CartridgeDomain2Address1Handler(CRegisters & Reg);

bool Read32(uint32_t Address, uint32_t & Value);
bool Write32(uint32_t Address, uint32_t Value, uint32_t Mask);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
#include "stdafx.h"
#include "CartridgeDomain2Address2Handler.h"
#include <Project64-core\N64System\N64System.h>

CartridgeDomain2Address2Handler::CartridgeDomain2Address2Handler(CN64System & System, CRegisters & Reg, CMipsMemoryVM & MMU, bool SavesReadOnly) :
m_System(System),
m_Reg(Reg),
m_MMU(MMU),
m_Sram(SavesReadOnly),
m_FlashRam(SavesReadOnly)
{
}

bool CartridgeDomain2Address2Handler::Read32(uint32_t Address, uint32_t & Value)
{
uint32_t offset = (Address & 0x1FFFFFFF) - 0x08000000;
if (offset > 0x88000)
{
Value = ((offset & 0xFFFF) << 16) | (offset & 0xFFFF);
return true;
}
if (m_System.m_SaveUsing == SaveChip_Auto)
{
m_System.m_SaveUsing = SaveChip_FlashRam;
}
if (m_System.m_SaveUsing == SaveChip_Sram)
{
// Load SRAM
uint8_t tmp[4] = "";
m_Sram.DmaFromSram(tmp, offset, 4);
Value = tmp[3] << 24 | tmp[2] << 16 | tmp[1] << 8 | tmp[0];
}
else if (m_System.m_SaveUsing != SaveChip_FlashRam)
{
if (HaveDebugger())
{
g_Notify->BreakPoint(__FILE__, __LINE__);
}
Value = ((Address & 0xFFFF) << 16) | (Address & 0xFFFF);
}
else
{
Value = m_FlashRam.ReadFromFlashStatus(Address & 0x1FFFFFFF);
}
return true;
}

bool CartridgeDomain2Address2Handler::Write32(uint32_t Address, uint32_t Value, uint32_t /*Mask*/)
{
uint32_t offset = (Address & 0x1FFFFFFF) - 0x08000000;
if (m_System.m_SaveUsing == SaveChip_Sram && offset < 0x88000)
{
// Store SRAM
uint8_t tmp[4] = "";
tmp[0] = 0xFF & (Value);
tmp[1] = 0xFF & (Value >> 8);
tmp[2] = 0xFF & (Value >> 16);
tmp[3] = 0xFF & (Value >> 24);
m_Sram.DmaToSram(tmp, (Address & 0x1FFFFFFF) - 0x08000000, 4);
return true;
}
if (offset > 0x10000)
{
return true;
}
if (m_System.m_SaveUsing == SaveChip_Auto)
{
m_System.m_SaveUsing = SaveChip_FlashRam;
}
if (m_System.m_SaveUsing == SaveChip_FlashRam)
{
m_FlashRam.WriteToFlashCommand(Value);
}
return true;
}

bool CartridgeDomain2Address2Handler::DMARead()
{
if (m_System.m_SaveUsing == SaveChip_Auto)
{
m_System.m_SaveUsing = SaveChip_Sram;
}
if (m_System.m_SaveUsing == SaveChip_Sram)
{
m_Sram.DmaToSram(m_MMU.Rdram() + m_Reg.PI_DRAM_ADDR_REG,m_Reg.PI_CART_ADDR_REG - 0x08000000, m_Reg.PI_RD_LEN_REG);
m_Reg.PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
m_Reg.MI_INTR_REG |= MI_INTR_PI;
m_Reg.CheckInterrupts();
return true;
}
else if (m_System.m_SaveUsing == SaveChip_FlashRam)
{
m_FlashRam.DmaToFlashram(m_MMU.Rdram() + m_Reg.PI_DRAM_ADDR_REG, m_Reg.PI_CART_ADDR_REG - 0x08000000, m_Reg.PI_RD_LEN_REG);
m_Reg.PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
m_Reg.MI_INTR_REG |= MI_INTR_PI;
m_Reg.CheckInterrupts();
return true;
}
return false;
}

void CartridgeDomain2Address2Handler::DMAWrite()
{
if (m_System.m_SaveUsing == SaveChip_Auto)
{
m_System.m_SaveUsing = SaveChip_Sram;
}
if (m_System.m_SaveUsing == SaveChip_Sram)
{
m_Sram.DmaFromSram(m_MMU.Rdram() + m_Reg.PI_DRAM_ADDR_REG, m_Reg.PI_CART_ADDR_REG - 0x08000000, m_Reg.PI_WR_LEN_REG);
m_Reg.PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
m_Reg.MI_INTR_REG |= MI_INTR_PI;
m_Reg.CheckInterrupts();
}
else if (m_System.m_SaveUsing == SaveChip_FlashRam)
{
m_FlashRam.DmaFromFlashram(m_MMU.Rdram() + m_Reg.PI_DRAM_ADDR_REG, m_Reg.PI_CART_ADDR_REG - 0x08000000, m_Reg.PI_WR_LEN_REG);
m_Reg.PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
m_Reg.MI_INTR_REG |= MI_INTR_PI;
m_Reg.CheckInterrupts();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#pragma once
#include <Project64-core\N64System\SaveType\Sram.h>
#include <Project64-core\N64System\SaveType\FlashRam.h>
#include <Project64-core\Settings\DebugSettings.h>
#include "MemoryHandler.h"

class CN64System;
class CMipsMemoryVM;
class CRegisters;

class CartridgeDomain2Address2Handler :
public MemoryHandler,
private CDebugSettings
{
public:
CartridgeDomain2Address2Handler(CN64System & System, CRegisters & Reg, CMipsMemoryVM & MMU, bool SavesReadOnly);

bool Read32(uint32_t Address, uint32_t & Value);
bool Write32(uint32_t Address, uint32_t Value, uint32_t Mask);

bool DMARead();
void DMAWrite();

CSram & Sram(void) { return m_Sram; }
CFlashRam & FlashRam (void) { return m_FlashRam; }

private:
CartridgeDomain2Address2Handler(void);
CartridgeDomain2Address2Handler(const CartridgeDomain2Address2Handler &);
CartridgeDomain2Address2Handler & operator=(const CartridgeDomain2Address2Handler &);

CN64System & m_System;
CRegisters & m_Reg;
CMipsMemoryVM & m_MMU;
CSram m_Sram;
CFlashRam m_FlashRam;
};
59 changes: 4 additions & 55 deletions Source/Project64-core/N64System/Mips/Dma.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@
#include <Project64-core/N64System/N64System.h>
#include <Project64-core/Debugger.h>

CDMA::CDMA(CFlashram & FlashRam, CSram & Sram) :
m_FlashRam(FlashRam),
m_Sram(Sram)
CDMA::CDMA(CartridgeDomain2Address2Handler & Domain2Address2Handler) :
m_Domain2Address2Handler(Domain2Address2Handler)
{
}

Expand Down Expand Up @@ -148,32 +147,8 @@ void CDMA::PI_DMA_READ()

if (g_Reg->PI_CART_ADDR_REG >= 0x08000000 && g_Reg->PI_CART_ADDR_REG < 0x08088000)
{
if (g_System->m_SaveUsing == SaveChip_Auto)
if (m_Domain2Address2Handler.DMARead())
{
g_System->m_SaveUsing = SaveChip_Sram;
}
if (g_System->m_SaveUsing == SaveChip_Sram)
{
m_Sram.DmaToSram(
g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG,
g_Reg->PI_CART_ADDR_REG - 0x08000000,
PI_RD_LEN_REG
);
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
g_Reg->MI_INTR_REG |= MI_INTR_PI;
g_Reg->CheckInterrupts();
return;
}
if (g_System->m_SaveUsing == SaveChip_FlashRam)
{
m_FlashRam.DmaToFlashram(
g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG,
g_Reg->PI_CART_ADDR_REG - 0x08000000,
PI_RD_LEN_REG
);
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
g_Reg->MI_INTR_REG |= MI_INTR_PI;
g_Reg->CheckInterrupts();
return;
}
}
Expand Down Expand Up @@ -318,33 +293,7 @@ void CDMA::PI_DMA_WRITE()

if (PI_CART_ADDR_REG >= 0x08000000 && PI_CART_ADDR_REG <= 0x08088000)
{
if (g_System->m_SaveUsing == SaveChip_Auto)
{
g_System->m_SaveUsing = SaveChip_Sram;
}
if (g_System->m_SaveUsing == SaveChip_Sram)
{
m_Sram.DmaFromSram(
g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG,
PI_CART_ADDR_REG - 0x08000000,
PI_WR_LEN_REG
);
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
g_Reg->MI_INTR_REG |= MI_INTR_PI;
g_Reg->CheckInterrupts();
return;
}
if (g_System->m_SaveUsing == SaveChip_FlashRam)
{
m_FlashRam.DmaFromFlashram(
g_MMU->Rdram() + g_Reg->PI_DRAM_ADDR_REG,
PI_CART_ADDR_REG - 0x08000000,
PI_WR_LEN_REG
);
g_Reg->PI_STATUS_REG &= ~PI_STATUS_DMA_BUSY;
g_Reg->MI_INTR_REG |= MI_INTR_PI;
g_Reg->CheckInterrupts();
}
m_Domain2Address2Handler.DMAWrite();
return;
}

Expand Down
11 changes: 5 additions & 6 deletions Source/Project64-core/N64System/Mips/Dma.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#pragma once
#include <Project64-core\Settings\DebugSettings.h>
#include <Project64-core\N64System\SaveType\FlashRam.h>
#include <Project64-core\N64System\SaveType\Sram.h>

class CartridgeDomain2Address2Handler;

class CDMA :
private CDebugSettings
Expand All @@ -14,14 +14,13 @@ class CDMA :
void PI_DMA_WRITE();

protected:
CDMA(CFlashram & FlashRam, CSram & Sram);
CDMA(CartridgeDomain2Address2Handler & Domain2Address2Handler);

private:
CDMA(const CDMA&);
CDMA& operator=(const CDMA&);

CFlashram & m_FlashRam;
CSram & m_Sram;

void OnFirstDMA();

CartridgeDomain2Address2Handler & m_Domain2Address2Handler;
};
Loading

0 comments on commit 2f1074a

Please sign in to comment.