yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
rom.h
Go to the documentation of this file.
1#ifndef YAZE_ROM_ROM_H
2#define YAZE_ROM_ROM_H
3
4#include <cstddef>
5#include <cstdint>
6#include <map>
7#include <string>
8#include <variant>
9#include <vector>
10
11#include "absl/status/status.h"
12#include "absl/status/statusor.h"
15#include "core/project.h"
16#include "rom/rom_diagnostics.h"
17
18namespace yaze {
19
24class Rom {
25 public:
26 struct SaveSettings {
27 bool backup = false;
28 bool save_new = false;
29 std::string filename;
30 };
31
32 struct LoadOptions {
33 bool strip_header = true;
35
36 static LoadOptions Defaults() { return LoadOptions{}; }
37 };
38
39 Rom() = default;
40 ~Rom() = default;
41
42 absl::Status LoadFromFile(const std::string& filename,
43 const LoadOptions& options = LoadOptions::Defaults());
44 absl::Status LoadFromData(const std::vector<uint8_t>& data,
45 const LoadOptions& options = LoadOptions::Defaults());
46
47 absl::Status SaveToFile(const SaveSettings& settings);
48
49 void Expand(int size) {
50 rom_data_.resize(size);
51 size_ = size;
52 }
53
54 void Close() {
55 rom_data_.clear();
56 size_ = 0;
57 }
58
59 // Raw access
60 absl::StatusOr<uint8_t> ReadByte(int offset);
61 absl::StatusOr<uint16_t> ReadWord(int offset);
62 absl::StatusOr<uint32_t> ReadLong(int offset);
63 absl::StatusOr<std::vector<uint8_t>> ReadByteVector(uint32_t offset,
64 uint32_t length) const;
65 absl::StatusOr<gfx::Tile16> ReadTile16(uint32_t tile16_id, uint32_t tile16_ptr);
66
67 absl::Status WriteTile16(int tile16_id, uint32_t tile16_ptr, const gfx::Tile16& tile);
68 absl::Status WriteByte(int addr, uint8_t value);
69 absl::Status WriteWord(int addr, uint16_t value);
70 absl::Status WriteShort(int addr, uint16_t value);
71 absl::Status WriteLong(uint32_t addr, uint32_t value);
72 absl::Status WriteVector(int addr, std::vector<uint8_t> data);
73 absl::Status WriteColor(uint32_t address, const gfx::SnesColor& color);
74
75 template <typename... Args>
76 absl::Status WriteTransaction(Args... args) {
77 absl::Status status;
78 ((status = WriteHelper(args)), ...);
79 return status;
80 }
81
82 template <typename T, typename... Args>
83 absl::Status ReadTransaction(T& var, int address, Args&&... args) {
84 absl::Status status = ReadHelper<T>(var, address);
85 if (!status.ok()) {
86 return status;
87 }
88 if constexpr (sizeof...(args) > 0) {
89 status = ReadTransaction(std::forward<Args>(args)...);
90 }
91 return status;
92 }
93
94 struct WriteAction {
95 using ValueType =
96 std::variant<int, uint8_t, uint16_t, short, std::vector<uint8_t>,
97 gfx::SnesColor, std::vector<gfx::SnesColor>>;
100 };
101
102 virtual absl::Status WriteHelper(const WriteAction& action);
103
104 template <typename T>
105 absl::Status ReadHelper(T& var, int address) {
106 if constexpr (std::is_same_v<T, uint8_t>) {
107 auto result = ReadByte(address);
108 if (!result.ok()) return result.status();
109 var = *result;
110 } else if constexpr (std::is_same_v<T, uint16_t>) {
111 auto result = ReadWord(address);
112 if (!result.ok()) return result.status();
113 var = *result;
114 } else if constexpr (std::is_same_v<T, std::vector<uint8_t>>) {
115 auto result = ReadByteVector(address, var.size());
116 if (!result.ok()) return result.status();
117 var = *result;
118 }
119 return absl::OkStatus();
120 }
121
122 uint8_t& operator[](unsigned long i) {
123 if (i >= size_)
124 throw std::out_of_range("Rom index out of range");
125 return rom_data_[i];
126 }
127
128 bool is_loaded() const { return !rom_data_.empty(); }
129 bool dirty() const { return dirty_; }
130 void set_dirty(bool dirty) { dirty_ = dirty; }
131 void ClearDirty() { dirty_ = false; }
132
133 auto title() const { return title_; }
134 auto size() const { return size_; }
135 auto data() const { return rom_data_.data(); }
136 auto mutable_data() { return rom_data_.data(); }
137 auto begin() { return rom_data_.begin(); }
138 auto end() { return rom_data_.end(); }
139 const auto& vector() const { return rom_data_; }
140 auto& mutable_vector() { return rom_data_; }
141 auto filename() const { return filename_; }
142 auto set_filename(std::string_view name) { filename_ = name; }
143 auto short_name() const { return short_name_; }
144
145 // Resource labels are generic enough to keep here
149
150 private:
151 // Size of the ROM data.
152 unsigned long size_ = 0;
153
154 // Title of the ROM loaded from the header
155 std::string title_ = "ROM not loaded";
156
157 // Filename of the ROM
158 std::string filename_;
159
160 // Short name of the ROM
161 std::string short_name_;
162
163 // Full contiguous rom space
164 std::vector<uint8_t> rom_data_;
165
166 // Label manager for unique resource names.
168
169 // True if there are unsaved changes
170 bool dirty_ = false;
171};
172
173} // namespace yaze
174
175#endif // YAZE_ROM_ROM_H
176
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:24
absl::StatusOr< std::vector< uint8_t > > ReadByteVector(uint32_t offset, uint32_t length) const
Definition rom.cc:243
~Rom()=default
project::ResourceLabelManager * resource_label()
Definition rom.h:146
absl::Status ReadTransaction(T &var, int address, Args &&... args)
Definition rom.h:83
absl::Status LoadFromFile(const std::string &filename, const LoadOptions &options=LoadOptions::Defaults())
Definition rom.cc:74
auto begin()
Definition rom.h:137
void ClearDirty()
Definition rom.h:131
absl::StatusOr< gfx::Tile16 > ReadTile16(uint32_t tile16_id, uint32_t tile16_ptr)
Definition rom.cc:256
absl::Status WriteColor(uint32_t address, const gfx::SnesColor &color)
Definition rom.cc:357
auto filename() const
Definition rom.h:141
auto end()
Definition rom.h:138
absl::Status WriteByte(int addr, uint8_t value)
Definition rom.cc:286
absl::Status WriteTile16(int tile16_id, uint32_t tile16_ptr, const gfx::Tile16 &tile)
Definition rom.cc:274
void set_dirty(bool dirty)
Definition rom.h:130
auto mutable_data()
Definition rom.h:136
const auto & vector() const
Definition rom.h:139
absl::StatusOr< uint16_t > ReadWord(int offset)
Definition rom.cc:228
absl::Status WriteVector(int addr, std::vector< uint8_t > data)
Definition rom.cc:340
std::string title_
Definition rom.h:155
void Expand(int size)
Definition rom.h:49
absl::Status WriteTransaction(Args... args)
Definition rom.h:76
absl::Status SaveToFile(const SaveSettings &settings)
Definition rom.cc:164
absl::StatusOr< uint32_t > ReadLong(int offset)
Definition rom.cc:235
std::vector< uint8_t > rom_data_
Definition rom.h:164
Rom()=default
auto data() const
Definition rom.h:135
auto size() const
Definition rom.h:134
bool dirty() const
Definition rom.h:129
bool dirty_
Definition rom.h:170
auto & mutable_vector()
Definition rom.h:140
absl::Status LoadFromData(const std::vector< uint8_t > &data, const LoadOptions &options=LoadOptions::Defaults())
Definition rom.cc:147
auto short_name() const
Definition rom.h:143
absl::Status ReadHelper(T &var, int address)
Definition rom.h:105
std::string filename_
Definition rom.h:158
unsigned long size_
Definition rom.h:152
absl::StatusOr< uint8_t > ReadByte(int offset)
Definition rom.cc:221
absl::Status WriteShort(int addr, uint16_t value)
Definition rom.cc:316
project::ResourceLabelManager resource_label_manager_
Definition rom.h:167
void Close()
Definition rom.h:54
uint8_t & operator[](unsigned long i)
Definition rom.h:122
auto set_filename(std::string_view name)
Definition rom.h:142
std::string short_name_
Definition rom.h:161
bool is_loaded() const
Definition rom.h:128
absl::Status WriteWord(int addr, uint16_t value)
Definition rom.cc:299
virtual absl::Status WriteHelper(const WriteAction &action)
Definition rom.cc:363
absl::Status WriteLong(uint32_t addr, uint32_t value)
Definition rom.cc:320
auto title() const
Definition rom.h:133
SNES Color container.
Definition snes_color.h:110
Tile composition of four 8x8 tiles.
Definition snes_tile.h:140
static LoadOptions Defaults()
Definition rom.h:36
bool load_resource_labels
Definition rom.h:34
std::string filename
Definition rom.h:29
std::variant< int, uint8_t, uint16_t, short, std::vector< uint8_t >, gfx::SnesColor, std::vector< gfx::SnesColor > > ValueType
Definition rom.h:95
ValueType value
Definition rom.h:99