diff --git a/Source/Project64-core/N64System/Mips/Disk.cpp b/Source/Project64-core/N64System/Mips/Disk.cpp new file mode 100644 index 000000000..8a13c8a22 --- /dev/null +++ b/Source/Project64-core/N64System/Mips/Disk.cpp @@ -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 +#include + +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; + } +} \ No newline at end of file diff --git a/Source/Project64-core/N64System/Mips/Disk.h b/Source/Project64-core/N64System/Mips/Disk.h new file mode 100644 index 000000000..04cd43dd1 --- /dev/null +++ b/Source/Project64-core/N64System/Mips/Disk.h @@ -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); diff --git a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp index 72e742ac2..61d98531f 100644 --- a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp +++ b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.cpp @@ -16,11 +16,18 @@ #include #include #include +#include #include #include #include +#ifdef _WIN32 +#include +#else +#include +#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) diff --git a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h index 542e4af5f..a6a8a78cc 100644 --- a/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h +++ b/Source/Project64-core/N64System/Mips/MemoryVirtualMem.h @@ -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); diff --git a/Source/Project64-core/N64System/Mips/RegisterClass.cpp b/Source/Project64-core/N64System/Mips/RegisterClass.cpp index 574b3df60..f0283f6d3 100644 --- a/Source/Project64-core/N64System/Mips/RegisterClass.cpp +++ b/Source/Project64-core/N64System/Mips/RegisterClass.cpp @@ -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; diff --git a/Source/Project64-core/N64System/Mips/RegisterClass.h b/Source/Project64-core/N64System/Mips/RegisterClass.h index 01b2f9f1a..ef6dd0345 100644 --- a/Source/Project64-core/N64System/Mips/RegisterClass.h +++ b/Source/Project64-core/N64System/Mips/RegisterClass.h @@ -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; diff --git a/Source/Project64-core/N64System/N64Class.cpp b/Source/Project64-core/N64System/N64Class.cpp index f6d5b9352..0f8134e84 100644 --- a/Source/Project64-core/N64System/N64Class.cpp +++ b/Source/Project64-core/N64System/N64Class.cpp @@ -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(); diff --git a/Source/Project64-core/Project64-core.vcxproj b/Source/Project64-core/Project64-core.vcxproj index 9b063fe59..5dd24c683 100644 --- a/Source/Project64-core/Project64-core.vcxproj +++ b/Source/Project64-core/Project64-core.vcxproj @@ -46,6 +46,7 @@ + @@ -129,6 +130,7 @@ + diff --git a/Source/Project64-core/Project64-core.vcxproj.filters b/Source/Project64-core/Project64-core.vcxproj.filters index c07dc23bd..0bac0a923 100644 --- a/Source/Project64-core/Project64-core.vcxproj.filters +++ b/Source/Project64-core/Project64-core.vcxproj.filters @@ -294,6 +294,9 @@ Source Files\N64 System + + Source Files\N64 System\Mips + @@ -572,5 +575,8 @@ Header Files + + Header Files\N64 System\Mips + \ No newline at end of file diff --git a/Source/Project64-core/Settings/Settings.h b/Source/Project64-core/Settings/Settings.h index 468b9474c..504dc81b8 100644 --- a/Source/Project64-core/Settings/Settings.h +++ b/Source/Project64-core/Settings/Settings.h @@ -67,6 +67,7 @@ enum SettingID Setting_LanguageDir, Setting_LanguageDirDefault, Setting_CurrentLanguage, + Setting_EnableDisk, //RDB TLB Settings Rdb_GoodName, diff --git a/Source/Project64-core/Settings/SettingsClass.cpp b/Source/Project64-core/Settings/SettingsClass.cpp index 396eff950..65bda69eb 100644 --- a/Source/Project64-core/Settings/SettingsClass.cpp +++ b/Source/Project64-core/Settings/SettingsClass.cpp @@ -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));