diff --git a/Source/Core/Core/Core.vcproj b/Source/Core/Core/Core.vcproj index 038e738f35..d62803f59b 100644 --- a/Source/Core/Core/Core.vcproj +++ b/Source/Core/Core/Core.vcproj @@ -89,77 +89,6 @@ Name="VCPostBuildEventTool" /> - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + @@ -1263,14 +1267,6 @@ UsePrecompiledHeader="1" /> - - - @@ -1280,7 +1276,7 @@ /> + + + Open(_rFilename.c_str())) - { - u8* pData = pFile->Lock(0, pFile->GetSize()); - Memory::WriteBigEData(pData, 0x80000000, (u32)pFile->GetSize()); - pFile->Unlock(pData); - pFile->Close(); - } - - delete pFile; - return true; -} - -void WrapRunFunction(void*) -{ - while (PC != 0x00) - { - CCPU::SingleStep(); - } -} - -void WrapRunFunction2(void*) -{ - while (PC != 0x00) - { - PowerPC::SingleStep(); - } -} - -void CBoot::RunFunction(u32 _iAddr, bool _bUseDebugger) -{ - PC = _iAddr; - LR = 0x00; - - if (_bUseDebugger) - { - CCPU::Break(); - //EMM::Wrap(WrapRunFunction,0); - WrapRunFunction(0); - } - else - { - //EMM::Wrap(WrapRunFunction2,0); - WrapRunFunction2(0); - } -} - -// __________________________________________________________________________________________________ -// -// BIOS HLE: -// copy the apploader to 0x81200000 -// execute the apploader -// -void CBoot::EmulatedBIOS(bool _bDebug) -{ - LOG(BOOT, "Faking GC BIOS..."); - UReg_MSR& m_MSR = ((UReg_MSR&)PowerPC::ppcState.msr); - m_MSR.FP = 1; - - Memory::Clear(); - - // ======================================================================================= - // Write necessary values - // --------------------------------------------------------------------------------------- - /* - "TODO: Game iso info to 0x80000000 according to yagcd - or does apploader do this?" - Answer, no - apparently it doesn't, at least not in some games (by Namco). In these cases we need to set these - manually. But I guess there's no reason that the Apploader couldn't do this by itself. So I guess we - could do this for only these Namco games that need this by detecting GetUniqueID, but that wouldn't - look pretty, and I think it's likely that this is actually how the GameCube works, it reads these values - by itself. So this is very unlikely to break anything. However, if somebody find a game that has an - apploader that automatically copies the first bytes of the disc to memory that could indicate that - the apploader procedure to load the first bytes fails for some reason in some games... I hope I'm not - being long-winded here :). The yagcd page for this is http://hitmen.c02.at/files/yagcd/yagcd/chap4.ht - ml#sec4.2 by the way. I'm not sure what the bytes 8-10 does (version and streaming), but I include - those to. - */ - // --------------------------------------------------------------------------------------- - DVDInterface::DVDRead(0x00000000, 0x80000000, 10); // write boot info needed for multidisc games - - Memory::Write_U32(0x4c000064, 0x80000300); // write default DFI Handler: rfi - Memory::Write_U32(0x4c000064, 0x80000800); // write default FPU Handler: rfi - Memory::Write_U32(0x4c000064, 0x80000C00); // write default Syscall Handler: rfi - // - Memory::Write_U32(0xc2339f3d, 0x8000001C); //game disc - Memory::Write_U32(0x0D15EA5E, 0x80000020); //funny magic word for normal boot - Memory::Write_U32(0x01800000, 0x80000028); // Physical Memory Size - -// Memory::Write_U32(0x00000003, 0x8000002C); // Console type - retail - Memory::Write_U32(0x10000006, 0x8000002C); // DevKit - - Memory::Write_U32(((1 & 0x3f) << 26) | 2, 0x81300000); // HLE OSReport for Apploader - // ======================================================================================= - - - // ======================================================================================= - // Load Apploader to Memory - The apploader is hardcoded to begin at 9 280 on the disc, but - // it seems like the size can be variable. - // --------------------------------------------------------------------------------------- - PowerPC::ppcState.gpr[1] = 0x816ffff0; // StackPointer - u32 iAppLoaderOffset = 0x2440; // 0x1c40 (old value perhaps?, I don't know why it's here) - // --------------------------------------------------------------------------------------- - u32 iAppLoaderEntry = VolumeHandler::Read32(iAppLoaderOffset + 0x10); - u32 iAppLoaderSize = VolumeHandler::Read32(iAppLoaderOffset + 0x14); - if ((iAppLoaderEntry == (u32)-1) || (iAppLoaderSize == (u32)-1)) - return; - VolumeHandler::ReadToPtr(Memory::GetPointer(0x81200000), iAppLoaderOffset + 0x20, iAppLoaderSize); - // ======================================================================================= - - - //call iAppLoaderEntry - LOG(MASTER_LOG, "Call iAppLoaderEntry"); - - u32 iAppLoaderFuncAddr = 0x80003100; - PowerPC::ppcState.gpr[3] = iAppLoaderFuncAddr + 0; - PowerPC::ppcState.gpr[4] = iAppLoaderFuncAddr + 4; - PowerPC::ppcState.gpr[5] = iAppLoaderFuncAddr + 8; - RunFunction(iAppLoaderEntry, _bDebug); - u32 iAppLoaderInit = Memory::ReadUnchecked_U32(iAppLoaderFuncAddr+0); - u32 iAppLoaderMain = Memory::ReadUnchecked_U32(iAppLoaderFuncAddr+4); - u32 iAppLoaderClose = Memory::ReadUnchecked_U32(iAppLoaderFuncAddr+8); - - // iAppLoaderInit - LOG(MASTER_LOG, "Call iAppLoaderInit"); - PowerPC::ppcState.gpr[3] = 0x81300000; - RunFunction(iAppLoaderInit, _bDebug); - - - // ======================================================================================= - // iAppLoaderMain - This let's the apploader load the DOL (the exe) and the TOC (filesystem) - // and I guess anything else it wishes. To give you an idea about where the stuff is on the disc - // here's an example of the disc structure of these things from Baten Kaitos - Wings. The values - // are given as non hexadecimal (ie normal numbers with base 10 instead of base 16) and they - // are only approximately right. I don't know what's in the gaps or why there are gaps between - // the different things. - // Data From To Size - // Header 0 1 072 1 072 - // AppLoader 9 280 121 408 112 128 - // DOL (exe) 128 768 2 204 416 2 075 648 - // TOC 2 204 160 2 309 120 104 960 - // For some reason this game loaded these things in 16 rounds in the loop below. The third and - // last of these were double reads of things it had already copied to memory. But hey, we're - // all human :) - // --------------------------------------------------------------------------------------- - LOG(MASTER_LOG, "Call iAppLoaderMain"); - do - { - PowerPC::ppcState.gpr[3] = 0x81300004; - PowerPC::ppcState.gpr[4] = 0x81300008; - PowerPC::ppcState.gpr[5] = 0x8130000c; - - RunFunction(iAppLoaderMain, _bDebug); - - u32 iRamAddress = Memory::ReadUnchecked_U32(0x81300004); - u32 iLength = Memory::ReadUnchecked_U32(0x81300008); - u32 iDVDOffset = Memory::ReadUnchecked_U32(0x8130000c); - - LOG(MASTER_LOG, "DVDRead: offset: %08x memOffset: %08x length: %i", iDVDOffset, iRamAddress, iLength); - DVDInterface::DVDRead(iDVDOffset, iRamAddress, iLength); - - } while(PowerPC::ppcState.gpr[3] != 0x00); - // ======================================================================================= - - - // iAppLoaderClose - LOG(MASTER_LOG, "call iAppLoaderClose"); - RunFunction(iAppLoaderClose, _bDebug); - - // Load patches and run startup patches - std::string gameID = VolumeHandler::GetVolume()->GetUniqueID(); - PatchEngine_LoadPatches(gameID.c_str()); - PatchEngine_ApplyLoadPatches(); - PowerPC::ppcState.DebugCount = 0; - // return - PC = PowerPC::ppcState.gpr[3]; - - // --- preinit some stuff from bios --- - - // Bus Clock Speed - Memory::Write_U32(0x09a7ec80, 0x800000F8); - Memory::Write_U32(0x1cf7c580, 0x800000FC); - - // fake the VI Init of the BIOS - Memory::Write_U32(Core::g_CoreStartupParameter.bNTSC ? 0 : 1, 0x800000CC); - - // preset time - Memory::Write_U32(CEXIIPL::GetGCTime(), 0x800030D8); -} - - -// __________________________________________________________________________________________________ -// -// BIOS HLE: -// copy the apploader to 0x81200000 -// execute the apploader -// -bool CBoot::EmulatedBIOS_Wii(bool _bDebug) -{ - LOG(BOOT, "Faking Wii BIOS..."); - - FILE* pDump = fopen("WII/dump_0x0000_0x4000.bin", "rb"); - if (pDump != NULL) - { - LOG(MASTER_LOG, "Init from memory dump."); - - fread(Memory::GetMainRAMPtr(), 1, 16384, pDump); - fclose(pDump); - pDump = NULL; - } - else - { - // load settings.txt - { - std::string filename("WII/setting-eur.txt"); - if (VolumeHandler::IsValid()) - { - switch(VolumeHandler::GetVolume()->GetCountry()) - { - case DiscIO::IVolume::COUNTRY_JAP: - filename = "WII/setting-jpn.txt"; - break; - - case DiscIO::IVolume::COUNTRY_USA: - filename = "WII/setting-usa.txt"; - break; - - case DiscIO::IVolume::COUNTRY_EUROPE: - filename = "WII/setting-eur.txt"; - break; - - default: - PanicAlert("Unknown country. Wii boot process will be switched to European settings."); - filename = "WII/setting-eur.txt"; - break; - } - } - - FILE* pTmp = fopen(filename.c_str(), "rb"); - if (!pTmp) - { - LOG(MASTER_LOG, "Cant find setting file"); - return false; - } - - fread(Memory::GetPointer(0x3800), 256, 1, pTmp); - fclose(pTmp); - } - - // int global vars - { - // updated with info from wiibrew.org - Memory::Write_U32(0x5d1c9ea3, 0x00000018); // magic word it is a wii disc - Memory::Write_U32(0x0D15EA5E, 0x00000020); - Memory::Write_U32(0x00000001, 0x00000024); - Memory::Write_U32(0x01800000, 0x00000028); - Memory::Write_U32(0x00000023, 0x0000002c); - Memory::Write_U32(0x00000000, 0x00000030); // Init - Memory::Write_U32(0x817FEC60, 0x00000034); // Init - // 38, 3C should get start, size of FST through apploader - Memory::Write_U32(0x38a00040, 0x00000060); // Exception init - Memory::Write_U32(0x8008f7b8, 0x000000e4); // Thread Init - Memory::Write_U32(0x01800000, 0x000000f0); // "simulated memory size" (debug mode?) - Memory::Write_U32(0x8179b500, 0x000000f4); // __start - Memory::Write_U32(0x0e7be2c0, 0x000000f8); // Bus speed - Memory::Write_U32(0x2B73A840, 0x000000fc); // CPU speed - Memory::Write_U16(0x0000, 0x000030e6); // Console type - Memory::Write_U32(0x00000000, 0x000030c0); // EXI - Memory::Write_U32(0x00000000, 0x000030c4); // EXI - Memory::Write_U32(0x00000000, 0x000030dc); // Time - Memory::Write_U32(0x00000000, 0x000030d8); // Time - Memory::Write_U32(0x00000000, 0x000030f0); // apploader - Memory::Write_U32(0x01800000, 0x00003100); // BAT - Memory::Write_U32(0x01800000, 0x00003104); // BAT - Memory::Write_U32(0x00000000, 0x0000310c); // Init - Memory::Write_U32(0x8179d500, 0x00003110); // Init - Memory::Write_U32(0x04000000, 0x00003118); - Memory::Write_U32(0x04000000, 0x0000311c); // BAT - Memory::Write_U32(0x93400000, 0x00003120); // BAT - Memory::Write_U32(0x90000800, 0x00003124); // Init - MEM2 low - Memory::Write_U32(0x933e0000, 0x00003128); // Init - MEM2 high - Memory::Write_U32(0x933e0000, 0x00003130); // IOS MEM2 low - Memory::Write_U32(0x93400000, 0x00003134); // IOS MEM2 high - Memory::Write_U32(0x00000011, 0x00003138); // Console type - Memory::Write_U16(0x0113, 0x0000315e); // apploader - Memory::Write_U32(0x0000FF16, 0x00003158); // DDR ram vendor code - Memory::Write_U8(0x80, 0x0000315c); // OSInit - Memory::Write_U8(0x00, 0x00000006); // DVDInit - Memory::Write_U8(0x00, 0x00000007); // DVDInit - Memory::Write_U16(0x0000, 0x000030e0); // PADInit - - // fake the VI Init of the BIOS - Memory::Write_U32(Core::g_CoreStartupParameter.bNTSC ? 0 : 1, 0x000000CC); - - // clear exception handler - for (int i = 0x3000; i <= 0x3038; i += 4) - { - Memory::Write_U32(0x00000000, 0x80000000 + i); - } - - // app - VolumeHandler::ReadToPtr(Memory::GetPointer(0x3180), 0, 4); - Memory::Write_U8(0x80, 0x00003184); - } - } - - // apploader - if (VolumeHandler::IsValid() && VolumeHandler::IsWii()) - { - UReg_MSR& m_MSR = ((UReg_MSR&)PowerPC::ppcState.msr); - m_MSR.FP = 1; - - //TODO: Game iso info to 0x80000000 according to yagcd - or does apploader do this? - - Memory::Write_U32(0x4c000064, 0x80000300); // write default DFI Handler: rfi - Memory::Write_U32(0x4c000064, 0x80000800); // write default FPU Handler: rfi - Memory::Write_U32(0x4c000064, 0x80000C00); // write default Syscall Handler: rfi - - Memory::Write_U32(((1 & 0x3f) << 26) | 2, 0x81300000); // HLE OSReport for Apploader - - PowerPC::ppcState.gpr[1] = 0x816ffff0; // StackPointer - - u32 iAppLoaderOffset = 0x2440; // 0x1c40; - - // Load Apploader to Memory - u32 iAppLoaderEntry = VolumeHandler::Read32(iAppLoaderOffset + 0x10); - u32 iAppLoaderSize = VolumeHandler::Read32(iAppLoaderOffset + 0x14); - if ((iAppLoaderEntry == (u32)-1) || (iAppLoaderSize == (u32)-1)) - { - LOG(BOOT, "Invalid apploader. Probably your image is corrupted."); - return false; - } - VolumeHandler::ReadToPtr(Memory::GetPointer(0x81200000), iAppLoaderOffset + 0x20, iAppLoaderSize); - - //call iAppLoaderEntry - LOG(BOOT, "Call iAppLoaderEntry"); - - u32 iAppLoaderFuncAddr = 0x80004000; - PowerPC::ppcState.gpr[3] = iAppLoaderFuncAddr + 0; - PowerPC::ppcState.gpr[4] = iAppLoaderFuncAddr + 4; - PowerPC::ppcState.gpr[5] = iAppLoaderFuncAddr + 8; - RunFunction(iAppLoaderEntry, _bDebug); - u32 iAppLoaderInit = Memory::ReadUnchecked_U32(iAppLoaderFuncAddr+0); - u32 iAppLoaderMain = Memory::ReadUnchecked_U32(iAppLoaderFuncAddr+4); - u32 iAppLoaderClose = Memory::ReadUnchecked_U32(iAppLoaderFuncAddr+8); - - // iAppLoaderInit - LOG(BOOT, "Call iAppLoaderInit"); - PowerPC::ppcState.gpr[3] = 0x81300000; - RunFunction(iAppLoaderInit, _bDebug); - - // iAppLoaderMain - LOG(BOOT, "Call iAppLoaderMain"); - do - { - PowerPC::ppcState.gpr[3] = 0x81300004; - PowerPC::ppcState.gpr[4] = 0x81300008; - PowerPC::ppcState.gpr[5] = 0x8130000c; - - RunFunction(iAppLoaderMain, _bDebug); - - u32 iRamAddress = Memory::ReadUnchecked_U32(0x81300004); - u32 iLength = Memory::ReadUnchecked_U32(0x81300008); - u32 iDVDOffset = Memory::ReadUnchecked_U32(0x8130000c) << 2; - - LOG(BOOT, "DVDRead: offset: %08x memOffse: %08x length: %i", iDVDOffset, iRamAddress, iLength); - DVDInterface::DVDRead(iDVDOffset, iRamAddress, iLength); - } while(PowerPC::ppcState.gpr[3] != 0x00); - - // iAppLoaderClose - LOG(BOOT, "call iAppLoaderClose"); - RunFunction(iAppLoaderClose, _bDebug); - - // Load patches and run startup patches - std::string gameID = VolumeHandler::GetVolume()->GetUniqueID(); - PatchEngine_LoadPatches(gameID.c_str()); - - // return - PC = PowerPC::ppcState.gpr[3]; - } - - PowerPC::ppcState.DebugCount = 0; - - return true; -} - void CBoot::Load_FST(bool _bIsWii) { if(VolumeHandler::IsValid()) @@ -655,22 +267,6 @@ bool CBoot::BootUp(const SCoreStartupParameter& _StartupPara) } break; - // BIN - // =================================================================================== - case SCoreStartupParameter::BOOT_BIN: - { - if (!_StartupPara.m_strDefaultGCM.empty()) - { - VolumeHandler::SetVolumeName(_StartupPara.m_strDefaultGCM.c_str()); - EmulatedBIOS(false); - } - - Boot_BIN(_StartupPara.m_strFilename); - if (LoadMapFromFilename(_StartupPara.m_strFilename)) - HLE::PatchFunctions(); - } - break; - // BIOS // =================================================================================== case SCoreStartupParameter::BOOT_BIOS: diff --git a/Source/Core/Core/Src/Boot/Boot.h b/Source/Core/Core/Src/Boot/Boot.h index 4a2f488e4d..235ccf4024 100644 --- a/Source/Core/Core/Src/Boot/Boot.h +++ b/Source/Core/Core/Src/Boot/Boot.h @@ -32,7 +32,6 @@ public: BOOT_ERROR, BOOT_DOL, BOOT_ELF, - BOOT_BIN, BOOT_ISO, BOOT_BIOS }; @@ -50,14 +49,11 @@ private: static void UpdateDebugger_MapLoaded(const char* _gameID = NULL); static bool LoadMapFromFilename(const std::string& _rFilename, const char* _gameID = NULL); - static bool Boot_ELF(const char *filename); - static bool Boot_BIN(const std::string& _rFilename); static void EmulatedBIOS(bool _bDebug); static bool EmulatedBIOS_Wii(bool _bDebug); static bool Load_BIOS(const std::string& _rBiosFilename); - static void Load_FST(bool _bIsWii); }; diff --git a/Source/Core/Core/Src/Boot/Boot_BIOSEmu.cpp b/Source/Core/Core/Src/Boot/Boot_BIOSEmu.cpp new file mode 100644 index 0000000000..ef781448a8 --- /dev/null +++ b/Source/Core/Core/Src/Boot/Boot_BIOSEmu.cpp @@ -0,0 +1,390 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "Common.h" + +#include "../PowerPC/PowerPC.h" +#include "../Core.h" +#include "../HW/EXI_DeviceIPL.h" +#include "../HW/Memmap.h" +#include "../HW/DVDInterface.h" +#include "../HW/CPU.h" + +#include "../Host.h" +#include "../VolumeHandler.h" +#include "../PatchEngine.h" +#include "../MemTools.h" + +#include "VolumeCreator.h" +#include "Boot.h" + +void CBoot::RunFunction(u32 _iAddr, bool _bUseDebugger) +{ + PC = _iAddr; + LR = 0x00; + + if (_bUseDebugger) + { + CCPU::Break(); + while (PC != 0x00) + CCPU::SingleStep(); + } + else + { + while (PC != 0x00) + PowerPC::SingleStep(); + } +} + +// __________________________________________________________________________________________________ +// +// BIOS HLE: +// copy the apploader to 0x81200000 +// execute the apploader +// +void CBoot::EmulatedBIOS(bool _bDebug) +{ + LOG(BOOT, "Faking GC BIOS..."); + UReg_MSR& m_MSR = ((UReg_MSR&)PowerPC::ppcState.msr); + m_MSR.FP = 1; + + Memory::Clear(); + + // ======================================================================================= + // Write necessary values + // --------------------------------------------------------------------------------------- + /* + "TODO: Game iso info to 0x80000000 according to yagcd - or does apploader do this?" - Answer, no + apparently it doesn't, at least not in some games (by Namco). In these cases we need to set these + manually. But I guess there's no reason that the Apploader couldn't do this by itself. So I guess we + could do this for only these Namco games that need this by detecting GetUniqueID, but that wouldn't + look pretty, and I think it's likely that this is actually how the GameCube works, it reads these values + by itself. So this is very unlikely to break anything. However, if somebody find a game that has an + apploader that automatically copies the first bytes of the disc to memory that could indicate that + the apploader procedure to load the first bytes fails for some reason in some games... I hope I'm not + being long-winded here :). The yagcd page for this is http://hitmen.c02.at/files/yagcd/yagcd/chap4.ht + ml#sec4.2 by the way. I'm not sure what the bytes 8-10 does (version and streaming), but I include + those to. + */ + // --------------------------------------------------------------------------------------- + DVDInterface::DVDRead(0x00000000, 0x80000000, 10); // write boot info needed for multidisc games + + Memory::Write_U32(0x4c000064, 0x80000300); // write default DFI Handler: rfi + Memory::Write_U32(0x4c000064, 0x80000800); // write default FPU Handler: rfi + Memory::Write_U32(0x4c000064, 0x80000C00); // write default Syscall Handler: rfi + // + Memory::Write_U32(0xc2339f3d, 0x8000001C); //game disc + Memory::Write_U32(0x0D15EA5E, 0x80000020); //funny magic word for normal boot + Memory::Write_U32(0x01800000, 0x80000028); // Physical Memory Size + +// Memory::Write_U32(0x00000003, 0x8000002C); // Console type - retail + Memory::Write_U32(0x10000006, 0x8000002C); // DevKit + + Memory::Write_U32(((1 & 0x3f) << 26) | 2, 0x81300000); // HLE OSReport for Apploader + // ======================================================================================= + + + // ======================================================================================= + // Load Apploader to Memory - The apploader is hardcoded to begin at 9 280 on the disc, but + // it seems like the size can be variable. + // --------------------------------------------------------------------------------------- + PowerPC::ppcState.gpr[1] = 0x816ffff0; // StackPointer + u32 iAppLoaderOffset = 0x2440; // 0x1c40 (old value perhaps?, I don't know why it's here) + // --------------------------------------------------------------------------------------- + u32 iAppLoaderEntry = VolumeHandler::Read32(iAppLoaderOffset + 0x10); + u32 iAppLoaderSize = VolumeHandler::Read32(iAppLoaderOffset + 0x14); + if ((iAppLoaderEntry == (u32)-1) || (iAppLoaderSize == (u32)-1)) + return; + VolumeHandler::ReadToPtr(Memory::GetPointer(0x81200000), iAppLoaderOffset + 0x20, iAppLoaderSize); + // ======================================================================================= + + + //call iAppLoaderEntry + LOG(MASTER_LOG, "Call iAppLoaderEntry"); + + u32 iAppLoaderFuncAddr = 0x80003100; + PowerPC::ppcState.gpr[3] = iAppLoaderFuncAddr + 0; + PowerPC::ppcState.gpr[4] = iAppLoaderFuncAddr + 4; + PowerPC::ppcState.gpr[5] = iAppLoaderFuncAddr + 8; + RunFunction(iAppLoaderEntry, _bDebug); + u32 iAppLoaderInit = Memory::ReadUnchecked_U32(iAppLoaderFuncAddr+0); + u32 iAppLoaderMain = Memory::ReadUnchecked_U32(iAppLoaderFuncAddr+4); + u32 iAppLoaderClose = Memory::ReadUnchecked_U32(iAppLoaderFuncAddr+8); + + // iAppLoaderInit + LOG(MASTER_LOG, "Call iAppLoaderInit"); + PowerPC::ppcState.gpr[3] = 0x81300000; + RunFunction(iAppLoaderInit, _bDebug); + + + // ======================================================================================= + // iAppLoaderMain - This let's the apploader load the DOL (the exe) and the TOC (filesystem) + // and I guess anything else it wishes. To give you an idea about where the stuff is on the disc + // here's an example of the disc structure of these things from Baten Kaitos - Wings. The values + // are given as non hexadecimal (ie normal numbers with base 10 instead of base 16) and they + // are only approximately right. I don't know what's in the gaps or why there are gaps between + // the different things. + // Data From To Size + // Header 0 1 072 1 072 + // AppLoader 9 280 121 408 112 128 + // DOL (exe) 128 768 2 204 416 2 075 648 + // TOC 2 204 160 2 309 120 104 960 + // For some reason this game loaded these things in 16 rounds in the loop below. The third and + // last of these were double reads of things it had already copied to memory. But hey, we're + // all human :) + // --------------------------------------------------------------------------------------- + LOG(MASTER_LOG, "Call iAppLoaderMain"); + do + { + PowerPC::ppcState.gpr[3] = 0x81300004; + PowerPC::ppcState.gpr[4] = 0x81300008; + PowerPC::ppcState.gpr[5] = 0x8130000c; + + RunFunction(iAppLoaderMain, _bDebug); + + u32 iRamAddress = Memory::ReadUnchecked_U32(0x81300004); + u32 iLength = Memory::ReadUnchecked_U32(0x81300008); + u32 iDVDOffset = Memory::ReadUnchecked_U32(0x8130000c); + + LOG(MASTER_LOG, "DVDRead: offset: %08x memOffset: %08x length: %i", iDVDOffset, iRamAddress, iLength); + DVDInterface::DVDRead(iDVDOffset, iRamAddress, iLength); + + } while(PowerPC::ppcState.gpr[3] != 0x00); + // ======================================================================================= + + + // iAppLoaderClose + LOG(MASTER_LOG, "call iAppLoaderClose"); + RunFunction(iAppLoaderClose, _bDebug); + + // Load patches and run startup patches + std::string gameID = VolumeHandler::GetVolume()->GetUniqueID(); + PatchEngine_LoadPatches(gameID.c_str()); + PatchEngine_ApplyLoadPatches(); + PowerPC::ppcState.DebugCount = 0; + // return + PC = PowerPC::ppcState.gpr[3]; + + // --- preinit some stuff from bios --- + + // Bus Clock Speed + Memory::Write_U32(0x09a7ec80, 0x800000F8); + Memory::Write_U32(0x1cf7c580, 0x800000FC); + + // fake the VI Init of the BIOS + Memory::Write_U32(Core::g_CoreStartupParameter.bNTSC ? 0 : 1, 0x800000CC); + + // preset time + Memory::Write_U32(CEXIIPL::GetGCTime(), 0x800030D8); +} + + +// __________________________________________________________________________________________________ +// +// BIOS HLE: +// copy the apploader to 0x81200000 +// execute the apploader +// +bool CBoot::EmulatedBIOS_Wii(bool _bDebug) +{ + LOG(BOOT, "Faking Wii BIOS..."); + + FILE* pDump = fopen("WII/dump_0x0000_0x4000.bin", "rb"); + if (pDump != NULL) + { + LOG(MASTER_LOG, "Init from memory dump."); + + fread(Memory::GetMainRAMPtr(), 1, 16384, pDump); + fclose(pDump); + pDump = NULL; + } + else + { + // load settings.txt + { + std::string filename("WII/setting-eur.txt"); + if (VolumeHandler::IsValid()) + { + switch(VolumeHandler::GetVolume()->GetCountry()) + { + case DiscIO::IVolume::COUNTRY_JAP: + filename = "WII/setting-jpn.txt"; + break; + + case DiscIO::IVolume::COUNTRY_USA: + filename = "WII/setting-usa.txt"; + break; + + case DiscIO::IVolume::COUNTRY_EUROPE: + filename = "WII/setting-eur.txt"; + break; + + default: + PanicAlert("Unknown country. Wii boot process will be switched to European settings."); + filename = "WII/setting-eur.txt"; + break; + } + } + + FILE* pTmp = fopen(filename.c_str(), "rb"); + if (!pTmp) + { + LOG(MASTER_LOG, "Cant find setting file"); + return false; + } + + fread(Memory::GetPointer(0x3800), 256, 1, pTmp); + fclose(pTmp); + } + + // int global vars + { + // updated with info from wiibrew.org + Memory::Write_U32(0x5d1c9ea3, 0x00000018); // magic word it is a wii disc + Memory::Write_U32(0x0D15EA5E, 0x00000020); + Memory::Write_U32(0x00000001, 0x00000024); + Memory::Write_U32(0x01800000, 0x00000028); + Memory::Write_U32(0x00000023, 0x0000002c); + Memory::Write_U32(0x00000000, 0x00000030); // Init + Memory::Write_U32(0x817FEC60, 0x00000034); // Init + // 38, 3C should get start, size of FST through apploader + Memory::Write_U32(0x38a00040, 0x00000060); // Exception init + Memory::Write_U32(0x8008f7b8, 0x000000e4); // Thread Init + Memory::Write_U32(0x01800000, 0x000000f0); // "simulated memory size" (debug mode?) + Memory::Write_U32(0x8179b500, 0x000000f4); // __start + Memory::Write_U32(0x0e7be2c0, 0x000000f8); // Bus speed + Memory::Write_U32(0x2B73A840, 0x000000fc); // CPU speed + Memory::Write_U16(0x0000, 0x000030e6); // Console type + Memory::Write_U32(0x00000000, 0x000030c0); // EXI + Memory::Write_U32(0x00000000, 0x000030c4); // EXI + Memory::Write_U32(0x00000000, 0x000030dc); // Time + Memory::Write_U32(0x00000000, 0x000030d8); // Time + Memory::Write_U32(0x00000000, 0x000030f0); // apploader + Memory::Write_U32(0x01800000, 0x00003100); // BAT + Memory::Write_U32(0x01800000, 0x00003104); // BAT + Memory::Write_U32(0x00000000, 0x0000310c); // Init + Memory::Write_U32(0x8179d500, 0x00003110); // Init + Memory::Write_U32(0x04000000, 0x00003118); + Memory::Write_U32(0x04000000, 0x0000311c); // BAT + Memory::Write_U32(0x93400000, 0x00003120); // BAT + Memory::Write_U32(0x90000800, 0x00003124); // Init - MEM2 low + Memory::Write_U32(0x933e0000, 0x00003128); // Init - MEM2 high + Memory::Write_U32(0x933e0000, 0x00003130); // IOS MEM2 low + Memory::Write_U32(0x93400000, 0x00003134); // IOS MEM2 high + Memory::Write_U32(0x00000011, 0x00003138); // Console type + Memory::Write_U16(0x0113, 0x0000315e); // apploader + Memory::Write_U32(0x0000FF16, 0x00003158); // DDR ram vendor code + Memory::Write_U8(0x80, 0x0000315c); // OSInit + Memory::Write_U8(0x00, 0x00000006); // DVDInit + Memory::Write_U8(0x00, 0x00000007); // DVDInit + Memory::Write_U16(0x0000, 0x000030e0); // PADInit + + // fake the VI Init of the BIOS + Memory::Write_U32(Core::g_CoreStartupParameter.bNTSC ? 0 : 1, 0x000000CC); + + // clear exception handler + for (int i = 0x3000; i <= 0x3038; i += 4) + { + Memory::Write_U32(0x00000000, 0x80000000 + i); + } + + // app + VolumeHandler::ReadToPtr(Memory::GetPointer(0x3180), 0, 4); + Memory::Write_U8(0x80, 0x00003184); + } + } + + // apploader + if (VolumeHandler::IsValid() && VolumeHandler::IsWii()) + { + UReg_MSR& m_MSR = ((UReg_MSR&)PowerPC::ppcState.msr); + m_MSR.FP = 1; + + //TODO: Game iso info to 0x80000000 according to yagcd - or does apploader do this? + + Memory::Write_U32(0x4c000064, 0x80000300); // write default DFI Handler: rfi + Memory::Write_U32(0x4c000064, 0x80000800); // write default FPU Handler: rfi + Memory::Write_U32(0x4c000064, 0x80000C00); // write default Syscall Handler: rfi + + Memory::Write_U32(((1 & 0x3f) << 26) | 2, 0x81300000); // HLE OSReport for Apploader + + PowerPC::ppcState.gpr[1] = 0x816ffff0; // StackPointer + + u32 iAppLoaderOffset = 0x2440; // 0x1c40; + + // Load Apploader to Memory + u32 iAppLoaderEntry = VolumeHandler::Read32(iAppLoaderOffset + 0x10); + u32 iAppLoaderSize = VolumeHandler::Read32(iAppLoaderOffset + 0x14); + if ((iAppLoaderEntry == (u32)-1) || (iAppLoaderSize == (u32)-1)) + { + LOG(BOOT, "Invalid apploader. Probably your image is corrupted."); + return false; + } + VolumeHandler::ReadToPtr(Memory::GetPointer(0x81200000), iAppLoaderOffset + 0x20, iAppLoaderSize); + + //call iAppLoaderEntry + LOG(BOOT, "Call iAppLoaderEntry"); + + u32 iAppLoaderFuncAddr = 0x80004000; + PowerPC::ppcState.gpr[3] = iAppLoaderFuncAddr + 0; + PowerPC::ppcState.gpr[4] = iAppLoaderFuncAddr + 4; + PowerPC::ppcState.gpr[5] = iAppLoaderFuncAddr + 8; + RunFunction(iAppLoaderEntry, _bDebug); + u32 iAppLoaderInit = Memory::ReadUnchecked_U32(iAppLoaderFuncAddr+0); + u32 iAppLoaderMain = Memory::ReadUnchecked_U32(iAppLoaderFuncAddr+4); + u32 iAppLoaderClose = Memory::ReadUnchecked_U32(iAppLoaderFuncAddr+8); + + // iAppLoaderInit + LOG(BOOT, "Call iAppLoaderInit"); + PowerPC::ppcState.gpr[3] = 0x81300000; + RunFunction(iAppLoaderInit, _bDebug); + + // iAppLoaderMain + LOG(BOOT, "Call iAppLoaderMain"); + do + { + PowerPC::ppcState.gpr[3] = 0x81300004; + PowerPC::ppcState.gpr[4] = 0x81300008; + PowerPC::ppcState.gpr[5] = 0x8130000c; + + RunFunction(iAppLoaderMain, _bDebug); + + u32 iRamAddress = Memory::ReadUnchecked_U32(0x81300004); + u32 iLength = Memory::ReadUnchecked_U32(0x81300008); + u32 iDVDOffset = Memory::ReadUnchecked_U32(0x8130000c) << 2; + + LOG(BOOT, "DVDRead: offset: %08x memOffse: %08x length: %i", iDVDOffset, iRamAddress, iLength); + DVDInterface::DVDRead(iDVDOffset, iRamAddress, iLength); + } while(PowerPC::ppcState.gpr[3] != 0x00); + + // iAppLoaderClose + LOG(BOOT, "call iAppLoaderClose"); + RunFunction(iAppLoaderClose, _bDebug); + + // Load patches and run startup patches + std::string gameID = VolumeHandler::GetVolume()->GetUniqueID(); + PatchEngine_LoadPatches(gameID.c_str()); + + // return + PC = PowerPC::ppcState.gpr[3]; + } + + PowerPC::ppcState.DebugCount = 0; + + return true; +} + diff --git a/Source/Core/Core/Src/Boot/Boot_DOL.h b/Source/Core/Core/Src/Boot/Boot_DOL.h index 15c55aff4b..73a6feb230 100644 --- a/Source/Core/Core/Src/Boot/Boot_DOL.h +++ b/Source/Core/Core/Src/Boot/Boot_DOL.h @@ -14,6 +14,7 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ + #ifndef _BOOT_DOL_H #define _BOOT_DOL_H diff --git a/Source/Core/Core/Src/Boot/Boot_ELF.cpp b/Source/Core/Core/Src/Boot/Boot_ELF.cpp index ce85c3ac2c..947af9037e 100644 --- a/Source/Core/Core/Src/Boot/Boot_ELF.cpp +++ b/Source/Core/Core/Src/Boot/Boot_ELF.cpp @@ -1,3 +1,20 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + #include "../PowerPC/PowerPC.h" #include "Boot.h" #include "../HLE/HLE.h" @@ -7,16 +24,13 @@ bool CBoot::IsElfWii(const char *filename) { - Common::IMappedFile *mapfile = Common::IMappedFile::CreateMappedFileDEPRECATED(); - bool ok = mapfile->Open(filename); - if (!ok) - return false; - size_t filesize = (size_t)mapfile->GetSize(); - u8 *ptr = mapfile->Lock(0, filesize); - u8 *mem = new u8[filesize]; - memcpy(mem, ptr, filesize); - mapfile->Unlock(ptr); - mapfile->Close(); + FILE *f = fopen(filename, "rb"); + fseek(f, 0, SEEK_END); + u64 filesize = ftell(f); + fseek(f, 0, SEEK_SET); + u8 *mem = new u8[(size_t)filesize]; + fread(mem, 1, filesize, f); + fclose(f); ElfReader reader(mem); @@ -29,13 +43,13 @@ bool CBoot::IsElfWii(const char *filename) bool CBoot::Boot_ELF(const char *filename) { - Common::IMappedFile *mapfile = Common::IMappedFile::CreateMappedFileDEPRECATED(); - mapfile->Open(filename); - u8 *ptr = mapfile->Lock(0, mapfile->GetSize()); - u8 *mem = new u8[(size_t)mapfile->GetSize()]; - memcpy(mem, ptr, (size_t)mapfile->GetSize()); - mapfile->Unlock(ptr); - mapfile->Close(); + FILE *f = fopen(filename, "rb"); + fseek(f, 0, SEEK_END); + u64 filesize = ftell(f); + fseek(f, 0, SEEK_SET); + u8 *mem = new u8[(size_t)filesize]; + fread(mem, 1, filesize, f); + fclose(f); ElfReader reader(mem); reader.LoadInto(0x80000000); @@ -46,9 +60,9 @@ bool CBoot::Boot_ELF(const char *filename) } else { HLE::PatchFunctions(); } - delete [] mem; PC = reader.GetEntryPoint(); + delete [] mem; return true; } diff --git a/Source/Core/Core/Src/Boot/Boot_ELF.h b/Source/Core/Core/Src/Boot/Boot_ELF.h index 50e96676b7..6ad1ff06f7 100644 --- a/Source/Core/Core/Src/Boot/Boot_ELF.h +++ b/Source/Core/Core/Src/Boot/Boot_ELF.h @@ -1 +1,18 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + #pragma once diff --git a/Source/Core/Core/Src/Boot/ElfReader.cpp b/Source/Core/Core/Src/Boot/ElfReader.cpp index a37c555ece..425ec21f42 100644 --- a/Source/Core/Core/Src/Boot/ElfReader.cpp +++ b/Source/Core/Core/Src/Boot/ElfReader.cpp @@ -1,3 +1,20 @@ +// Copyright (C) 2003-2008 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + #include #include "Common.h" @@ -12,17 +29,17 @@ void bswap(Elf32_Half &w) {w = Common::swap16(w);} void byteswapHeader(Elf32_Ehdr &ELF_H) { bswap(ELF_H.e_type); - bswap(ELF_H.e_machine);// = _byteswap_ushort(ELF_H.e_machine); - bswap(ELF_H.e_ehsize);// = _byteswap_ushort(ELF_H.e_ehsize); - bswap(ELF_H.e_phentsize);// = _byteswap_ushort(ELF_H.e_phentsize); - bswap(ELF_H.e_phnum);// = _byteswap_ushort(ELF_H.e_phnum); - bswap(ELF_H.e_shentsize);// = _byteswap_ushort(ELF_H.e_shentsize); - bswap(ELF_H.e_shnum);// = _byteswap_ushort(ELF_H.e_shnum); - bswap(ELF_H.e_shstrndx);//= _byteswap_ushort(ELF_H.e_shstrndx); - bswap(ELF_H.e_version);// = _byteswap_ulong(ELF_H.e_version ); - bswap(ELF_H.e_entry);// = _byteswap_ulong(ELF_H.e_entry ); - bswap(ELF_H.e_phoff);// = _byteswap_ulong(ELF_H.e_phoff ); - bswap(ELF_H.e_shoff);// = _byteswap_ulong(ELF_H.e_shoff ); + bswap(ELF_H.e_machine); + bswap(ELF_H.e_ehsize); + bswap(ELF_H.e_phentsize); + bswap(ELF_H.e_phnum); + bswap(ELF_H.e_shentsize); + bswap(ELF_H.e_shnum); + bswap(ELF_H.e_shstrndx); + bswap(ELF_H.e_version); + bswap(ELF_H.e_entry); + bswap(ELF_H.e_phoff); + bswap(ELF_H.e_shoff); bswap(ELF_H.e_flags); } @@ -52,7 +69,6 @@ void byteswapSection(Elf32_Shdr &sec) bswap(sec.sh_type); } - ElfReader::ElfReader(void *ptr) { base = (char*)ptr; @@ -75,8 +91,7 @@ ElfReader::ElfReader(void *ptr) entryPoint = header->e_entry; } - -const char *ElfReader::GetSectionName(int section) +const char *ElfReader::GetSectionName(int section) const { if (sections[section].sh_type == SHT_NULL) return 0; @@ -90,8 +105,6 @@ const char *ElfReader::GetSectionName(int section) return 0; } - - void addrToHiLo(u32 addr, u16 &hi, s16 &lo) { lo = (addr & 0xFFFF); @@ -143,7 +156,7 @@ bool ElfReader::LoadInto(u32 vaddr) segmentVAddr[i] = baseAddress + p->p_vaddr; u32 writeAddr = segmentVAddr[i]; - u8 *src = GetSegmentPtr(i); + const u8 *src = GetSegmentPtr(i); u8 *dst = Memory::GetPointer(writeAddr); u32 srcSize = p->p_filesz; u32 dstSize = p->p_memsz; @@ -188,17 +201,14 @@ bool ElfReader::LoadInto(u32 vaddr) return true; } - -SectionID ElfReader::GetSectionByName(const char *name, int firstSection) +SectionID ElfReader::GetSectionByName(const char *name, int firstSection) const { for (int i = firstSection; i < header->e_shnum; i++) { const char *secname = GetSectionName(i); if (secname != 0 && strcmp(name, secname) == 0) - { return i; - } } return -1; } @@ -210,15 +220,12 @@ bool ElfReader::LoadSymbols() if (sec != -1) { int stringSection = sections[sec].sh_link; - - const char *stringBase = (const char*)GetSectionDataPtr(stringSection); + const char *stringBase = (const char *)GetSectionDataPtr(stringSection); //We have a symbol table! Elf32_Sym *symtab = (Elf32_Sym *)(GetSectionDataPtr(sec)); - int numSymbols = sections[sec].sh_size / sizeof(Elf32_Sym); - - for (int sym = 0; sym>2]; - } + u32 Read32(int off) const { return base32[off>>2]; } // Quick accessors - ElfType GetType() { return (ElfType)(header->e_type); } - ElfMachine GetMachine() { return (ElfMachine)(header->e_machine); } - u32 GetEntryPoint() { return entryPoint; } - u32 GetFlags() { return (u32)(header->e_flags); } + ElfType GetType() const { return (ElfType)(header->e_type); } + ElfMachine GetMachine() const { return (ElfMachine)(header->e_machine); } + u32 GetEntryPoint() const { return entryPoint; } + u32 GetFlags() const { return (u32)(header->e_flags); } - int GetNumSegments() { return (int)(header->e_phnum); } - int GetNumSections() { return (int)(header->e_shnum); } - const char *GetSectionName(int section); - u8 *GetPtr(int offset) - { - return (u8*)base + offset; - } - u8 *GetSectionDataPtr(int section) + int GetNumSegments() const { return (int)(header->e_phnum); } + int GetNumSections() const { return (int)(header->e_shnum); } + const u8 *GetPtr(int offset) const { return (u8*)base + offset; } + const char *GetSectionName(int section) const; + const u8 *GetSectionDataPtr(int section) const { if (section < 0 || section >= header->e_shnum) return 0; @@ -62,16 +69,13 @@ public: else return 0; } - u8 *GetSegmentPtr(int segment) + const u8 *GetSegmentPtr(int segment) { return GetPtr(segments[segment].p_offset); } - u32 GetSectionAddr(SectionID section) {return sectionAddrs[section];} - int GetSectionSize(SectionID section) - { - return sections[section].sh_size; - } - SectionID GetSectionByName(const char *name, int firstSection=0); //-1 for not found + u32 GetSectionAddr(SectionID section) const { return sectionAddrs[section]; } + int GetSectionSize(SectionID section) const { return sections[section].sh_size; } + SectionID GetSectionByName(const char *name, int firstSection = 0) const; //-1 for not found bool DidRelocate() { return bRelocate; diff --git a/Source/Core/Core/Src/CoreParameter.cpp b/Source/Core/Core/Src/CoreParameter.cpp index 73718ab962..3c5d8c7d1d 100644 --- a/Source/Core/Core/Src/CoreParameter.cpp +++ b/Source/Core/Core/Src/CoreParameter.cpp @@ -100,12 +100,6 @@ bool SCoreStartupParameter::AutoSetup(EBootBios _BootBios) m_BootType = BOOT_ELF; bNTSC = true; } - else if (!strcasecmp(Extension.c_str(), ".bin")) - { - BaseDataPath = s_DataBasePath_USA; - m_BootType = BOOT_BIN; - bNTSC = true; - } else if (!strcasecmp(Extension.c_str(), ".dol")) { BaseDataPath = s_DataBasePath_USA; diff --git a/Source/Core/Core/Src/CoreParameter.h b/Source/Core/Core/Src/CoreParameter.h index f82cdcc63b..4babf27a07 100644 --- a/Source/Core/Core/Src/CoreParameter.h +++ b/Source/Core/Core/Src/CoreParameter.h @@ -62,13 +62,11 @@ struct SCoreStartupParameter { BOOT_ISO, BOOT_ELF, - BOOT_BIN, BOOT_DOL, BOOT_BIOS }; EBootType m_BootType; - // files std::string m_strVideoPlugin; std::string m_strPadPlugin; diff --git a/Source/Core/Core/Src/HW/DVDInterface.cpp b/Source/Core/Core/Src/HW/DVDInterface.cpp index 7b7aae4220..5f948d003c 100644 --- a/Source/Core/Core/Src/HW/DVDInterface.cpp +++ b/Source/Core/Core/Src/HW/DVDInterface.cpp @@ -194,19 +194,19 @@ void ExecuteCommand(UDIDMAControlRegister& _DMAControlReg); void Init() { - dvdMem.StatusReg.Hex = 0; - dvdMem.CoverReg.Hex = 0; - dvdMem.Command[0] = 0; - dvdMem.Command[1] = 0; - dvdMem.Command[2] = 0; - dvdMem.DMAAddress.Hex = 0; - dvdMem.DMALength.Hex = 0; - dvdMem.DMAControlReg.Hex = 0; - dvdMem.Immediate = 0; - dvdMem.ConfigReg.Hex = 0; - dvdMem.AudioStart = 0; - dvdMem.AudioPos = 0; - dvdMem.AudioLength = 0; + dvdMem.StatusReg.Hex = 0; + dvdMem.CoverReg.Hex = 0; + dvdMem.Command[0] = 0; + dvdMem.Command[1] = 0; + dvdMem.Command[2] = 0; + dvdMem.DMAAddress.Hex = 0; + dvdMem.DMALength.Hex = 0; + dvdMem.DMAControlReg.Hex = 0; + dvdMem.Immediate = 0; + dvdMem.ConfigReg.Hex = 0; + dvdMem.AudioStart = 0; + dvdMem.AudioPos = 0; + dvdMem.AudioLength = 0; // SetLidOpen(true); } diff --git a/Source/Core/Core/Src/HW/EXI_DeviceIPL.cpp b/Source/Core/Core/Src/HW/EXI_DeviceIPL.cpp index d6237e19b1..a5354c490b 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceIPL.cpp +++ b/Source/Core/Core/Src/HW/EXI_DeviceIPL.cpp @@ -66,7 +66,7 @@ CEXIIPL::CEXIIPL() : if (pStream != NULL) { fseek(pStream, 0, SEEK_END); - size_t filesize = ftell(pStream); + size_t filesize = (size_t)ftell(pStream); rewind(pStream); fread(m_pIPL + 0x001fcf00, 1, filesize, pStream); @@ -81,7 +81,7 @@ CEXIIPL::CEXIIPL() : if (pStream != NULL) { fseek(pStream, 0, SEEK_END); - size_t filesize = ftell(pStream); + size_t filesize = (size_t)ftell(pStream); rewind(pStream); fread(m_pIPL + 0x001aff00, 1, filesize, pStream); diff --git a/Source/Core/Core/Src/PowerPC/SymbolDB.cpp b/Source/Core/Core/Src/PowerPC/SymbolDB.cpp index ed449d62ec..9d3fed62d8 100644 --- a/Source/Core/Core/Src/PowerPC/SymbolDB.cpp +++ b/Source/Core/Core/Src/PowerPC/SymbolDB.cpp @@ -310,4 +310,4 @@ bool SymbolDB::SaveMap(const char *filename) } fclose(f); return true; -} +} diff --git a/Source/Core/Core/Src/SConscript b/Source/Core/Core/Src/SConscript index ce98ee2e53..501341e7ce 100644 --- a/Source/Core/Core/Src/SConscript +++ b/Source/Core/Core/Src/SConscript @@ -14,6 +14,7 @@ files = ["Console.cpp", "Tracer.cpp", "VolumeHandler.cpp", "Boot/Boot.cpp", + "Boot/Boot_BIOSEmu.cpp", "Boot/Boot_DOL.cpp", "Boot/Boot_ELF.cpp", "Boot/ElfReader.cpp",