memoserv/subprojects/memcard/src/content_info.cpp

44 lines
1,023 B
C++

#include "memcard/content_info.hpp"
#include "memcard/frame.hpp"
#include <algorithm>
namespace mc::psx {
namespace {
template <typename T>
T read_as (const ConstFrame& frame, std::size_t offset) {
T retval;
std::copy(
frame.begin() + offset,
frame.begin() + offset + sizeof(T),
reinterpret_cast<uint8_t*>(&retval)
);
return retval;
}
} //unnamed namespace
ContentInfo::ContentInfo (const ConstFrame& frame) :
use_byte(read_as<uint32_t>(frame, 0x84)),
magic(read_as<uint16_t>(frame, 0x00)),
available_blocks(BlockContent::Available)
{
auto block_content = read_as<uint8_t>(frame, 0x80);
switch (block_content & 0xf) {
case 0x0:
available_blocks = BlockContent::Available;
break;
case 0x1:
available_blocks = BlockContent::UsedLinkNextBlock;
break;
case 0x2:
available_blocks = BlockContent::UsedMidLink;
break;
case 0x3:
available_blocks = BlockContent::UsedEndLink;
break;
case 0xf:
default:
available_blocks = BlockContent::Unusable;
break;
}
}
} //namespace mc::psx