yaze 0.2.0
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
command.h
Go to the documentation of this file.
1#ifndef YAZE_CLI_COMMAND_HANDLER_H
2#define YAZE_CLI_COMMAND_HANDLER_H
3
4#include <cstdint>
5#include <iostream>
6#include <memory>
7#include <sstream>
8#include <string>
9#include <string_view>
10#include <unordered_map>
11#include <vector>
12
13#include "absl/status/status.h"
14#include "absl/strings/str_cat.h"
15#include "app/core/common.h"
16#include "app/core/constants.h"
17#include "app/emu/snes.h"
18#include "app/gfx/bitmap.h"
19#include "app/gfx/compression.h"
21#include "app/gfx/snes_tile.h"
22#include "app/gui/canvas.h"
23#include "app/rom.h"
25#include "asar-dll-bindings/c/asar.h"
26
27namespace yaze {
28namespace cli {
29
46
47 public:
48 explicit ColorModifier(ColorCode pCode) : code(pCode) {}
49 friend std::ostream& operator<<(std::ostream& os, const ColorModifier& mod) {
50 return os << "\033[" << mod.code << "m";
51 }
52};
53
55 public:
56 CommandHandler() = default;
57 virtual ~CommandHandler() = default;
58 virtual absl::Status handle(const std::vector<std::string>& arg_vec) = 0;
59
61};
62
63class ApplyPatch : public CommandHandler {
64 public:
65 absl::Status handle(const std::vector<std::string>& arg_vec) override;
66};
67
68class AsarPatch : public CommandHandler {
69 public:
70 absl::Status handle(const std::vector<std::string>& arg_vec) override;
71};
72
74 public:
75 absl::Status handle(const std::vector<std::string>& arg_vec) override;
76};
77
81class Open : public CommandHandler {
82 public:
83 absl::Status handle(const std::vector<std::string>& arg_vec) override {
87 auto const& arg = arg_vec[0];
89 std::cout << "Title: " << green << rom_.title() << std::endl;
90 std::cout << reset << "Size: " << blue << "0x" << std::hex << rom_.size()
91 << reset << std::endl;
92 return absl::OkStatus();
93 }
94};
95
99class Backup : public CommandHandler {
100 public:
101 absl::Status handle(const std::vector<std::string>& arg_vec) override {
103 if (arg_vec.size() == 2) {
104 // Optional filename added
105 RETURN_IF_ERROR(rom_.SaveToFile(/*backup=*/true, false, arg_vec[1]))
106 } else {
107 RETURN_IF_ERROR(rom_.SaveToFile(/*backup=*/true))
108 }
109 return absl::OkStatus();
110 }
111};
112
113// Compress Graphics
114class Compress : public CommandHandler {
115 public:
116 absl::Status handle(const std::vector<std::string>& arg_vec) override;
117};
118
119// Decompress (Export) Graphics
120//
121// -e <rom_file> <bin_file> --mode=<optional:mode>
122//
123// mode:
125 public:
126 absl::Status handle(const std::vector<std::string>& arg_vec) override;
127};
128
135class SnesToPc : public CommandHandler {
136 public:
137 absl::Status handle(const std::vector<std::string>& arg_vec) override {
138 auto arg = arg_vec[0];
139 std::stringstream ss(arg.data());
140 uint32_t snes_address;
141 ss >> std::hex >> snes_address;
142 uint32_t pc_address = app::core::SnesToPc(snes_address);
143 std::cout << std::hex << pc_address << std::endl;
144 return absl::OkStatus();
145 }
146};
147
154class PcToSnes : public CommandHandler {
155 public:
156 absl::Status handle(const std::vector<std::string>& arg_vec) override {
157 auto arg = arg_vec[0];
158 std::stringstream ss(arg.data());
159 uint32_t pc_address;
160 ss >> std::hex >> pc_address;
161 uint32_t snes_address = app::core::PcToSnes(pc_address);
163 std::cout << "SNES LoROM Address: ";
164 std::cout << blue << "$" << std::uppercase << std::hex << snes_address
165 << "\n";
166 return absl::OkStatus();
167 }
168};
169
177 public:
178 absl::Status handle(const std::vector<std::string>& arg_vec) override {
180
181 std::stringstream ss(arg_vec[1].data());
182 uint32_t offset;
183 ss >> std::hex >> offset;
184 uint32_t length = 0x01;
185 if (!arg_vec[2].empty()) {
186 length = std::stoi(arg_vec[2]);
187 }
188
189 if (length > 1) {
190 auto returned_bytes_status = rom_.ReadByteVector(offset, length);
191 if (!returned_bytes_status.ok()) {
192 return returned_bytes_status.status();
193 }
194 auto returned_bytes = returned_bytes_status.value();
195 for (const auto& each : returned_bytes) {
196 std::cout << each;
197 }
198 std::cout << std::endl;
199 } else {
200 auto byte = rom_.ReadByte(offset);
201 std::cout << std::hex << byte.value() << std::endl;
202 }
203
204 return absl::OkStatus();
205 }
206};
207
215 public:
216 absl::Status handle(const std::vector<std::string>& arg_vec) override;
217};
218
225class Expand : public CommandHandler {
226 public:
227 absl::Status handle(const std::vector<std::string>& arg_vec) override {
229
230 std::stringstream ss(arg_vec[1].data());
231 uint32_t size;
232 ss >> std::hex >> size;
233
234 rom_.Expand(size);
235
236 std::cout << "Successfully expanded ROM to " << std::hex << size
237 << std::endl;
238
239 return absl::OkStatus();
240 }
241};
242
246struct Commands {
247 std::unordered_map<std::string, std::shared_ptr<CommandHandler>> handlers = {
248 {"-a", std::make_shared<ApplyPatch>()},
249 {"-asar", std::make_shared<AsarPatch>()},
250 {"-c", std::make_shared<CreatePatch>()},
251 {"-o", std::make_shared<Open>()},
252 {"-b", std::make_shared<Backup>()},
253 {"-x", std::make_shared<Expand>()},
254 {"-i", std::make_shared<Compress>()}, // Import
255 {"-e", std::make_shared<Decompress>()}, // Export
256 {"-s", std::make_shared<SnesToPc>()},
257 {"-p", std::make_shared<PcToSnes>()},
258 {"-t", std::make_shared<Tile16Transfer>()},
259 {"-r", std::make_shared<ReadFromRom>()} // Read from Rom
260 };
261};
262
263} // namespace cli
264} // namespace yaze
265
266#endif
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:145
absl::Status SaveToFile(bool backup, bool save_new=false, std::string filename="")
Saves the Rom data to a file.
Definition rom.cc:254
auto size() const
Definition rom.h:467
void Expand(int size)
Expand the Rom data to a specified size.
Definition rom.h:226
auto title() const
Definition rom.h:466
absl::Status LoadFromFile(const std::string &filename, bool z3_load=true)
Definition rom.cc:142
absl::StatusOr< uint8_t > ReadByte(int offset)
Definition rom.h:256
absl::StatusOr< std::vector< uint8_t > > ReadByteVector(uint32_t offset, uint32_t length)
Definition rom.h:287
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition patch.cc:6
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition patch.cc:27
Backup a Rom file.
Definition command.h:99
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition command.h:101
friend std::ostream & operator<<(std::ostream &os, const ColorModifier &mod)
Definition command.h:49
ColorModifier(ColorCode pCode)
Definition command.h:48
virtual ~CommandHandler()=default
virtual absl::Status handle(const std::vector< std::string > &arg_vec)=0
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition compress.cc:6
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition patch.cc:46
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition compress.cc:11
Expand a Rom file.
Definition command.h:225
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition command.h:227
Open a Rom file and display information about it.
Definition command.h:81
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition command.h:83
Convert a PC address to a SNES address.
Definition command.h:154
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition command.h:156
Read from a Rom file.
Definition command.h:176
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition command.h:178
Convert a SNES address to a PC address.
Definition command.h:135
absl::Status handle(const std::vector< std::string > &arg_vec) override
Definition command.h:137
Transfer tile 16 data from one Rom to another.
Definition command.h:214
absl::Status handle(const std::vector< std::string > &arg_vec) override
#define RETURN_IF_ERROR(expression)
Definition constants.h:69
uint32_t PcToSnes(uint32_t addr)
Definition common.h:231
uint32_t SnesToPc(uint32_t addr) noexcept
Definition common.h:223
@ BG_GREEN
Definition command.h:40
@ FG_RESET
Definition command.h:37
@ BG_BLUE
Definition command.h:41
@ FG_MAGENTA
Definition command.h:35
@ BG_DEFAULT
Definition command.h:42
@ FG_DEFAULT
Definition command.h:36
@ FG_UNDERLINE
Definition command.h:38
@ FG_YELLOW
Definition command.h:33
@ FG_GREEN
Definition command.h:32
@ FG_BLUE
Definition command.h:34
Definition common.cc:21
Command handler for the CLI.
Definition command.h:246
std::unordered_map< std::string, std::shared_ptr< CommandHandler > > handlers
Definition command.h:247