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
20namespace rom {
21class WriteFence;
22} // namespace rom
23
28class Rom {
29 public:
30 struct SaveSettings {
31 bool backup = false;
32 bool save_new = false;
33 std::string filename;
34 // Require a successful backup of an existing save target before replacing
35 // it. Unlike the legacy best-effort `backup` flag, backup failure aborts
36 // the save. A new target has no previous bytes to protect. This implies
37 // backup creation when `backup` is false.
38 bool require_backup = false;
39 };
40
41 struct LoadOptions {
42 bool strip_header = true;
44
45 static LoadOptions Defaults() { return LoadOptions{}; }
46 };
47
48 Rom() = default;
49 Rom(const Rom& other);
50 Rom& operator=(const Rom& other);
52 ~Rom() = default;
53
54 absl::Status LoadFromFile(
55 const std::string& filename,
56 const LoadOptions& options = LoadOptions::Defaults());
57 absl::Status LoadFromData(
58 const std::vector<uint8_t>& data,
59 const LoadOptions& options = LoadOptions::Defaults());
60
61 absl::Status SaveToFile(const SaveSettings& settings);
62
63 void Expand(int size) {
64 const bool size_changed = rom_data_.size() != static_cast<size_t>(size);
65 rom_data_.resize(size);
66 size_ = size;
67 if (size_changed) {
69 }
70 }
71
72 void Close() {
73 const bool had_data = !rom_data_.empty();
74 rom_data_.clear();
75 size_ = 0;
76 if (had_data) {
78 }
79 }
80
81 // Raw access
82 absl::StatusOr<uint8_t> ReadByte(int offset) const;
83 absl::StatusOr<uint16_t> ReadWord(int offset) const;
84 absl::StatusOr<uint32_t> ReadLong(int offset) const;
85 absl::StatusOr<std::vector<uint8_t>> ReadByteVector(uint32_t offset,
86 uint32_t length) const;
87 absl::StatusOr<gfx::Tile16> ReadTile16(uint32_t tile16_id,
89
90 absl::Status WriteTile16(int tile16_id, uint32_t tile16_ptr,
91 const gfx::Tile16& tile);
92 absl::Status WriteByte(int addr, uint8_t value);
93 absl::Status WriteWord(int addr, uint16_t value);
94 absl::Status WriteShort(int addr, uint16_t value);
95 absl::Status WriteLong(uint32_t addr, uint32_t value);
96 absl::Status WriteVector(int addr, std::vector<uint8_t> data);
97 absl::Status WriteColor(uint32_t address, const gfx::SnesColor& color);
98
99 template <typename... Args>
100 absl::Status WriteTransaction(Args... args) {
101 absl::Status status;
102 ((status = WriteHelper(args)), ...);
103 return status;
104 }
105
106 template <typename T, typename... Args>
107 absl::Status ReadTransaction(T& var, int address, Args&&... args) {
108 absl::Status status = ReadHelper<T>(var, address);
109 if (!status.ok()) {
110 return status;
111 }
112 if constexpr (sizeof...(args) > 0) {
113 status = ReadTransaction(std::forward<Args>(args)...);
114 }
115 return status;
116 }
117
118 struct WriteAction {
119 using ValueType =
120 std::variant<int, uint8_t, uint16_t, short, std::vector<uint8_t>,
121 gfx::SnesColor, std::vector<gfx::SnesColor>>;
124 };
125
126 virtual absl::Status WriteHelper(const WriteAction& action);
127
128 template <typename T>
129 absl::Status ReadHelper(T& var, int address) {
130 if constexpr (std::is_same_v<T, uint8_t>) {
131 auto result = ReadByte(address);
132 if (!result.ok())
133 return result.status();
134 var = *result;
135 } else if constexpr (std::is_same_v<T, uint16_t>) {
136 auto result = ReadWord(address);
137 if (!result.ok())
138 return result.status();
139 var = *result;
140 } else if constexpr (std::is_same_v<T, std::vector<uint8_t>>) {
141 auto result = ReadByteVector(address, var.size());
142 if (!result.ok())
143 return result.status();
144 var = *result;
145 }
146 return absl::OkStatus();
147 }
148
149 uint8_t& operator[](unsigned long i) {
150 if (i >= size_)
151 throw std::out_of_range("Rom index out of range");
152 return rom_data_[i];
153 }
154
155 bool is_loaded() const { return !rom_data_.empty(); }
156 bool dirty() const { return dirty_; }
157 void set_dirty(bool dirty) { dirty_ = dirty; }
158 void ClearDirty() { dirty_ = false; }
159
160 // Monotonic generation for RoomObject caches derived from ROM tile tables.
161 // Successful loads, content replacement, a real Close, and real size changes
162 // advance it automatically. Writers that mutate object tile sources must
163 // advance it only after their transaction commits successfully.
166
167 auto title() const { return title_; }
168 auto size() const { return size_; }
169 auto data() const { return rom_data_.data(); }
170 auto mutable_data() { return rom_data_.data(); }
171 auto begin() { return rom_data_.begin(); }
172 auto end() { return rom_data_.end(); }
173 const auto& vector() const { return rom_data_; }
174 auto& mutable_vector() { return rom_data_; }
175 auto filename() const { return filename_; }
176 auto set_filename(std::string_view name) { filename_ = name; }
177 auto short_name() const { return short_name_; }
178
179 // Resource labels are generic enough to keep here
183
184 // ROM write fence stack.
185 //
186 // When one or more fences are active, Rom::Write* calls must be allowed by
187 // every fence (logical AND). This is used for strict save-time guardrails so
188 // feature writers can't clobber reserved regions.
191 size_t write_fence_depth() const { return write_fence_stack_.size(); }
192
193 private:
194 // Size of the ROM data.
195 unsigned long size_ = 0;
196
197 // Title of the ROM loaded from the header
198 std::string title_ = "ROM not loaded";
199
200 // Filename of the ROM
201 std::string filename_;
202
203 // Short name of the ROM
204 std::string short_name_;
205
206 // Full contiguous rom space
207 std::vector<uint8_t> rom_data_;
208
209 // Label manager for unique resource names.
211
212 // True if there are unsaved changes
213 bool dirty_ = false;
214
215 // Generation of object-tile data visible to RoomObject parser caches.
217
218 // Active write fences (not owned).
219 std::vector<rom::WriteFence*> write_fence_stack_;
220};
221
222} // namespace yaze
223
224#endif // YAZE_ROM_ROM_H
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:28
absl::StatusOr< std::vector< uint8_t > > ReadByteVector(uint32_t offset, uint32_t length) const
Definition rom.cc:586
void PushWriteFence(rom::WriteFence *fence)
Definition rom.cc:535
uint64_t object_tile_revision() const
Definition rom.h:164
~Rom()=default
project::ResourceLabelManager * resource_label()
Definition rom.h:180
absl::Status ReadTransaction(T &var, int address, Args &&... args)
Definition rom.h:107
absl::Status LoadFromFile(const std::string &filename, const LoadOptions &options=LoadOptions::Defaults())
Definition rom.cc:270
auto begin()
Definition rom.h:171
void ClearDirty()
Definition rom.h:158
absl::StatusOr< gfx::Tile16 > ReadTile16(uint32_t tile16_id, uint32_t tile16_ptr)
Definition rom.cc:599
absl::Status WriteColor(uint32_t address, const gfx::SnesColor &color)
Definition rom.cc:733
auto filename() const
Definition rom.h:175
void PopWriteFence(rom::WriteFence *fence)
Definition rom.cc:542
auto end()
Definition rom.h:172
absl::Status WriteByte(int addr, uint8_t value)
Definition rom.cc:631
absl::StatusOr< uint8_t > ReadByte(int offset) const
Definition rom.cc:563
absl::Status WriteTile16(int tile16_id, uint32_t tile16_ptr, const gfx::Tile16 &tile)
Definition rom.cc:618
void set_dirty(bool dirty)
Definition rom.h:157
auto mutable_data()
Definition rom.h:170
const auto & vector() const
Definition rom.h:173
absl::Status WriteVector(int addr, std::vector< uint8_t > data)
Definition rom.cc:703
std::string title_
Definition rom.h:198
void Expand(int size)
Definition rom.h:63
absl::Status WriteTransaction(Args... args)
Definition rom.h:100
absl::Status SaveToFile(const SaveSettings &settings)
Definition rom.cc:416
absl::StatusOr< uint16_t > ReadWord(int offset) const
Definition rom.cc:571
std::vector< uint8_t > rom_data_
Definition rom.h:207
Rom()=default
auto data() const
Definition rom.h:169
auto size() const
Definition rom.h:168
std::vector< rom::WriteFence * > write_fence_stack_
Definition rom.h:219
Rom & operator=(const Rom &other)
Definition rom.cc:240
bool dirty() const
Definition rom.h:156
bool dirty_
Definition rom.h:213
auto & mutable_vector()
Definition rom.h:174
absl::Status LoadFromData(const std::vector< uint8_t > &data, const LoadOptions &options=LoadOptions::Defaults())
Definition rom.cc:379
auto short_name() const
Definition rom.h:177
void AdvanceObjectTileRevision()
Definition rom.h:165
absl::Status ReadHelper(T &var, int address)
Definition rom.h:129
std::string filename_
Definition rom.h:201
unsigned long size_
Definition rom.h:195
absl::Status WriteShort(int addr, uint16_t value)
Definition rom.cc:673
project::ResourceLabelManager resource_label_manager_
Definition rom.h:210
void Close()
Definition rom.h:72
uint8_t & operator[](unsigned long i)
Definition rom.h:149
auto set_filename(std::string_view name)
Definition rom.h:176
std::string short_name_
Definition rom.h:204
uint64_t object_tile_revision_
Definition rom.h:216
bool is_loaded() const
Definition rom.h:155
absl::Status WriteWord(int addr, uint16_t value)
Definition rom.cc:650
virtual absl::Status WriteHelper(const WriteAction &action)
Definition rom.cc:739
size_t write_fence_depth() const
Definition rom.h:191
absl::Status WriteLong(uint32_t addr, uint32_t value)
Definition rom.cc:677
auto title() const
Definition rom.h:167
absl::StatusOr< uint32_t > ReadLong(int offset) const
Definition rom.cc:578
SNES Color container.
Definition snes_color.h:110
Tile composition of four 8x8 tiles.
Definition snes_tile.h:142
Rom * rom()
Get the current ROM instance.
static LoadOptions Defaults()
Definition rom.h:45
bool load_resource_labels
Definition rom.h:43
std::string filename
Definition rom.h:33
std::variant< int, uint8_t, uint16_t, short, std::vector< uint8_t >, gfx::SnesColor, std::vector< gfx::SnesColor > > ValueType
Definition rom.h:119
ValueType value
Definition rom.h:123