44 lines
1,023 B
C++
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
|