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 };
35
36 struct LoadOptions {
37 bool strip_header = true;
39
40 static LoadOptions Defaults() { return LoadOptions{}; }
41 };
42
43 Rom() = default;
44 ~Rom() = default;
45
46 absl::Status LoadFromFile(const std::string& filename,
47 const LoadOptions& options = LoadOptions::Defaults());
48 absl::Status LoadFromData(const std::vector<uint8_t>& data,
49 const LoadOptions& options = LoadOptions::Defaults());
50
51 absl::Status SaveToFile(const SaveSettings& settings);
52
53 void Expand(int size) {
54 rom_data_.resize(size);
55 size_ = size;
56 }
57
58 void Close() {
59 rom_data_.clear();
60 size_ = 0;
61 }
62
63 // Raw access
64 absl::StatusOr<uint8_t> ReadByte(int offset) const;
65 absl::StatusOr<uint16_t> ReadWord(int offset) const;
66 absl::StatusOr<uint32_t> ReadLong(int offset) const;
67 absl::StatusOr<std::vector<uint8_t>> ReadByteVector(uint32_t offset,
68 uint32_t length) const;
69 absl::StatusOr<gfx::Tile16> ReadTile16(uint32_t tile16_id, uint32_t tile16_ptr);
70
71 absl::Status WriteTile16(int tile16_id, uint32_t tile16_ptr, const gfx::Tile16& tile);
72 absl::Status WriteByte(int addr, uint8_t value);
73 absl::Status WriteWord(int addr, uint16_t value);
74 absl::Status WriteShort(int addr, uint16_t value);
75 absl::Status WriteLong(uint32_t addr, uint32_t value);
76 absl::Status WriteVector(int addr, std::vector<uint8_t> data);
77 absl::Status WriteColor(uint32_t address, const gfx::SnesColor& color);
78
79 template <typename... Args>
80 absl::Status WriteTransaction(Args... args) {
81 absl::Status status;
82 ((status = WriteHelper(args)), ...);
83 return status;
84 }
85
86 template <typename T, typename... Args>
87 absl::Status ReadTransaction(T& var, int address, Args&&... args) {
88 absl::Status status = ReadHelper<T>(var, address);
89 if (!status.ok()) {
90 return status;
91 }
92 if constexpr (sizeof...(args) > 0) {
93 status = ReadTransaction(std::forward<Args>(args)...);
94 }
95 return status;
96 }
97
98 struct WriteAction {
99 using ValueType =
100 std::variant<int, uint8_t, uint16_t, short, std::vector<uint8_t>,
101 gfx::SnesColor, std::vector<gfx::SnesColor>>;
104 };
105
106 virtual absl::Status WriteHelper(const WriteAction& action);
107
108 template <typename T>
109 absl::Status ReadHelper(T& var, int address) {
110 if constexpr (std::is_same_v<T, uint8_t>) {
111 auto result = ReadByte(address);
112 if (!result.ok()) return result.status();
113 var = *result;
114 } else if constexpr (std::is_same_v<T, uint16_t>) {
115 auto result = ReadWord(address);
116 if (!result.ok()) return result.status();
117 var = *result;
118 } else if constexpr (std::is_same_v<T, std::vector<uint8_t>>) {
119 auto result = ReadByteVector(address, var.size());
120 if (!result.ok()) return result.status();
121 var = *result;
122 }
123 return absl::OkStatus();
124 }
125
126 uint8_t& operator[](unsigned long i) {
127 if (i >= size_)
128 throw std::out_of_range("Rom index out of range");
129 return rom_data_[i];
130 }
131
132 bool is_loaded() const { return !rom_data_.empty(); }
133 bool dirty() const { return dirty_; }
134 void set_dirty(bool dirty) { dirty_ = dirty; }
135 void ClearDirty() { dirty_ = false; }
136
137 auto title() const { return title_; }
138 auto size() const { return size_; }
139 auto data() const { return rom_data_.data(); }
140 auto mutable_data() { return rom_data_.data(); }
141 auto begin() { return rom_data_.begin(); }
142 auto end() { return rom_data_.end(); }
143 const auto& vector() const { return rom_data_; }
144 auto& mutable_vector() { return rom_data_; }
145 auto filename() const { return filename_; }
146 auto set_filename(std::string_view name) { filename_ = name; }
147 auto short_name() const { return short_name_; }
148
149 // Resource labels are generic enough to keep here
153
154 // ROM write fence stack.
155 //
156 // When one or more fences are active, Rom::Write* calls must be allowed by
157 // every fence (logical AND). This is used for strict save-time guardrails so
158 // feature writers can't clobber reserved regions.
161 size_t write_fence_depth() const { return write_fence_stack_.size(); }
162
163 private:
164 // Size of the ROM data.
165 unsigned long size_ = 0;
166
167 // Title of the ROM loaded from the header
168 std::string title_ = "ROM not loaded";
169
170 // Filename of the ROM
171 std::string filename_;
172
173 // Short name of the ROM
174 std::string short_name_;
175
176 // Full contiguous rom space
177 std::vector<uint8_t> rom_data_;
178
179 // Label manager for unique resource names.
181
182 // True if there are unsaved changes
183 bool dirty_ = false;
184
185 // Active write fences (not owned).
186 std::vector<rom::WriteFence*> write_fence_stack_;
187};
188
189} // namespace yaze
190
191#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:431
void PushWriteFence(rom::WriteFence *fence)
Definition rom.cc:380
~Rom()=default
project::ResourceLabelManager * resource_label()
Definition rom.h:150
absl::Status ReadTransaction(T &var, int address, Args &&... args)
Definition rom.h:87
absl::Status LoadFromFile(const std::string &filename, const LoadOptions &options=LoadOptions::Defaults())
Definition rom.cc:155
auto begin()
Definition rom.h:141
void ClearDirty()
Definition rom.h:135
absl::StatusOr< gfx::Tile16 > ReadTile16(uint32_t tile16_id, uint32_t tile16_ptr)
Definition rom.cc:444
absl::Status WriteColor(uint32_t address, const gfx::SnesColor &color)
Definition rom.cc:578
auto filename() const
Definition rom.h:145
void PopWriteFence(rom::WriteFence *fence)
Definition rom.cc:387
auto end()
Definition rom.h:142
absl::Status WriteByte(int addr, uint8_t value)
Definition rom.cc:476
absl::StatusOr< uint8_t > ReadByte(int offset) const
Definition rom.cc:408
absl::Status WriteTile16(int tile16_id, uint32_t tile16_ptr, const gfx::Tile16 &tile)
Definition rom.cc:463
void set_dirty(bool dirty)
Definition rom.h:134
auto mutable_data()
Definition rom.h:140
const auto & vector() const
Definition rom.h:143
absl::Status WriteVector(int addr, std::vector< uint8_t > data)
Definition rom.cc:548
std::string title_
Definition rom.h:168
void Expand(int size)
Definition rom.h:53
absl::Status WriteTransaction(Args... args)
Definition rom.h:80
absl::Status SaveToFile(const SaveSettings &settings)
Definition rom.cc:291
absl::StatusOr< uint16_t > ReadWord(int offset) const
Definition rom.cc:416
std::vector< uint8_t > rom_data_
Definition rom.h:177
Rom()=default
auto data() const
Definition rom.h:139
auto size() const
Definition rom.h:138
std::vector< rom::WriteFence * > write_fence_stack_
Definition rom.h:186
bool dirty() const
Definition rom.h:133
bool dirty_
Definition rom.h:183
auto & mutable_vector()
Definition rom.h:144
absl::Status LoadFromData(const std::vector< uint8_t > &data, const LoadOptions &options=LoadOptions::Defaults())
Definition rom.cc:255
auto short_name() const
Definition rom.h:147
absl::Status ReadHelper(T &var, int address)
Definition rom.h:109
std::string filename_
Definition rom.h:171
unsigned long size_
Definition rom.h:165
absl::Status WriteShort(int addr, uint16_t value)
Definition rom.cc:518
project::ResourceLabelManager resource_label_manager_
Definition rom.h:180
void Close()
Definition rom.h:58
uint8_t & operator[](unsigned long i)
Definition rom.h:126
auto set_filename(std::string_view name)
Definition rom.h:146
std::string short_name_
Definition rom.h:174
bool is_loaded() const
Definition rom.h:132
absl::Status WriteWord(int addr, uint16_t value)
Definition rom.cc:495
virtual absl::Status WriteHelper(const WriteAction &action)
Definition rom.cc:584
size_t write_fence_depth() const
Definition rom.h:161
absl::Status WriteLong(uint32_t addr, uint32_t value)
Definition rom.cc:522
auto title() const
Definition rom.h:137
absl::StatusOr< uint32_t > ReadLong(int offset) const
Definition rom.cc:423
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:40
bool load_resource_labels
Definition rom.h:38
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:99
ValueType value
Definition rom.h:103