ComSquare
Cartridge.hpp
Go to the documentation of this file.
1 //
2 // Created by anonymus-raccoon on 1/27/20.
3 //
4 
5 #pragma once
6 
7 #include "InterruptVectors.hpp"
8 #include "Memory/AMemory.hpp"
10 #include "Models/Ints.hpp"
11 #include "Ram/Ram.hpp"
12 #include <filesystem>
13 #include <string>
14 
15 namespace ComSquare::Cartridge
16 {
18  {
21  };
22 
24  {
25  LoRom = 1u << 0u,
26  HiRom = 1u << 1u,
27  SlowRom = 1u << 2u,
28  FastRom = 1u << 3u,
29  ExRom = 1u << 4u
30  };
31  MappingMode operator|(const MappingMode &self, const MappingMode &other);
32  MappingMode &operator|=(MappingMode &self, const MappingMode &other);
33 
34  struct Header
35  {
37  std::string gameName;
41  uint8_t romType = 0;
43  unsigned romSize = 0;
45  unsigned sramSize = 0;
47  union
48  {
49  uint8_t creatorIDs[2];
50  uint16_t creatorID = 0;
51  };
53  uint8_t version = 0;
55  union
56  {
57  uint8_t checksumComplements[2];
58  uint16_t checksumComplement = 0;
59  };
61  union
62  {
63  uint8_t checksums[2];
64  uint16_t checksum = 0;
65  };
70 
71  Header() = default;
72  Header(const Header &) = default;
73  Header &operator=(const Header &) = default;
74  ~Header() = default;
75  };
76 
78  class Cartridge : public Ram::Ram
79  {
80  private:
82  std::string _romPath;
84  uint16_t _romStart = 0;
85 
89  static size_t getRomSize(const std::string &romPath);
92  bool _loadHeader();
94  bool _isSPCFile();
97  uint32_t _getHeaderAddress();
101  Header _mapHeader(uint32_t headerAddress);
105  static constexpr std::string_view _magicSPC = "SNES-SPC700 Sound File Data v0.30";
106 
107  public:
109  Cartridge();
111  explicit Cartridge(const std::string &romPath);
113  Cartridge(const Cartridge &) = delete;
115  Cartridge &operator=(const Cartridge &) = delete;
117  ~Cartridge() override = default;
118 
121 
124 
129  uint8_t read(uint24_t addr) override;
130 
135  void write(uint24_t addr, uint8_t data) override;
136 
139  [[nodiscard]] std::filesystem::path getRomPath() const;
140 
142  uint24_t getSize() const override;
143 
147  void loadRom(const std::string& path);
148  };
149 }// namespace ComSquare::Cartridge
ComSquare::Cartridge::Cartridge::_magicSPC
static constexpr std::string_view _magicSPC
Magic Header string of a SPC Rom.
Definition: Cartridge.hpp:105
Ints.hpp
ComSquare::Cartridge::CartridgeType
CartridgeType
Definition: Cartridge.hpp:17
ComSquare::Ram::Ram
Definition: Ram.hpp:14
ComSquare::Cartridge::Header::~Header
~Header()=default
ComSquare::Cartridge::Cartridge::_type
CartridgeType _type
Current type of the cartridge.
Definition: Cartridge.hpp:103
ComSquare::Cartridge::Header::operator=
Header & operator=(const Header &)=default
ComSquare::Cartridge::Header::emulationInterrupts
InterruptVectors emulationInterrupts
The interrupt vectors used to halt the CPU in emulation mode.
Definition: Cartridge.hpp:69
ComSquare::Cartridge::Cartridge::getType
CartridgeType getType()
Return current type of the cartridge.
Definition: Cartridge.cpp:211
ComSquare::Cartridge::LoRom
@ LoRom
Definition: Cartridge.hpp:25
ComSquare::Cartridge::operator|=
MappingMode & operator|=(MappingMode &self, const MappingMode &other)
Definition: Cartridge.cpp:226
ComSquare::Cartridge::Header::checksums
uint8_t checksums[2]
Definition: Cartridge.hpp:63
ComSquare::Cartridge::Cartridge::read
uint8_t read(uint24_t addr) override
Read from the rom.
Definition: Cartridge.cpp:48
ComSquare::Cartridge::Header::sramSize
unsigned sramSize
The size of the SRom inside the cartridge.
Definition: Cartridge.hpp:45
AMemory.hpp
ComSquare::Cartridge::Header::mappingMode
MappingMode mappingMode
The memory mapping of the ROM.
Definition: Cartridge.hpp:39
ComSquare::Cartridge::Cartridge::_isSPCFile
bool _isSPCFile()
Check if the cartridge is not a game but a SPC audio dump.
Definition: Cartridge.cpp:173
ComSquare::Cartridge::Header::gameName
std::string gameName
The name of the game.
Definition: Cartridge.hpp:37
uint24_t
unsigned uint24_t
Definition: Ints.hpp:10
ComSquare::Cartridge
Definition: Cartridge.cpp:12
ComSquare::Cartridge::Header::creatorIDs
uint8_t creatorIDs[2]
Definition: Cartridge.hpp:49
ComSquare::Cartridge::Header::romType
uint8_t romType
The rom type (special information about the rom, still don't know what).
Definition: Cartridge.hpp:41
ComSquare::Cartridge::Cartridge::getRomPath
std::filesystem::path getRomPath() const
The path of the rom file.
Definition: Cartridge.cpp:58
ComSquare::Cartridge::Cartridge::_getHeaderAddress
uint32_t _getHeaderAddress()
Get the address of the header.
Definition: Cartridge.cpp:111
ComSquare::Cartridge::MappingMode
MappingMode
Definition: Cartridge.hpp:23
ARectangleMemory.hpp
ComSquare::Cartridge::Header::nativeInterrupts
InterruptVectors nativeInterrupts
The interrupt vectors used to halt the CPU in native mode.
Definition: Cartridge.hpp:67
ComSquare::Cartridge::Cartridge::getSize
uint24_t getSize() const override
Get the size of the rom in bytes (without the smc header).
Definition: Cartridge.cpp:216
ComSquare::Cartridge::FastRom
@ FastRom
Definition: Cartridge.hpp:28
InterruptVectors.hpp
ComSquare::Cartridge::Cartridge::_romStart
uint16_t _romStart
Sometime the rom's data has an offset for a SMC header. This value indicate the start of the real rom...
Definition: Cartridge.hpp:84
ComSquare::Cartridge::SlowRom
@ SlowRom
Definition: Cartridge.hpp:27
ComSquare::Cartridge::Cartridge::_romPath
std::string _romPath
The path of the currently loaded rom.
Definition: Cartridge.hpp:82
ComSquare::Cartridge::Header::checksumComplement
uint16_t checksumComplement
Definition: Cartridge.hpp:58
ComSquare::Cartridge::Cartridge::Cartridge
Cartridge()
A default constructor that doesn't load anything.
Definition: Cartridge.cpp:16
ComSquare::Cartridge::InterruptVectors
Definition: InterruptVectors.hpp:11
ComSquare::Cartridge::Cartridge
Contains the rom's memory/instructions.
Definition: Cartridge.hpp:78
ComSquare::Cartridge::Cartridge::loadRom
void loadRom(const std::string &path)
Load the rom at the given path.
Definition: Cartridge.cpp:27
ComSquare::Cartridge::ExRom
@ ExRom
Definition: Cartridge.hpp:29
ComSquare::Cartridge::Header
Definition: Cartridge.hpp:34
ComSquare::Cartridge::Cartridge::getRomSize
static size_t getRomSize(const std::string &romPath)
Get the size of a rom from it's path.
Definition: Cartridge.cpp:39
ComSquare::Cartridge::Cartridge::header
Header header
The header of the cartridge.
Definition: Cartridge.hpp:120
ComSquare::Cartridge::Game
@ Game
Definition: Cartridge.hpp:19
ComSquare::Cartridge::Header::checksumComplements
uint8_t checksumComplements[2]
Definition: Cartridge.hpp:57
ComSquare::Cartridge::Audio
@ Audio
Definition: Cartridge.hpp:20
ComSquare::Cartridge::operator|
MappingMode operator|(const MappingMode &self, const MappingMode &other)
Definition: Cartridge.cpp:221
ComSquare::Cartridge::Header::romSize
unsigned romSize
The size (in bytes) of the ram.
Definition: Cartridge.hpp:43
ComSquare::Cartridge::Cartridge::_loadHeader
bool _loadHeader()
Set the public variable header by parsing the header in the ROM.
Definition: Cartridge.cpp:190
ComSquare::Cartridge::Header::creatorID
uint16_t creatorID
Definition: Cartridge.hpp:50
ComSquare::Cartridge::Header::Header
Header()=default
ComSquare::Cartridge::Cartridge::write
void write(uint24_t addr, uint8_t data) override
Write data to the rom.
Definition: Cartridge.cpp:53
ComSquare::Cartridge::HiRom
@ HiRom
Definition: Cartridge.hpp:26
ComSquare::Cartridge::Cartridge::~Cartridge
~Cartridge() override=default
Destructor that free the cartridge data.
Ram.hpp
ComSquare::Cartridge::Cartridge::_mapHeader
Header _mapHeader(uint32_t headerAddress)
Parse the memory to get a readable header.
Definition: Cartridge.cpp:63
ComSquare::Cartridge::Cartridge::operator=
Cartridge & operator=(const Cartridge &)=delete
The cartridge can't be assigned.
ComSquare::Cartridge::Header::checksum
uint16_t checksum
Definition: Cartridge.hpp:64
ComSquare::Cartridge::Header::version
uint8_t version
The version of the game.
Definition: Cartridge.hpp:53