mirror of https://github.com/AxioDL/kabufuda.git
Initial Commit
This commit is contained in:
commit
3f70c1b73a
|
@ -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)
|
|
@ -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__
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
add_executable(cardtest
|
||||||
|
main.cpp)
|
||||||
|
|
||||||
|
target_link_libraries(cardtest
|
||||||
|
card)
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue