ppsspp/Core/HW/MemoryStick.cpp
2016-09-05 19:14:48 -07:00

92 lines
2.3 KiB
C++

#include "Common/ChunkFile.h"
#include "Core/CoreTiming.h"
#include "Core/FileSystems/MetaFileSystem.h"
#include "Core/HW/MemoryStick.h"
#include "Core/System.h"
// MS and FatMS states.
static MemStickState memStickState;
static MemStickFatState memStickFatState;
static u64 memStickSize;
static bool memStickNeedsAssign = false;
static u64 memStickInsertedAt = 0;
void MemoryStick_DoState(PointerWrap &p) {
auto s = p.Section("MemoryStick", 1, 3);
if (!s)
return;
p.Do(memStickState);
p.Do(memStickFatState);
if (s >= 2)
p.Do(memStickSize);
else
memStickSize = 1ULL * 1024 * 1024 * 1024;
if (s >= 3) {
p.Do(memStickNeedsAssign);
p.Do(memStickInsertedAt);
}
}
MemStickState MemoryStick_State() {
return memStickState;
}
MemStickFatState MemoryStick_FatState() {
if (memStickNeedsAssign && CoreTiming::GetTicks() > memStickInsertedAt + msToCycles(500)) {
// It's been long enough for us to be done mounting the memory stick.
memStickFatState = PSP_FAT_MEMORYSTICK_STATE_ASSIGNED;
memStickNeedsAssign = false;
}
return memStickFatState;
}
u64 MemoryStick_SectorSize() {
return 32 * 1024; // 32KB
}
u64 MemoryStick_FreeSpace() {
u64 freeSpace = pspFileSystem.FreeSpace("ms0:/");
if (freeSpace < memStickSize)
return freeSpace;
return memStickSize;
}
void MemoryStick_SetFatState(MemStickFatState state) {
memStickFatState = state;
memStickNeedsAssign = false;
}
void MemoryStick_SetState(MemStickState state) {
if (memStickState == state) {
return;
}
memStickState = state;
// If removed, we unmount. Otherwise, mounting is delayed.
if (state == PSP_MEMORYSTICK_STATE_NOT_INSERTED) {
MemoryStick_SetFatState(PSP_FAT_MEMORYSTICK_STATE_UNASSIGNED);
} else {
memStickInsertedAt = CoreTiming::GetTicks();
memStickNeedsAssign = true;
}
}
void MemoryStick_Init() {
if (g_Config.bMemStickInserted) {
memStickState = PSP_MEMORYSTICK_STATE_INSERTED;
memStickFatState = PSP_FAT_MEMORYSTICK_STATE_ASSIGNED;
} else {
memStickState = PSP_MEMORYSTICK_STATE_NOT_INSERTED;
memStickFatState = PSP_FAT_MEMORYSTICK_STATE_UNASSIGNED;
}
// Harry Potter and the Goblet of Fire has a bug where it can't handle certain amounts
// of free space due to incorrect 32-bit math.
// We use 9GB here, which does not trigger the bug, as a cap for the max free space.
memStickSize = 9ULL * 1024 * 1024 * 1024; // 9GB
memStickNeedsAssign = false;
}