yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
assembly_editor.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_ASSEMBLY_EDITOR_H
2#define YAZE_APP_EDITOR_ASSEMBLY_EDITOR_H
3
4#include <map>
5#include <optional>
6#include <string>
7#include <vector>
8
9#include "absl/container/flat_hash_map.h"
10#include "absl/container/flat_hash_set.h"
11#include "app/editor/editor.h"
14#include "app/gui/core/style.h"
16#include "core/asar_wrapper.h"
17#include "rom/rom.h"
18#ifdef YAZE_WITH_Z3DK
19#include "core/z3dk_wrapper.h"
20#endif
21
22namespace yaze::test {
23struct AssemblyEditorGuiTestAccess;
24}
25
26namespace yaze {
27namespace editor {
28
29struct FolderItem {
30 std::string name;
31 std::vector<FolderItem> subfolders;
32 std::vector<std::string> files;
33};
34
36 std::string file;
37 int line = 0; // 0-based
38 int column = 0; // 0-based
39};
40
45class AssemblyEditor : public Editor {
46 public:
52 void ChangeActiveFile(const std::string_view& filename);
53 absl::Status JumpToSymbolDefinition(const std::string& symbol);
54 // Jump to a best-effort assembly reference.
55 //
56 // Supported formats:
57 // - "MyLabel" (symbol)
58 // - "path/to/file.asm:123" (file + 1-based line)
59 // - "path/to/file.asm:123:10" (file + 1-based line + 1-based column)
60 // - "path/to/file.asm#L123" (file + 1-based line)
61 //
62 // This keeps story graph navigation resilient even when a planning JSON
63 // still contains file:line references; stable symbols are still preferred.
64 absl::Status JumpToReference(const std::string& reference);
65
66 [[nodiscard]] std::string active_file_path() const;
68
69 void Initialize() override;
70 absl::Status Load() override;
71 void InlineUpdate();
72
73 void UpdateCodeView();
74
75 absl::Status Cut() override;
76 absl::Status Copy() override;
77 absl::Status Paste() override;
78
79 absl::Status Undo() override;
80 absl::Status Redo() override;
81 absl::Status Find() override { return absl::UnimplementedError("Find"); }
82
83 absl::Status Update() override;
84
85 absl::Status Save() override;
86
87 void OpenFolder(const std::string& folder_path);
88
89 // Asar integration methods
90 absl::Status ValidateCurrentFile();
91 absl::Status ApplyPatchToRom();
92 void UpdateErrorMarkers(const core::AsarPatchResult& result);
93 void ClearErrorMarkers();
94
95 void SetRom(Rom* rom) { rom_ = rom; }
96 Rom* rom() const { return rom_; }
97
98 // Accessors for Asar state
99 bool is_asar_initialized() const { return asar_initialized_; }
100 const std::map<std::string, core::AsarSymbol>& symbols() const {
101 return symbols_;
102 }
104
105 // Structured diagnostics from the last assemble/validate. Populated by
106 // both backends; richer (file:line:column) when YAZE_WITH_Z3DK is active.
107 const std::vector<core::AssemblyDiagnostic>& last_diagnostics() const {
108 return last_diagnostics_;
109 }
110
111 private:
112 friend struct ::yaze::test::AssemblyEditorGuiTestAccess;
113
115 const TextEditor* GetActiveEditor() const;
116 bool HasActiveFile() const {
117 return active_file_id_ != -1 &&
118 active_file_id_ < static_cast<int>(open_files_.size());
119 }
120
121 // Panel content drawing (called by WindowContent instances)
122 void DrawCodeEditor();
123 void DrawFileBrowser();
124 void DrawSymbolsContent();
125 void DrawBuildOutput();
127 void DrawToolbarContent();
128
129 // Menu drawing
130 void DrawFileMenu();
131 void DrawEditMenu();
132 void DrawAssembleMenu();
133
134 // Helper drawing
135 void DrawCurrentFolder();
136 void DrawFileTabView();
137 void DrawToolset();
138 void DrawSymbolPanel();
139
141 absl::Status NavigateDisassemblyQuery();
142 absl::Status GenerateZ3Disassembly();
147 absl::Status RunProjectGraphQueryInDrawer(
148 const std::vector<std::string>& args, const std::string& title);
149 std::string ResolveZ3DisasmCommand() const;
150 std::string ResolveZ3DisasmOutputDir() const;
151 std::string ResolveZ3DisasmRomPath() const;
152 std::string BuildProjectGraphBankQuery() const;
153 std::string BuildProjectGraphLookupQuery(uint32_t address) const;
154 int SelectedZ3DisasmBankIndex() const;
155 std::optional<uint32_t> CurrentDisassemblyBank() const;
156
157#ifdef YAZE_WITH_Z3DK
158 core::Z3dkAssembleOptions BuildZ3dkAssembleOptions() const;
159 void ExportZ3dkArtifacts(const core::AsarPatchResult& result,
160 bool sync_mesen_symbols);
161#endif
162
163 bool file_is_loaded_ = false;
166
167 std::vector<std::string> files_;
168 std::vector<TextEditor> open_files_;
169 ImVector<int> active_files_;
170
171 std::string current_file_;
174
176
177 // Asar integration state
179#ifdef YAZE_WITH_Z3DK
180 core::Z3dkWrapper z3dk_;
181#endif
182 bool asar_initialized_ = false;
183 bool show_symbol_panel_ = false;
185 uint32_t address = 0;
186 std::string file;
187 int line = 0;
188 };
190 uint32_t address = 0;
191 int size = 0;
192 std::string kind;
193 std::string name;
194 std::string source;
195 };
196 std::map<std::string, core::AsarSymbol> symbols_;
197 std::vector<std::string> last_errors_;
198 std::vector<std::string> last_warnings_;
199 std::vector<core::AssemblyDiagnostic> last_diagnostics_;
205 std::vector<std::string> z3disasm_files_;
209 std::vector<Z3DisasmSourceJump> z3disasm_source_jumps_;
210 std::vector<Z3DisasmHookJump> z3disasm_hook_jumps_;
211 std::string z3disasm_status_;
213 std::string disasm_query_ = "0x008000";
215 std::string disasm_status_;
216
217 // Symbol jump cache (used by story graph navigation; avoids scanning the
218 // entire code folder on repeated lookups).
219 std::string symbol_jump_root_;
220 absl::flat_hash_map<std::string, AsmSymbolLocation> symbol_jump_cache_;
221 absl::flat_hash_set<std::string> symbol_jump_negative_cache_;
222};
223
224} // namespace editor
225} // namespace yaze
226
227#endif
static const Palette & GetDarkPalette()
void SetShowWhitespaces(bool aValue)
void SetPalette(const Palette &aValue)
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
Modern C++ wrapper for Asar 65816 assembler integration.
Text editor for modifying assembly code.
TextEditor::Coordinates active_cursor_position() const
absl::Status Find() override
BackgroundCommandTask z3disasm_task_
core::AsarWrapper * asar_wrapper()
std::vector< std::string > last_warnings_
std::map< std::string, core::AsarSymbol > symbols_
std::optional< uint32_t > CurrentDisassemblyBank() const
absl::Status Save() override
std::vector< TextEditor > open_files_
absl::Status Load() override
std::string ResolveZ3DisasmOutputDir() const
std::string BuildProjectGraphLookupQuery(uint32_t address) const
std::vector< Z3DisasmHookJump > z3disasm_hook_jumps_
void ChangeActiveFile(const std::string_view &filename)
absl::Status JumpToReference(const std::string &reference)
absl::Status Copy() override
absl::flat_hash_map< std::string, AsmSymbolLocation > symbol_jump_cache_
std::vector< std::string > z3disasm_files_
void UpdateErrorMarkers(const core::AsarPatchResult &result)
std::string ResolveZ3DisasmRomPath() const
std::vector< core::AssemblyDiagnostic > last_diagnostics_
void OpenFolder(const std::string &folder_path)
absl::flat_hash_set< std::string > symbol_jump_negative_cache_
std::string active_file_path() const
std::string BuildProjectGraphBankQuery() const
absl::Status Paste() override
absl::Status Update() override
std::string ResolveZ3DisasmCommand() const
std::vector< std::string > files_
const std::map< std::string, core::AsarSymbol > & symbols() const
AssemblyEditor(Rom *rom=nullptr)
absl::Status Redo() override
absl::Status Undo() override
absl::Status RunProjectGraphQueryInDrawer(const std::vector< std::string > &args, const std::string &title)
absl::Status Cut() override
std::vector< std::string > last_errors_
std::vector< Z3DisasmSourceJump > z3disasm_source_jumps_
absl::Status JumpToSymbolDefinition(const std::string &symbol)
const std::vector< core::AssemblyDiagnostic > & last_diagnostics() const
Interface for editor classes.
Definition editor.h:240
EditorType type_
Definition editor.h:315
Asar patch result information.
std::vector< FolderItem > subfolders
std::vector< std::string > files