Initial Commit

This commit is contained in:
Phillip Stephens 2016-03-25 21:26:51 -07:00
commit 3f70c1b73a
5 changed files with 215 additions and 0 deletions

9
CMakeLists.txt Normal file
View File

@ -0,0 +1,9 @@
cmake_minimum_required(VERSION 3.0)
project(Card)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wno-multichar -fno-exceptions")
include_directories(include)
add_library(card STATIC
include/Card.hpp src/Card.cpp)
add_subdirectory(test)

142
include/Card.hpp Normal file
View File

@ -0,0 +1,142 @@
#ifndef __CARD_HPP__
#define __CARD_HPP__
#include <string>
#include <vector>
#include <stdint.h>
#include <memory.h>
namespace card
{
uint32_t constexpr BlockSize = 0x2000;
uint32_t constexpr MaxFiles = 127;
enum class EPermissions : uint8_t
{
};
enum class EBannerFlags : uint8_t
{
};
class File
{
union
{
struct
{
uint8_t m_id[4];
uint8_t m_maker[2];
uint8_t m_reserved;
uint8_t m_bannerFlags;
char m_filename[0x20];
uint32_t m_modifiedTime;
uint8_t m_permissions;
int8_t m_copyCounter;
uint16_t m_firstBlock;
uint16_t m_reserved2;
uint32_t m_commentAddr;
};
uint8_t __raw[0x40] = {0xFF};
};
public:
File() {}
File(char data[0x40])
{
memcpy(__raw, data, 0x40);
}
File(const char* filename)
{
memset(m_filename, 0, 0x20);
memcpy(m_filename, filename, 0x20);
}
~File() {}
};
class BlockAllocationTable
{
union
{
struct
{
uint16_t m_checksum;
uint16_t m_checksumInv;
uint16_t m_freeBlocks;
uint16_t m_lastAllocated;
uint16_t m_map[0xFFB];
};
uint8_t __raw[BlockSize] = {0xFF};
};
public:
BlockAllocationTable() {}
BlockAllocationTable(uint8_t data[BlockSize]);
~BlockAllocationTable() {}
};
class Directory
{
union
{
struct
{
File m_files[MaxFiles];
uint8_t __padding[0x3a];
uint16_t m_updateCounter;
uint16_t m_checksum;
uint16_t m_checksumInv;
};
uint8_t __raw[BlockSize] = {0xFF};
};
public:
Directory() {}
Directory(uint8_t data[BlockSize])
{
memcpy(__raw, data, BlockSize);
}
~Directory() {}
};
class Card
{
union
{
struct
{
std::string m_filepath;
uint8_t m_serial[12];
uint64_t m_formatTime;
int32_t m_sramBias;
uint32_t m_sramLanguage;
uint32_t m_unknown;
uint16_t m_deviceId; /* 0 for Slot A, 1 for Slot B */
uint16_t m_sizeMb;
uint16_t m_encoding;
uint8_t __padding[468];
uint16_t m_updateCounter;
uint16_t m_checksum;
uint16_t m_checksumInv;
};
uint8_t __raw[BlockSize] = {0xFF};
};
Directory m_dir;
Directory m_dirBackup;
Directory* m_dirInUse = nullptr;
BlockAllocationTable m_bat;
BlockAllocationTable m_batBackup;
BlockAllocationTable* m_batInUse = nullptr;
char m_game[4]; /*!< The current selected game, if null requests return the first matching filename */
char m_maker[2]; /*!< The current selected maker, if null requests return the first matching filename */
public:
Card();
Card(const std::string& filepath, const char* game = nullptr, const char* maker=nullptr);
~Card() {}
void setGame(const char* id);
const uint8_t* getGame() const;
void setMaker(const char* maker);
const uint8_t* getMaker() const;
};
}
#endif // __CARD_HPP__

46
src/Card.cpp Normal file
View File

@ -0,0 +1,46 @@
#include "Card.hpp"
#include <string.h>
namespace card
{
Card::Card()
{
memset(__raw, 0xFF, BlockSize);
}
Card::Card(const std::string &filepath, const char* game, const char* maker)
: m_filepath(filepath)
{
memset(__raw, 0xFF, BlockSize);
if (game)
memcpy(m_game, game, 4);
if (maker)
memcpy(m_maker, maker, 2);
}
void Card::setGame(const char* id)
{
if (strlen(id) != 4)
return;
memcpy(m_game, id, 4);
}
const uint8_t* Card::getGame() const
{
return reinterpret_cast<const uint8_t*>(m_game);
}
void Card::setMaker(const char* maker)
{
if (strlen(maker) != 2)
return;
memcpy(m_maker, maker, 2);
}
const uint8_t* Card::getMaker() const
{
return reinterpret_cast<const uint8_t*>(m_maker);
}
}

6
test/CMakeLists.txt Normal file
View File

@ -0,0 +1,6 @@
add_executable(cardtest
main.cpp)
target_link_libraries(cardtest
card)

12
test/main.cpp Normal file
View File

@ -0,0 +1,12 @@
#include "Card.hpp"
#include <iostream>
int main()
{
card::Card card{"test.mc"};
card.setGame("GM8E");
card.setMaker("01");
printf("Selected Game ID: %.4s\n", card.getGame());
printf("Selected Maker ID: %.2s\n", card.getMaker());
return 0;
}