64DD RTC support, Enable Disk setting
This commit is contained in:
parent
4fb6c2219d
commit
530ef48eb2
|
@ -0,0 +1,84 @@
|
|||
/****************************************************************************
|
||||
* *
|
||||
* Project64 - 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
|
||||
#include "stdafx.h"
|
||||
#include <Project64-core/N64System/SystemGlobals.h>
|
||||
#include <Project64-core/N64System/Mips/RegisterClass.h>
|
||||
|
||||
void DiskCommand()
|
||||
{
|
||||
//ASIC_CMD_STATUS - Commands
|
||||
uint32_t cmd = g_Reg->ASIC_CMD;
|
||||
|
||||
#ifdef _WIN32
|
||||
SYSTEMTIME sysTime;
|
||||
::GetLocalTime(&sysTime);
|
||||
//stdstr_f timestamp("%04d/%02d/%02d %02d:%02d:%02d.%03d %05d,", sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds, GetCurrentThreadId());
|
||||
|
||||
//BCD format needed for 64DD RTC
|
||||
uint8_t year = (uint8_t)(((sysTime.wYear / 10) << 4) | (sysTime.wYear % 10));
|
||||
uint8_t month = (uint8_t)(((sysTime.wMonth / 10) << 4) | (sysTime.wMonth % 10));
|
||||
uint8_t day = (uint8_t)(((sysTime.wDay / 10) << 4) | (sysTime.wDay % 10));
|
||||
uint8_t hour = (uint8_t)(((sysTime.wHour / 10) << 4) | (sysTime.wHour % 10));
|
||||
uint8_t minute = (uint8_t)(((sysTime.wMinute / 10) << 4) | (sysTime.wMinute % 10));
|
||||
uint8_t second = (uint8_t)(((sysTime.wSecond / 10) << 4) | (sysTime.wSecond % 10));
|
||||
#else
|
||||
time_t ltime;
|
||||
ltime = time(<ime);
|
||||
|
||||
struct tm result = { 0 };
|
||||
localtime_r(<ime, &result);
|
||||
|
||||
//stdstr_f timestamp("%04d/%02d/%02d %02d:%02d:%02d.%03d %05d,", result.tm_year + 1900, result.tm_mon + 1, result.tm_mday, result.tm_hour, result.tm_min, result.tm_sec, milliseconds, GetCurrentThreadId());
|
||||
|
||||
//BCD format needed for 64DD RTC
|
||||
uint8_t year = (uint8_t)(((result.tm_year / 10) << 4) | (result.tm_year % 10));
|
||||
uint8_t month = (uint8_t)(((result.tm_mon / 10) << 4) | (result.tm_mon % 10));
|
||||
uint8_t day = (uint8_t)(((result.tm_mday / 10) << 4) | (result.tm_mday % 10));
|
||||
uint8_t hour = (uint8_t)(((result.tm_hour / 10) << 4) | (result.tm_hour % 10));
|
||||
uint8_t minute = (uint8_t)(((result.tm_min / 10) << 4) | (result.tm_min % 10));
|
||||
uint8_t second = (uint8_t)(((result.tm_sec / 10) << 4) | (result.tm_sec % 10));
|
||||
#endif
|
||||
|
||||
switch (cmd & 0xFFFF0000)
|
||||
{
|
||||
case 0x00080000:
|
||||
//Unset Disk Changed Bit
|
||||
g_Reg->ASIC_STATUS &= ~DD_STATUS_DISK_CHNG; break;
|
||||
case 0x00090000:
|
||||
//Unset Reset Bit
|
||||
g_Reg->ASIC_STATUS &= ~DD_STATUS_RST_STATE; break;
|
||||
case 0x00120000:
|
||||
//RTC Get Year & Month
|
||||
g_Reg->ASIC_DATA = (year << 24) | (month << 16); break;
|
||||
case 0x00130000:
|
||||
//RTC Get Day & Hour
|
||||
g_Reg->ASIC_DATA = (day << 24) | (hour << 16); break;
|
||||
case 0x00140000:
|
||||
//RTC Get Minute & Second
|
||||
g_Reg->ASIC_DATA = (minute << 24) | (second << 16); break;
|
||||
}
|
||||
}
|
||||
|
||||
void DiskReset(void)
|
||||
{
|
||||
//ASIC_HARD_RESET 0xAAAA0000
|
||||
g_Reg->ASIC_STATUS |= DD_STATUS_RST_STATE;
|
||||
}
|
||||
|
||||
void DiskBMControl(void)
|
||||
{
|
||||
if (g_Reg->ASIC_BM_CTL & DD_BM_CTL_MECHA_RST)
|
||||
{
|
||||
g_Reg->ASIC_STATUS &= ~DD_STATUS_MECHA_INT;
|
||||
g_Reg->FAKE_CAUSE_REGISTER &= ~CAUSE_IP3;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
/****************************************************************************
|
||||
* *
|
||||
* Project64 - 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
|
||||
#include "stdafx.h"
|
||||
|
||||
void DiskCommand(void);
|
||||
void DiskReset(void);
|
||||
void DiskBMControl(void);
|
|
@ -16,11 +16,18 @@
|
|||
#include <Project64-core/N64System/N64Class.h>
|
||||
#include <Project64-core/N64System/Recompiler/x86CodeLog.h>
|
||||
#include <Project64-core/N64System/Mips/OpcodeName.h>
|
||||
#include <Project64-core/N64System/Mips/Disk.h>
|
||||
#include <Project64-core/ExceptionHandler.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <Common/MemoryManagement.h>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <Windows.h>
|
||||
#else
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
uint32_t RegModValue;
|
||||
|
||||
uint8_t * CMipsMemoryVM::m_Reserve1 = NULL;
|
||||
|
@ -944,6 +951,40 @@ void CMipsMemoryVM::Compile_LW(x86Reg Reg, uint32_t VAddr)
|
|||
}
|
||||
}
|
||||
break;
|
||||
case 0x05000000:
|
||||
//64DD Registers
|
||||
if (g_Settings->LoadBool(Setting_EnableDisk))
|
||||
{
|
||||
switch (PAddr)
|
||||
{
|
||||
case 0x05000500: MoveVariableToX86reg(&g_Reg->ASIC_DATA, "ASIC_DATA", Reg); break;
|
||||
case 0x05000504: MoveVariableToX86reg(&g_Reg->ASIC_MISC_REG, "ASIC_MISC_REG", Reg); break;
|
||||
case 0x05000508: MoveVariableToX86reg(&g_Reg->ASIC_STATUS, "ASIC_STATUS", Reg); break;
|
||||
case 0x0500050C: MoveVariableToX86reg(&g_Reg->ASIC_CUR_TK, "ASIC_CUR_TK", Reg); break;
|
||||
case 0x05000510: MoveVariableToX86reg(&g_Reg->ASIC_BM_STATUS, "ASIC_BM_STATUS", Reg); break;
|
||||
case 0x05000514: MoveVariableToX86reg(&g_Reg->ASIC_ERR_SECTOR, "ASIC_ERR_SECTOR", Reg); break;
|
||||
case 0x05000518: MoveVariableToX86reg(&g_Reg->ASIC_SEQ_STATUS, "ASIC_SEQ_STATUS", Reg); break;
|
||||
case 0x0500051C: MoveVariableToX86reg(&g_Reg->ASIC_CUR_SECTOR, "ASIC_CUR_SECTOR", Reg); break;
|
||||
case 0x05000520: MoveVariableToX86reg(&g_Reg->ASIC_HARD_RESET, "ASIC_HARD_RESET", Reg); break;
|
||||
case 0x05000524: MoveVariableToX86reg(&g_Reg->ASIC_C1_S0, "ASIC_C1_S0", Reg); break;
|
||||
case 0x05000528: MoveVariableToX86reg(&g_Reg->ASIC_HOST_SECBYTE, "ASIC_HOST_SECBYTE", Reg); break;
|
||||
case 0x0500052C: MoveVariableToX86reg(&g_Reg->ASIC_C1_S2, "ASIC_C1_S2", Reg); break;
|
||||
case 0x05000530: MoveVariableToX86reg(&g_Reg->ASIC_SEC_BYTE, "ASIC_SEC_BYTE", Reg); break;
|
||||
case 0x05000534: MoveVariableToX86reg(&g_Reg->ASIC_C1_S4, "ASIC_C1_S4", Reg); break;
|
||||
case 0x05000538: MoveVariableToX86reg(&g_Reg->ASIC_C1_S6, "ASIC_C1_S6", Reg); break;
|
||||
case 0x0500053C: MoveVariableToX86reg(&g_Reg->ASIC_CUR_ADDR, "ASIC_CUR_ADDR", Reg); break;
|
||||
case 0x05000540: MoveVariableToX86reg(&g_Reg->ASIC_ID_REG, "ASIC_ID_REG", Reg); break;
|
||||
case 0x05000544: MoveVariableToX86reg(&g_Reg->ASIC_TEST_REG, "ASIC_TEST_REG", Reg); break;
|
||||
case 0x05000548: MoveVariableToX86reg(&g_Reg->ASIC_TEST_PIN_SEL, "ASIC_TEST_PIN_SEL", Reg); break;
|
||||
default:
|
||||
MoveConstToX86reg(0, Reg);
|
||||
if (g_Settings->LoadBool(Debugger_ShowUnhandledMemory))
|
||||
{
|
||||
g_Notify->DisplayError(stdstr_f("%s\nFailed to translate address: %08X", __FUNCTION__, VAddr).c_str());
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 0x1FC00000:
|
||||
sprintf(VarName, "m_RDRAM + %X", PAddr);
|
||||
MoveVariableToX86reg(PAddr + m_RDRAM, VarName, Reg);
|
||||
|
@ -1975,6 +2016,49 @@ void CMipsMemoryVM::Compile_SW_Register(x86Reg Reg, uint32_t VAddr)
|
|||
}
|
||||
}
|
||||
break;
|
||||
case 0x05000000:
|
||||
//64DD Registers
|
||||
if (g_Settings->LoadBool(Setting_EnableDisk))
|
||||
{
|
||||
switch (PAddr)
|
||||
{
|
||||
case 0x05000500: MoveX86regToVariable(Reg, &g_Reg->ASIC_DATA, "ASIC_DATA"); break;
|
||||
case 0x05000508:
|
||||
{
|
||||
//ASIC_CMD
|
||||
MoveX86regToVariable(Reg, &g_Reg->ASIC_CMD, "ASIC_CMD");
|
||||
BeforeCallDirect(m_RegWorkingSet);
|
||||
Call_Direct(AddressOf(&DiskCommand), "DiskCommand");
|
||||
AfterCallDirect(m_RegWorkingSet);
|
||||
OrConstToVariable((uint32_t)DD_STATUS_MECHA_INT, &g_Reg->ASIC_STATUS, "ASIC_STATUS");
|
||||
OrConstToVariable((uint32_t)CAUSE_IP3, &g_Reg->FAKE_CAUSE_REGISTER, "FAKE_CAUSE_REGISTER");
|
||||
BeforeCallDirect(m_RegWorkingSet);
|
||||
Call_Direct(AddressOf(&CRegisters::CheckInterrupts), "CRegisters::CheckInterrupts");
|
||||
AfterCallDirect(m_RegWorkingSet);
|
||||
break;
|
||||
}
|
||||
case 0x05000510:
|
||||
{
|
||||
//ASIC_BM_CTL
|
||||
MoveX86regToVariable(Reg, &g_Reg->ASIC_BM_CTL, "ASIC_BM_CTL");
|
||||
BeforeCallDirect(m_RegWorkingSet);
|
||||
Call_Direct(AddressOf(&DiskBMControl), "DiskBMControl");
|
||||
AfterCallDirect(m_RegWorkingSet);
|
||||
break;
|
||||
}
|
||||
case 0x05000518:
|
||||
break;
|
||||
case 0x05000520:
|
||||
BeforeCallDirect(m_RegWorkingSet);
|
||||
Call_Direct(AddressOf(&DiskReset), "DiskReset");
|
||||
AfterCallDirect(m_RegWorkingSet);
|
||||
break;
|
||||
case 0x05000528: MoveX86regToVariable(Reg, &g_Reg->ASIC_HOST_SECBYTE, "ASIC_HOST_SECBYTE"); break;
|
||||
case 0x05000530: MoveX86regToVariable(Reg, &g_Reg->ASIC_SEC_BYTE, "ASIC_SEC_BYTE"); break;
|
||||
case 0x05000548: MoveX86regToVariable(Reg, &g_Reg->ASIC_TEST_PIN_SEL, "ASIC_TEST_PIN_SEL"); break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 0x1FC00000:
|
||||
sprintf(VarName, "m_RDRAM + %X", PAddr);
|
||||
MoveX86regToVariable(Reg, PAddr + m_RDRAM, VarName);
|
||||
|
@ -2306,6 +2390,7 @@ bool CMipsMemoryVM::SW_NonMemory(uint32_t PAddr, uint32_t Value)
|
|||
case 0x04600000: Write32PeripheralInterface(); break;
|
||||
case 0x04700000: Write32RDRAMInterface(); break;
|
||||
case 0x04800000: Write32SerialInterface(); break;
|
||||
case 0x05000000: Write32CartridgeDomain2Address1(); break;
|
||||
case 0x08000000: Write32CartridgeDomain2Address2(); break;
|
||||
case 0x1FC00000: Write32PifRam(); break;
|
||||
default:
|
||||
|
@ -4735,11 +4820,43 @@ void CMipsMemoryVM::Load32CartridgeDomain1Address3(void)
|
|||
|
||||
void CMipsMemoryVM::Load32CartridgeDomain2Address1(void)
|
||||
{
|
||||
m_MemLookupValue.UW[0] = m_MemLookupAddress & 0xFFFF;
|
||||
m_MemLookupValue.UW[0] = (m_MemLookupValue.UW[0] << 16) | m_MemLookupValue.UW[0];
|
||||
if (bHaveDebugger())
|
||||
//64DD REGISTERS
|
||||
if (g_Settings->LoadBool(Setting_EnableDisk))
|
||||
{
|
||||
g_Notify->BreakPoint(__FILE__, __LINE__);
|
||||
switch (m_MemLookupAddress & 0x1FFFFFFF)
|
||||
{
|
||||
case 0x05000500: m_MemLookupValue.UW[0] = g_Reg->ASIC_DATA; break;
|
||||
case 0x05000504: m_MemLookupValue.UW[0] = g_Reg->ASIC_MISC_REG; break;
|
||||
case 0x05000508: m_MemLookupValue.UW[0] = g_Reg->ASIC_STATUS; break;
|
||||
case 0x0500050C: m_MemLookupValue.UW[0] = g_Reg->ASIC_CUR_TK; break;
|
||||
case 0x05000510: m_MemLookupValue.UW[0] = g_Reg->ASIC_BM_STATUS; break;
|
||||
case 0x05000514: m_MemLookupValue.UW[0] = g_Reg->ASIC_ERR_SECTOR; break;
|
||||
case 0x05000518: m_MemLookupValue.UW[0] = g_Reg->ASIC_SEQ_STATUS; break;
|
||||
case 0x0500051C: m_MemLookupValue.UW[0] = g_Reg->ASIC_CUR_SECTOR; break;
|
||||
case 0x05000520: m_MemLookupValue.UW[0] = g_Reg->ASIC_HARD_RESET; break;
|
||||
case 0x05000524: m_MemLookupValue.UW[0] = g_Reg->ASIC_C1_S0; break;
|
||||
case 0x05000528: m_MemLookupValue.UW[0] = g_Reg->ASIC_HOST_SECBYTE; break;
|
||||
case 0x0500052C: m_MemLookupValue.UW[0] = g_Reg->ASIC_C1_S2; break;
|
||||
case 0x05000530: m_MemLookupValue.UW[0] = g_Reg->ASIC_SEC_BYTE; break;
|
||||
case 0x05000534: m_MemLookupValue.UW[0] = g_Reg->ASIC_C1_S4; break;
|
||||
case 0x05000538: m_MemLookupValue.UW[0] = g_Reg->ASIC_C1_S6; break;
|
||||
case 0x0500053C: m_MemLookupValue.UW[0] = g_Reg->ASIC_CUR_ADDR; break;
|
||||
case 0x05000540: m_MemLookupValue.UW[0] = g_Reg->ASIC_ID_REG; break;
|
||||
case 0x05000544: m_MemLookupValue.UW[0] = g_Reg->ASIC_TEST_REG; break;
|
||||
case 0x05000548: m_MemLookupValue.UW[0] = g_Reg->ASIC_TEST_PIN_SEL; break;
|
||||
default:
|
||||
m_MemLookupValue.UW[0] = m_MemLookupAddress & 0xFFFF;
|
||||
m_MemLookupValue.UW[0] = (m_MemLookupValue.UW[0] << 16) | m_MemLookupValue.UW[0];
|
||||
if (bHaveDebugger())
|
||||
{
|
||||
g_Notify->BreakPoint(__FILE__, __LINE__);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_MemLookupValue.UW[0] = m_MemLookupAddress & 0xFFFF;
|
||||
m_MemLookupValue.UW[0] = (m_MemLookupValue.UW[0] << 16) | m_MemLookupValue.UW[0];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5372,6 +5489,42 @@ void CMipsMemoryVM::Write32SerialInterface(void)
|
|||
}
|
||||
}
|
||||
|
||||
void CMipsMemoryVM::Write32CartridgeDomain2Address1(void)
|
||||
{
|
||||
//64DD Registers
|
||||
if (g_Settings->LoadBool(Setting_EnableDisk))
|
||||
{
|
||||
switch (m_MemLookupAddress & 0xFFFFFFF)
|
||||
{
|
||||
case 0x05000500: g_Reg->ASIC_DATA = m_MemLookupValue.UW[0]; break;
|
||||
case 0x05000508:
|
||||
g_Reg->ASIC_CMD = m_MemLookupValue.UW[0];
|
||||
DiskCommand();
|
||||
g_Reg->ASIC_STATUS |= DD_STATUS_MECHA_INT;
|
||||
g_Reg->FAKE_CAUSE_REGISTER |= CAUSE_IP3;
|
||||
g_Reg->CheckInterrupts();
|
||||
break;
|
||||
case 0x05000510:
|
||||
//ASIC_BM_STATUS_CTL
|
||||
g_Reg->ASIC_BM_CTL = m_MemLookupValue.UW[0];
|
||||
DiskBMControl();
|
||||
break;
|
||||
case 0x05000518:
|
||||
//ASIC_SEQ_STATUS_CTL
|
||||
break;
|
||||
case 0x05000520: DiskReset(); break;
|
||||
case 0x05000528: g_Reg->ASIC_HOST_SECBYTE = m_MemLookupValue.UW[0]; break;
|
||||
case 0x05000530: g_Reg->ASIC_SEC_BYTE = m_MemLookupValue.UW[0]; break;
|
||||
case 0x05000548: g_Reg->ASIC_TEST_PIN_SEL = m_MemLookupValue.UW[0]; break;
|
||||
default:
|
||||
if (bHaveDebugger())
|
||||
{
|
||||
g_Notify->BreakPoint(__FILE__, __LINE__);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CMipsMemoryVM::Write32CartridgeDomain2Address2(void)
|
||||
{
|
||||
if (g_System->m_SaveUsing == SaveChip_Sram)
|
||||
|
|
|
@ -201,6 +201,7 @@ private:
|
|||
static void Write32PeripheralInterface(void);
|
||||
static void Write32RDRAMInterface(void);
|
||||
static void Write32SerialInterface(void);
|
||||
static void Write32CartridgeDomain2Address1(void);
|
||||
static void Write32CartridgeDomain2Address2(void);
|
||||
static void Write32PifRam(void);
|
||||
|
||||
|
|
|
@ -213,6 +213,32 @@ SI_STATUS_REG(SerialInterface[3])
|
|||
{
|
||||
}
|
||||
|
||||
Disk_InterfaceReg::Disk_InterfaceReg(uint32_t * DiskInterface) :
|
||||
ASIC_DATA(DiskInterface[0]),
|
||||
ASIC_MISC_REG(DiskInterface[1]),
|
||||
ASIC_STATUS(DiskInterface[2]),
|
||||
ASIC_CUR_TK(DiskInterface[3]),
|
||||
ASIC_BM_STATUS(DiskInterface[4]),
|
||||
ASIC_ERR_SECTOR(DiskInterface[5]),
|
||||
ASIC_SEQ_STATUS(DiskInterface[6]),
|
||||
ASIC_CUR_SECTOR(DiskInterface[7]),
|
||||
ASIC_HARD_RESET(DiskInterface[8]),
|
||||
ASIC_C1_S0(DiskInterface[9]),
|
||||
ASIC_HOST_SECBYTE(DiskInterface[10]),
|
||||
ASIC_C1_S2(DiskInterface[11]),
|
||||
ASIC_SEC_BYTE(DiskInterface[12]),
|
||||
ASIC_C1_S4(DiskInterface[13]),
|
||||
ASIC_C1_S6(DiskInterface[14]),
|
||||
ASIC_CUR_ADDR(DiskInterface[15]),
|
||||
ASIC_ID_REG(DiskInterface[16]),
|
||||
ASIC_TEST_REG(DiskInterface[17]),
|
||||
ASIC_TEST_PIN_SEL(DiskInterface[18]),
|
||||
ASIC_CMD(DiskInterface[19]),
|
||||
ASIC_BM_CTL(DiskInterface[20]),
|
||||
ASIC_SEQ_CTL(DiskInterface[21])
|
||||
{
|
||||
}
|
||||
|
||||
CRegisters::CRegisters(CN64System * System, CSystemEvents * SystemEvents) :
|
||||
CP0registers(m_CP0),
|
||||
Rdram_InterfaceReg(m_RDRAM_Registers),
|
||||
|
@ -224,6 +250,7 @@ RDRAMInt_InterfaceReg(m_RDRAM_Interface),
|
|||
SigProcessor_InterfaceReg(m_SigProcessor_Interface),
|
||||
DisplayControlReg(m_Display_ControlReg),
|
||||
Serial_InterfaceReg(m_SerialInterface),
|
||||
Disk_InterfaceReg(m_DiskInterface),
|
||||
m_System(System),
|
||||
m_SystemEvents(SystemEvents)
|
||||
{
|
||||
|
@ -254,6 +281,7 @@ void CRegisters::Reset()
|
|||
memset(m_SigProcessor_Interface, 0, sizeof(m_SigProcessor_Interface));
|
||||
memset(m_Peripheral_Interface, 0, sizeof(m_Peripheral_Interface));
|
||||
memset(m_SerialInterface, 0, sizeof(m_SerialInterface));
|
||||
memset(m_DiskInterface, 0, sizeof(m_DiskInterface));
|
||||
|
||||
m_AudioIntrReg = 0;
|
||||
m_GfxIntrReg = 0;
|
||||
|
|
|
@ -482,6 +482,72 @@ enum
|
|||
SI_STATUS_INTERRUPT = 0x1000,
|
||||
};
|
||||
|
||||
//Disk Interface
|
||||
class Disk_InterfaceReg
|
||||
{
|
||||
protected:
|
||||
Disk_InterfaceReg (uint32_t * Disk_Interface);
|
||||
|
||||
public:
|
||||
uint32_t & ASIC_DATA;
|
||||
uint32_t & ASIC_MISC_REG;
|
||||
uint32_t & ASIC_STATUS;
|
||||
uint32_t & ASIC_CMD;
|
||||
uint32_t & ASIC_CUR_TK;
|
||||
uint32_t & ASIC_BM_STATUS;
|
||||
uint32_t & ASIC_BM_CTL;
|
||||
uint32_t & ASIC_ERR_SECTOR;
|
||||
uint32_t & ASIC_SEQ_STATUS;
|
||||
uint32_t & ASIC_SEQ_CTL;
|
||||
uint32_t & ASIC_CUR_SECTOR;
|
||||
uint32_t & ASIC_HARD_RESET;
|
||||
uint32_t & ASIC_C1_S0;
|
||||
uint32_t & ASIC_HOST_SECBYTE;
|
||||
uint32_t & ASIC_C1_S2;
|
||||
uint32_t & ASIC_SEC_BYTE;
|
||||
uint32_t & ASIC_C1_S4;
|
||||
uint32_t & ASIC_C1_S6;
|
||||
uint32_t & ASIC_CUR_ADDR;
|
||||
uint32_t & ASIC_ID_REG;
|
||||
uint32_t & ASIC_TEST_REG;
|
||||
uint32_t & ASIC_TEST_PIN_SEL;
|
||||
|
||||
private:
|
||||
Disk_InterfaceReg(); // Disable default constructor
|
||||
Disk_InterfaceReg(const Disk_InterfaceReg&); // Disable copy constructor
|
||||
Disk_InterfaceReg& operator=(const Disk_InterfaceReg&); // Disable assignment
|
||||
};
|
||||
|
||||
//Disk Interface Flags
|
||||
enum
|
||||
{
|
||||
DD_STATUS_DATA_RQ = 0x40000000,
|
||||
DD_STATUS_C2_XFER = 0x10000000,
|
||||
DD_STATUS_BM_ERR = 0x08000000,
|
||||
DD_STATUS_BM_INT = 0x04000000,
|
||||
DD_STATUS_MECHA_INT = 0x02000000,
|
||||
DD_STATUS_DISK_PRES = 0x01000000,
|
||||
DD_STATUS_BUSY_STATE = 0x00800000,
|
||||
DD_STATUS_RST_STATE = 0x00400000,
|
||||
DD_STATUS_MTR_N_SPIN = 0x00100000,
|
||||
DD_STATUS_HEAD_RTRCT = 0x00080000,
|
||||
DD_STATUS_WR_PR_ERR = 0x00040000,
|
||||
DD_STATUS_MECHA_ERR = 0x00020000,
|
||||
DD_STATUS_DISK_CHNG = 0x00010000,
|
||||
|
||||
DD_BM_STATUS_RUNNING = 0x80000000,
|
||||
DD_BM_STATUS_ERROR = 0x04000000,
|
||||
DD_BM_STATUS_MICRO = 0x02000000,
|
||||
DD_BM_STATUS_BLOCK = 0x01000000,
|
||||
|
||||
DD_BM_CTL_START = 0x80000000,
|
||||
DD_BM_CTL_MNGRMODE = 0x40000000,
|
||||
DD_BM_CTL_INTMASK = 0x20000000,
|
||||
DD_BM_CTL_RESET = 0x10000000,
|
||||
DD_BM_CTL_BLK_TRANS = 0x02000000,
|
||||
DD_BM_CTL_MECHA_RST = 0x01000000
|
||||
};
|
||||
|
||||
class CRegName
|
||||
{
|
||||
public:
|
||||
|
@ -526,7 +592,8 @@ class CRegisters :
|
|||
public RDRAMInt_InterfaceReg,
|
||||
public SigProcessor_InterfaceReg,
|
||||
public DisplayControlReg,
|
||||
public Serial_InterfaceReg
|
||||
public Serial_InterfaceReg,
|
||||
public Disk_InterfaceReg
|
||||
{
|
||||
public:
|
||||
CRegisters(CN64System * System, CSystemEvents * SystemEvents);
|
||||
|
@ -556,6 +623,7 @@ public:
|
|||
uint32_t m_Peripheral_Interface[13];
|
||||
uint32_t m_RDRAM_Interface[8];
|
||||
uint32_t m_SerialInterface[4];
|
||||
uint32_t m_DiskInterface[22];
|
||||
uint32_t m_AudioIntrReg;
|
||||
uint32_t m_GfxIntrReg;
|
||||
uint32_t m_RspIntrReg;
|
||||
|
|
|
@ -592,6 +592,10 @@ void CN64System::InitRegisters(bool bPostPif, CMipsMemoryVM & MMU)
|
|||
m_Reg.CONFIG_REGISTER = 0x0006E463;
|
||||
m_Reg.STATUS_REGISTER = 0x34000000;
|
||||
|
||||
//64DD Registers
|
||||
m_Reg.ASIC_STATUS = DD_STATUS_RST_STATE;
|
||||
m_Reg.ASIC_ID_REG = 0x00030000;
|
||||
|
||||
//m_Reg.REVISION_REGISTER = 0x00000511;
|
||||
m_Reg.FixFpuLocations();
|
||||
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
<ClCompile Include="N64System\Interpreter\InterpreterOps.cpp" />
|
||||
<ClCompile Include="N64System\Interpreter\InterpreterOps32.cpp" />
|
||||
<ClCompile Include="N64System\Mips\Audio.cpp" />
|
||||
<ClCompile Include="N64System\Mips\Disk.cpp" />
|
||||
<ClCompile Include="N64System\Mips\Dma.cpp" />
|
||||
<ClCompile Include="N64System\Mips\Eeprom.cpp" />
|
||||
<ClCompile Include="N64System\Mips\FlashRam.cpp" />
|
||||
|
@ -129,6 +130,7 @@
|
|||
<ClInclude Include="N64System\Interpreter\InterpreterOps32.h" />
|
||||
<ClInclude Include="N64System\Interpreter\InterpreterOps.h" />
|
||||
<ClInclude Include="N64System\Mips\Audio.h" />
|
||||
<ClInclude Include="N64System\Mips\Disk.h" />
|
||||
<ClInclude Include="N64System\Mips\Dma.h" />
|
||||
<ClInclude Include="N64System\Mips\Eeprom.h" />
|
||||
<ClInclude Include="N64System\Mips\FlashRam.h" />
|
||||
|
|
|
@ -294,6 +294,9 @@
|
|||
<ClCompile Include="MemoryExceptionFilter.cpp">
|
||||
<Filter>Source Files\N64 System</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="N64System\Mips\Disk.cpp">
|
||||
<Filter>Source Files\N64 System\Mips</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="stdafx.h">
|
||||
|
@ -572,5 +575,8 @@
|
|||
<ClInclude Include="ExceptionHandler.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="N64System\Mips\Disk.h">
|
||||
<Filter>Header Files\N64 System\Mips</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
|
@ -67,6 +67,7 @@ enum SettingID
|
|||
Setting_LanguageDir,
|
||||
Setting_LanguageDirDefault,
|
||||
Setting_CurrentLanguage,
|
||||
Setting_EnableDisk,
|
||||
|
||||
//RDB TLB Settings
|
||||
Rdb_GoodName,
|
||||
|
|
|
@ -132,6 +132,7 @@ void CSettings::AddHowToHandleSetting()
|
|||
|
||||
AddHandler(Setting_RememberCheats, new CSettingTypeApplication("", "Remember Cheats", (uint32_t)false));
|
||||
AddHandler(Setting_CurrentLanguage, new CSettingTypeApplication("", "Current Language", ""));
|
||||
AddHandler(Setting_EnableDisk, new CSettingTypeApplication("", "Enable Disk", (uint32_t)false));
|
||||
AddHandler(Setting_LanguageDirDefault, new CSettingTypeRelativePath("Lang", ""));
|
||||
AddHandler(Setting_LanguageDir, new CSettingTypeApplicationPath("Directory", "Lang", Setting_LanguageDirDefault));
|
||||
|
||||
|
|
Loading…
Reference in New Issue