yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
asar_wrapper.h
Go to the documentation of this file.
1#ifndef YAZE_CORE_ASAR_WRAPPER_H
2#define YAZE_CORE_ASAR_WRAPPER_H
3
4#include <map>
5#include <memory>
6#include <optional>
7#include <string>
8#include <vector>
9
10#include "absl/status/status.h"
11#include "absl/status/statusor.h"
13
14namespace yaze {
15namespace core {
16
20struct AsarSymbol {
21 std::string name; // Symbol name
22 uint32_t address; // Memory address
23 std::string opcode; // Associated opcode if available
24 std::string file; // Source file
25 int line; // Line number in source
26 std::string comment; // Optional comment
27};
28
33 bool success; // Whether patch was successful
34 std::vector<std::string> errors; // Error messages if any
35 std::vector<std::string> warnings; // Warning messages
36 std::vector<AsarSymbol> symbols; // Extracted symbols
37 uint32_t rom_size; // Final ROM size after patching
38 uint32_t crc32; // CRC32 checksum of patched ROM
39
40 // Structured diagnostics (file:line:column + severity). Populated natively
41 // by z3dk backend; best-effort parsed from errors/warnings by Asar backend.
42 // Consumers that render rich UI (diagnostics panel, jump-to-error) should
43 // prefer this; legacy consumers can keep reading `errors`/`warnings`.
44 std::vector<AssemblyDiagnostic> structured_diagnostics;
45
46 // Optional z3dk-generated artifact payloads. Empty for Asar-backed builds.
47 std::string symbols_mlb;
48 std::string sourcemap_json;
49 std::string annotations_json;
50 std::string hooks_json;
51 std::string lint_json;
52};
53
63 public:
66
67 AsarWrapper(const AsarWrapper&) = delete;
69
72
73 absl::Status Initialize();
74 void Shutdown();
75 bool IsInitialized() const { return initialized_; }
76
77 std::string GetVersion() const;
78 int GetApiVersion() const;
79
80 absl::StatusOr<AsarPatchResult> ApplyPatch(
81 const std::string& patch_path, std::vector<uint8_t>& rom_data,
82 const std::vector<std::string>& include_paths = {});
83
84 absl::StatusOr<AsarPatchResult> ApplyPatchFromString(
85 const std::string& patch_content, std::vector<uint8_t>& rom_data,
86 const std::string& base_path = "");
87
88 absl::StatusOr<std::vector<AsarSymbol>> ExtractSymbols(
89 const std::string& asm_path,
90 const std::vector<std::string>& include_paths = {});
91
92 absl::Status LoadSymbolsFromFile(const std::string& symbol_path);
93
94 std::map<std::string, AsarSymbol> GetSymbolTable() const;
95 std::optional<AsarSymbol> FindSymbol(const std::string& name) const;
96 std::vector<AsarSymbol> GetSymbolsAtAddress(uint32_t address) const;
97
98 void Reset();
99
100 std::vector<std::string> GetLastErrors() const { return last_errors_; }
101 std::vector<std::string> GetLastWarnings() const { return last_warnings_; }
102
103 absl::Status CreatePatch(const std::vector<uint8_t>& original_rom,
104 const std::vector<uint8_t>& modified_rom,
105 const std::string& patch_path);
106
107 absl::Status ValidateAssembly(const std::string& asm_path);
108
109 private:
110 absl::StatusOr<AsarPatchResult> ApplyPatchWithBinary(
111 const std::string& patch_path, std::vector<uint8_t>& rom_data,
112 const std::vector<std::string>& include_paths);
113
114 absl::StatusOr<AsarPatchResult> ApplyPatchWithLibrary(
115 const std::string& patch_path, std::vector<uint8_t>& rom_data,
116 const std::vector<std::string>& include_paths);
117
118 std::optional<std::string> ResolveAsarBinary() const;
119
122 std::map<std::string, AsarSymbol> symbol_table_;
123 std::vector<std::string> last_errors_;
124 std::vector<std::string> last_warnings_;
125
126 void ProcessErrors();
127 void ProcessWarnings();
129 AsarSymbol ConvertAsarSymbol(const void* asar_symbol_data) const;
130};
131
132} // namespace core
133} // namespace yaze
134
135#endif // YAZE_CORE_ASAR_WRAPPER_H
Modern C++ wrapper for Asar 65816 assembler integration.
absl::StatusOr< AsarPatchResult > ApplyPatchWithBinary(const std::string &patch_path, std::vector< uint8_t > &rom_data, const std::vector< std::string > &include_paths)
absl::StatusOr< AsarPatchResult > ApplyPatchFromString(const std::string &patch_content, std::vector< uint8_t > &rom_data, const std::string &base_path="")
AsarSymbol ConvertAsarSymbol(const void *asar_symbol_data) const
std::vector< std::string > GetLastWarnings() const
std::vector< std::string > GetLastErrors() const
bool IsInitialized() const
absl::StatusOr< AsarPatchResult > ApplyPatch(const std::string &patch_path, std::vector< uint8_t > &rom_data, const std::vector< std::string > &include_paths={})
absl::Status CreatePatch(const std::vector< uint8_t > &original_rom, const std::vector< uint8_t > &modified_rom, const std::string &patch_path)
std::vector< std::string > last_warnings_
absl::Status ValidateAssembly(const std::string &asm_path)
std::optional< AsarSymbol > FindSymbol(const std::string &name) const
std::string GetVersion() const
std::optional< std::string > ResolveAsarBinary() const
std::map< std::string, AsarSymbol > symbol_table_
absl::Status Initialize()
std::vector< std::string > last_errors_
absl::StatusOr< AsarPatchResult > ApplyPatchWithLibrary(const std::string &patch_path, std::vector< uint8_t > &rom_data, const std::vector< std::string > &include_paths)
AsarWrapper(AsarWrapper &&)=default
absl::Status LoadSymbolsFromFile(const std::string &symbol_path)
absl::StatusOr< std::vector< AsarSymbol > > ExtractSymbols(const std::string &asm_path, const std::vector< std::string > &include_paths={})
AsarWrapper & operator=(const AsarWrapper &)=delete
std::vector< AsarSymbol > GetSymbolsAtAddress(uint32_t address) const
AsarWrapper(const AsarWrapper &)=delete
std::map< std::string, AsarSymbol > GetSymbolTable() const
AsarWrapper & operator=(AsarWrapper &&)=default
Asar patch result information.
std::vector< AssemblyDiagnostic > structured_diagnostics
std::vector< std::string > errors
std::vector< AsarSymbol > symbols
std::vector< std::string > warnings
Symbol information extracted from Asar assembly.