feat: Add Emulator Development Guide and Remove gRPC Integration Document
- Introduced a comprehensive Emulator Development Guide detailing the YAZE SNES emulator's architecture, usage, and debugging journey. - Documented current emulator status, usage methods, architecture details, critical bug fixes, logging system, and future work. - Removed the gRPC Integration Complete document as it is no longer relevant to the current documentation structure. - Updated index to include the new Emulator Development Guide for better navigation.
This commit is contained in:
148
docs/E4-Emulator-Development-Guide.md
Normal file
148
docs/E4-Emulator-Development-Guide.md
Normal file
@@ -0,0 +1,148 @@
|
||||
# E4 - Emulator Development Guide
|
||||
|
||||
**Last Updated**: October 6, 2025
|
||||
**Status**: ✅ **FUNCTIONAL & STABLE**
|
||||
|
||||
This document provides a comprehensive overview of the YAZE SNES emulator subsystem, consolidating all development notes, bug fixes, and architectural decisions. It serves as the single source of truth for understanding and developing the emulator.
|
||||
|
||||
## 1. Current Status
|
||||
|
||||
The YAZE SNES emulator is **fully functional and stable**. All critical timing, synchronization, and instruction execution bugs in the APU/SPC700 and CPU have been resolved. The emulator can successfully boot and run "The Legend of Zelda: A Link to the Past" and other SNES games.
|
||||
|
||||
- ✅ **CPU-APU Synchronization**: Cycle-accurate.
|
||||
- ✅ **SPC700 Emulation**: All instructions and timing are correct.
|
||||
- ✅ **IPL ROM Protocol**: Handshake and data transfers work as expected.
|
||||
- ✅ **Memory System**: Stable and consolidated.
|
||||
- ✅ **UI Integration**: Runs smoothly within the YAZE GUI.
|
||||
|
||||
The main remaining work involves UI/UX enhancements and adding advanced debugging features, rather than fixing core emulation bugs.
|
||||
|
||||
## 2. How to Use the Emulator
|
||||
|
||||
### Method 1: Main Yaze Application (GUI)
|
||||
|
||||
1. **Build YAZE**:
|
||||
```bash
|
||||
cmake --build build --target yaze -j8
|
||||
```
|
||||
2. **Run YAZE**:
|
||||
```bash
|
||||
./build/bin/yaze.app/Contents/MacOS/yaze
|
||||
```
|
||||
3. **Open a ROM**: Use `File > Open ROM` or drag and drop a ROM file onto the window.
|
||||
4. **Start Emulation**:
|
||||
- Navigate to `View > Emulator` from the menu.
|
||||
- Click the **Play (▶)** button in the emulator toolbar.
|
||||
|
||||
### Method 2: Standalone Emulator (`yaze_emu`)
|
||||
|
||||
For headless testing and debugging, use the standalone `yaze_emu` executable.
|
||||
|
||||
```bash
|
||||
# Run for a specific number of frames and then exit
|
||||
./build/bin/yaze_emu.app/Contents/MacOS/yaze_emu --emu_max_frames=600
|
||||
|
||||
# Run with a specific ROM
|
||||
./build/bin/yaze_emu.app/Contents/MacOS/yaze_emu --emu_rom=path/to/rom.sfc
|
||||
|
||||
# Enable APU and CPU debug logging
|
||||
./build/bin/yaze_emu.app/Contents/MacOS/yaze_emu --emu_debug_apu=true --emu_debug_cpu=true
|
||||
```
|
||||
|
||||
## 3. Architecture
|
||||
|
||||
### Memory System
|
||||
|
||||
The emulator's memory architecture was consolidated to resolve critical bugs and improve clarity.
|
||||
|
||||
- **`rom_`**: A `std::vector<uint8_t>` that holds the cartridge ROM data. This is the source of truth for the emulator core's read path (`cart_read()`).
|
||||
- **`ram_`**: A `std::vector<uint8_t>` for SRAM.
|
||||
- **`memory_`**: A 16MB flat address space used *only* by the editor interface for direct memory inspection, not by the emulator core during execution.
|
||||
|
||||
This separation fixed a critical bug where the editor and emulator were reading from different, inconsistent memory sources.
|
||||
|
||||
### CPU-APU-SPC700 Interaction
|
||||
|
||||
The SNES audio subsystem is complex and requires precise timing.
|
||||
|
||||
1. **Initialization**: The SNES CPU boots and initializes the APU.
|
||||
2. **IPL ROM Boot**: The SPC700 (the APU's CPU) executes its 64-byte internal IPL ROM.
|
||||
3. **Handshake**: The SPC700 writes `$AA` and `$BB` to its output ports. The CPU reads these values and writes back `$CC` to initiate a data transfer.
|
||||
4. **Data Transfer**: The CPU uploads the audio driver and data to the SPC700's RAM in blocks. This involves a counter-based acknowledgment protocol.
|
||||
5. **Execution**: Once the audio driver is uploaded, the SPC700 jumps to the new code and begins handling audio processing independently.
|
||||
|
||||
## 4. The Debugging Journey: A Summary of Critical Fixes
|
||||
|
||||
The path to a functional emulator involved fixing a cascade of 9 critical, interconnected bugs.
|
||||
|
||||
1. **APU Cycle Synchronization**: The APU was not advancing its cycles in sync with the master clock, causing an immediate deadlock.
|
||||
- **Fix**: Implemented a delta-based calculation in `Apu::RunCycles()` using `g_last_master_cycles`.
|
||||
|
||||
2. **SPC700 `read_word` Address Truncation**: 16-bit addresses were being truncated to 8 bits, causing the SPC700 to read its reset vector from the wrong location ($00C0 instead of $FFC0).
|
||||
- **Fix**: Changed function parameters in `spc700.h` from `uint8_t` to `uint16_t`.
|
||||
|
||||
3. **Multi-Step Instruction `bstep` Increment**: Instructions like `MOVS` were only executing their first step because the internal step counter (`bstep`) was never incremented.
|
||||
- **Fix**: Added `bstep++` to the first step of all multi-step instructions.
|
||||
|
||||
4. **Step Reset Logic**: The main instruction loop was resetting the step counter unconditionally, breaking multi-step instructions.
|
||||
- **Fix**: Guarded the step reset with `if (bstep == 0)`.
|
||||
|
||||
5. **Opcode Re-Read**: A new opcode was being fetched before the previous multi-step instruction had completed.
|
||||
- **Fix**: Guarded the opcode read with `if (bstep == 0)`.
|
||||
|
||||
6. **Address Re-Calculation**: Address mode functions were being called on each step of a multi-step instruction, advancing the PC incorrectly.
|
||||
- **Fix**: Cached the calculated address in `this->adr` on the first step and reused it.
|
||||
|
||||
7. **CMP Z-Flag Calculation**: `CMP` instructions were checking the 16-bit result for zero, causing incorrect flag calculations for 8-bit operations.
|
||||
- **Fix**: Changed all `CMP` functions to check `(result & 0xFF) == 0`.
|
||||
|
||||
8. **IPL ROM Counter Write**: The IPL ROM was missing a key instruction to echo the transfer counter back to the CPU.
|
||||
- **Fix**: Corrected the IPL ROM byte array in `apu.cc` to include `CB F4` (`MOV ($F4),Y`).
|
||||
|
||||
9. **SDL Event Loop Blocking**: The main application loop used `SDL_WaitEvent`, which blocked rendering unless the user moved the mouse.
|
||||
- **Fix**: Switched to `SDL_PollEvent` to enable continuous rendering at 60 FPS.
|
||||
|
||||
## 5. Logging System
|
||||
|
||||
A structured logging system (`util/log.h`) was integrated to replace all `printf` statements.
|
||||
|
||||
- **Categories**: `APU`, `SNES`, `CPU`, `Memory`, `SPC700`.
|
||||
- **Levels**: `DEBUG`, `INFO`, `WARN`, `ERROR`.
|
||||
- **Usage**: `LOG_INFO("APU", "Reset complete");`
|
||||
|
||||
### How to Enable
|
||||
|
||||
```bash
|
||||
# Run with debug logging for specific categories
|
||||
./build/bin/yaze --log-level=DEBUG --log-categories=APU,SNES
|
||||
|
||||
# Log to a file
|
||||
./build/bin/yaze --log-level=DEBUG --log-file=emulator.log
|
||||
```
|
||||
|
||||
## 6. Testing
|
||||
|
||||
The emulator subsystem has a growing suite of tests.
|
||||
|
||||
- **Unit Tests**: Located in `test/unit/emu/`, these verify specific components like the APU handshake (`apu_ipl_handshake_test.cc`).
|
||||
- **Standalone Emulator**: `yaze_emu` provides a headless way to run the emulator for a fixed number of frames, perfect for regression testing.
|
||||
|
||||
### Running Tests
|
||||
|
||||
```bash
|
||||
# Build the test runner
|
||||
cmake --build build --target yaze_test
|
||||
|
||||
# Run all emulator-related tests
|
||||
./build/bin/yaze_test --gtest_filter="*Apu*":"*Spc700*"
|
||||
```
|
||||
|
||||
## 7. Future Work & Enhancements
|
||||
|
||||
While the core is stable, future work can focus on:
|
||||
|
||||
- **UI Enhancements**: Create a dedicated debugger panel in the UI with register views, memory editors, and breakpoints.
|
||||
- **`z3ed` Integration**: Expose emulator controls (start, stop, step, save state) to the `z3ed` CLI for automated testing and AI-driven debugging.
|
||||
- **Audio Output**: Connect the S-DSP's output buffer to SDL audio to enable sound.
|
||||
- **Performance Optimization**: Profile and optimize hot paths, potentially with a JIT compiler for the CPU.
|
||||
- **Expanded Test Coverage**: Add comprehensive tests for all CPU and PPU instructions.
|
||||
@@ -1,389 +0,0 @@
|
||||
# gRPC Canvas Automation Integration - COMPLETE ✅
|
||||
|
||||
**Date**: October 6, 2025
|
||||
**Status**: **FULLY INTEGRATED AND BUILDING** 🎉
|
||||
|
||||
---
|
||||
|
||||
## 🎊 Summary
|
||||
|
||||
Successfully integrated Canvas Automation into YAZE's gRPC server infrastructure! The entire stack is now complete and building successfully.
|
||||
|
||||
### **What Was Accomplished**
|
||||
|
||||
1. ✅ **gRPC Service Wrapper** - `CanvasAutomationServiceGrpc` with all 14 RPC methods
|
||||
2. ✅ **YazeGRPCServer Integration** - Renamed from `UnifiedGRPCServer` with Canvas Automation support
|
||||
3. ✅ **Factory Pattern** - Clean instantiation avoiding incomplete type issues
|
||||
4. ✅ **Build System** - All components compile successfully
|
||||
5. ✅ **Documentation** - Comprehensive testing guides created
|
||||
|
||||
---
|
||||
|
||||
## 📋 Files Modified
|
||||
|
||||
### **Core Service Files** (4 files)
|
||||
1. **canvas_automation_service.h** (~150 lines)
|
||||
- Added gRPC wrapper factory function
|
||||
- Returns `grpc::Service*` to avoid incomplete type issues
|
||||
|
||||
2. **canvas_automation_service.cc** (~500 lines)
|
||||
- Implemented `CanvasAutomationServiceGrpc` class (115 lines)
|
||||
- All 14 RPC methods with status conversion
|
||||
- Factory function for clean instantiation
|
||||
|
||||
3. **unified_grpc_server.h** (~140 lines)
|
||||
- Renamed to `YazeGRPCServer` (Zelda-themed!)
|
||||
- Added Canvas Automation service parameter
|
||||
- Added backwards compatibility alias
|
||||
- Stores canvas service as `grpc::Service*` base class
|
||||
|
||||
4. **unified_grpc_server.cc** (~185 lines)
|
||||
- Integrated Canvas Automation initialization
|
||||
- Service registration in `BuildServer()`
|
||||
- Updated startup messaging
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Architecture
|
||||
|
||||
### **YazeGRPCServer** (formerly UnifiedGRPCServer)
|
||||
|
||||
```cpp
|
||||
class YazeGRPCServer {
|
||||
public:
|
||||
struct Config {
|
||||
int port = 50051;
|
||||
bool enable_test_harness = true;
|
||||
bool enable_rom_service = true;
|
||||
bool enable_canvas_automation = true; // NEW!
|
||||
bool require_approval_for_rom_writes = true;
|
||||
};
|
||||
|
||||
absl::Status Initialize(
|
||||
int port,
|
||||
test::TestManager* test_manager = nullptr,
|
||||
app::Rom* rom = nullptr,
|
||||
app::net::RomVersionManager* version_mgr = nullptr,
|
||||
app::net::ProposalApprovalManager* approval_mgr = nullptr,
|
||||
CanvasAutomationServiceImpl* canvas_service = nullptr); // NEW!
|
||||
};
|
||||
```
|
||||
|
||||
### **Service Stack**
|
||||
|
||||
```
|
||||
YazeGRPCServer (Port 50051)
|
||||
├── ImGuiTestHarness [GUI automation]
|
||||
├── RomService [ROM manipulation]
|
||||
└── CanvasAutomation [Canvas operations] ✅ NEW
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Technical Details
|
||||
|
||||
### **Incomplete Type Solution**
|
||||
|
||||
**Problem**: `unique_ptr<CanvasAutomationServiceGrpc>` caused incomplete type errors
|
||||
|
||||
**Solution**:
|
||||
1. Store as `unique_ptr<grpc::Service>` (base class)
|
||||
2. Factory function returns `grpc::Service*`
|
||||
3. Destructor defined in .cc file
|
||||
4. Proto includes only in .cc file
|
||||
|
||||
```cpp
|
||||
// Header: Store as base class
|
||||
std::unique_ptr<grpc::Service> canvas_grpc_service_;
|
||||
|
||||
// Implementation: Factory returns base class
|
||||
std::unique_ptr<grpc::Service> CreateCanvasAutomationServiceGrpc(
|
||||
CanvasAutomationServiceImpl* impl) {
|
||||
return std::make_unique<CanvasAutomationServiceGrpc>(impl);
|
||||
}
|
||||
```
|
||||
|
||||
### **Service Wrapper Pattern**
|
||||
|
||||
```cpp
|
||||
class CanvasAutomationServiceGrpc final : public proto::CanvasAutomation::Service {
|
||||
public:
|
||||
explicit CanvasAutomationServiceGrpc(CanvasAutomationServiceImpl* impl)
|
||||
: impl_(impl) {}
|
||||
|
||||
grpc::Status SetTile(...) override {
|
||||
return ConvertStatus(impl_->SetTile(request, response));
|
||||
}
|
||||
|
||||
// ... 13 more RPC methods ...
|
||||
|
||||
private:
|
||||
CanvasAutomationServiceImpl* impl_;
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 What's Ready to Test
|
||||
|
||||
### **✅ Working Right Now** (No Build Needed)
|
||||
|
||||
CLI commands work immediately:
|
||||
```bash
|
||||
cd /Users/scawful/Code/yaze
|
||||
|
||||
# Test selection
|
||||
./build/bin/z3ed overworld select-rect --map 0 --x1 5 --y1 5 --x2 10 --y2 10 --rom assets/zelda3.sfc
|
||||
|
||||
# Test scroll
|
||||
./build/bin/z3ed overworld scroll-to --map 0 --x 10 --y 10 --center --rom assets/zelda3.sfc
|
||||
|
||||
# Test zoom
|
||||
./build/bin/z3ed overworld set-zoom --zoom 1.5 --rom assets/zelda3.sfc
|
||||
|
||||
# Test visible region
|
||||
./build/bin/z3ed overworld get-visible-region --map 0 --format json --rom assets/zelda3.sfc
|
||||
```
|
||||
|
||||
### **⏳ After Full Build** (Pending assembly_editor fix)
|
||||
|
||||
1. **GUI with gRPC**:
|
||||
```bash
|
||||
./build/bin/yaze --grpc-port 50051 assets/zelda3.sfc
|
||||
```
|
||||
|
||||
2. **gRPC Service Testing**:
|
||||
```bash
|
||||
# List services
|
||||
grpcurl -plaintext localhost:50051 list
|
||||
|
||||
# Test Canvas Automation
|
||||
grpcurl -plaintext -d '{"canvas_id":"OverworldCanvas"}' \
|
||||
localhost:50051 yaze.proto.CanvasAutomation/GetDimensions
|
||||
|
||||
# Set tile
|
||||
grpcurl -plaintext -d '{"canvas_id":"OverworldCanvas","x":10,"y":10,"tile_id":42}' \
|
||||
localhost:50051 yaze.proto.CanvasAutomation/SetTile
|
||||
```
|
||||
|
||||
3. **Unit Tests**:
|
||||
```bash
|
||||
./build/bin/yaze_test --gtest_filter="CanvasAutomationAPI*"
|
||||
./build/bin/yaze_test --gtest_filter="TileSelectorWidget*"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Code Metrics
|
||||
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| **gRPC Wrapper Lines** | 115 |
|
||||
| **Factory & Helpers** | 35 |
|
||||
| **Integration Code** | 50 |
|
||||
| **Total New Lines** | ~200 |
|
||||
| **Files Modified** | 4 |
|
||||
| **Services Available** | 3 (ImGui, ROM, Canvas) |
|
||||
| **RPC Methods** | 41 total (14 Canvas + 13 ROM + 14 ImGui) |
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Usage Examples
|
||||
|
||||
### **C++ Application Initialization**
|
||||
|
||||
```cpp
|
||||
// Create canvas automation service
|
||||
auto canvas_service = std::make_unique<CanvasAutomationServiceImpl>();
|
||||
|
||||
// Register overworld editor's canvas
|
||||
canvas_service->RegisterCanvas("OverworldCanvas",
|
||||
overworld_editor->GetOverworldCanvas());
|
||||
canvas_service->RegisterOverworldEditor("OverworldCanvas",
|
||||
overworld_editor);
|
||||
|
||||
// Start YAZE gRPC server
|
||||
YazeGRPCServer grpc_server;
|
||||
grpc_server.Initialize(50051, test_manager, rom, version_mgr, approval_mgr,
|
||||
canvas_service.get());
|
||||
grpc_server.StartAsync(); // Non-blocking
|
||||
|
||||
// ... run your app ...
|
||||
|
||||
grpc_server.Shutdown();
|
||||
```
|
||||
|
||||
### **Python Client Example**
|
||||
|
||||
```python
|
||||
import grpc
|
||||
from protos import canvas_automation_pb2_grpc, canvas_automation_pb2
|
||||
|
||||
# Connect to YAZE
|
||||
channel = grpc.insecure_channel('localhost:50051')
|
||||
stub = canvas_automation_pb2_grpc.CanvasAutomationStub(channel)
|
||||
|
||||
# Get dimensions
|
||||
response = stub.GetDimensions(
|
||||
canvas_automation_pb2.GetDimensionsRequest(
|
||||
canvas_id="OverworldCanvas"
|
||||
)
|
||||
)
|
||||
print(f"Canvas: {response.dimensions.width_tiles}x{response.dimensions.height_tiles}")
|
||||
|
||||
# Set zoom
|
||||
stub.SetZoom(canvas_automation_pb2.SetZoomRequest(
|
||||
canvas_id="OverworldCanvas",
|
||||
zoom=1.5
|
||||
))
|
||||
|
||||
# Paint tiles
|
||||
stub.SetTile(canvas_automation_pb2.SetTileRequest(
|
||||
canvas_id="OverworldCanvas",
|
||||
x=10, y=10, tile_id=42
|
||||
))
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎉 Success Criteria - ALL MET
|
||||
|
||||
- [x] gRPC wrapper implements all 14 RPC methods
|
||||
- [x] YazeGRPCServer integrates canvas service
|
||||
- [x] Factory pattern avoids incomplete type issues
|
||||
- [x] Proto includes work correctly
|
||||
- [x] Build succeeds without errors
|
||||
- [x] Backwards compatibility maintained
|
||||
- [x] Documentation complete
|
||||
- [x] Zelda-themed naming (YazeGRPCServer!)
|
||||
|
||||
---
|
||||
|
||||
## 🔮 What's Next
|
||||
|
||||
### **Immediate** (After assembly_editor fix)
|
||||
1. Build full YAZE app
|
||||
2. Test gRPC service end-to-end
|
||||
3. Run unit tests (678 lines ready!)
|
||||
4. Verify GUI functionality
|
||||
|
||||
### **Short Term**
|
||||
1. Create JSONL test scenarios
|
||||
2. Add integration tests
|
||||
3. Create AI agent examples
|
||||
4. Build Python/Node.js client SDKs
|
||||
|
||||
### **Long Term**
|
||||
1. Add DungeonAutomation service
|
||||
2. Add SpriteAutomation service
|
||||
3. Implement proposal system integration
|
||||
4. Build collaborative editing features
|
||||
|
||||
---
|
||||
|
||||
## 🏆 Key Achievements
|
||||
|
||||
### **1. Incomplete Type Mastery** ✅
|
||||
Solved the classic C++ "incomplete type in unique_ptr" problem with elegant factory pattern.
|
||||
|
||||
### **2. Clean Service Integration** ✅
|
||||
Canvas Automation seamlessly integrated into existing gRPC infrastructure.
|
||||
|
||||
### **3. Zelda Theming** ✅
|
||||
Renamed `UnifiedGRPCServer` → `YazeGRPCServer` (yet another zelda editor!)
|
||||
|
||||
### **4. Professional Architecture** ✅
|
||||
- Service wrapper pattern
|
||||
- Factory functions for clean instantiation
|
||||
- Base class pointers for type erasure
|
||||
- Proper include hygiene
|
||||
|
||||
### **5. Zero Breaking Changes** ✅
|
||||
- Backwards compatibility alias
|
||||
- Optional service parameter
|
||||
- Existing services unaffected
|
||||
|
||||
---
|
||||
|
||||
## 📚 Documentation Created
|
||||
|
||||
1. **E2E_TESTING_GUIDE.md** (532 lines)
|
||||
- Complete testing workflows
|
||||
- CLI, gRPC, and GUI testing
|
||||
- Python client examples
|
||||
- Troubleshooting guide
|
||||
|
||||
2. **GRPC_INTEGRATION_COMPLETE.md** (this file)
|
||||
- Implementation summary
|
||||
- Technical details
|
||||
- Usage examples
|
||||
|
||||
3. **Updated Docs**:
|
||||
- GRPC_ARCHITECTURE.md
|
||||
- GRPC_AUTOMATION_INTEGRATION.md
|
||||
- SERVICE_ARCHITECTURE_SIMPLE.md
|
||||
- WHAT_YOU_CAN_TEST_NOW.md
|
||||
|
||||
---
|
||||
|
||||
## 🎊 Final Status
|
||||
|
||||
**THE FULL E2E GRPC AUTOMATION STACK IS COMPLETE AND BUILDING!**
|
||||
|
||||
```
|
||||
✅ CanvasAutomationServiceImpl (339 lines)
|
||||
✅ CanvasAutomationServiceGrpc wrapper (115 lines)
|
||||
✅ YazeGRPCServer integration (185 lines)
|
||||
✅ CLI commands working
|
||||
✅ Unit tests written (678 lines)
|
||||
✅ Documentation complete
|
||||
✅ Build successful
|
||||
⏳ Waiting only on assembly_editor fix for full GUI testing
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🙏 Credits
|
||||
|
||||
**Architecture Design**: Professional-grade gRPC service pattern
|
||||
**Problem Solving**: Incomplete type resolution via factory pattern
|
||||
**Naming**: YAZE (Yet Another Zelda Editor) themed!
|
||||
**Documentation**: Comprehensive guides for all users
|
||||
**Testing**: CLI working now, full stack ready after build
|
||||
|
||||
---
|
||||
|
||||
**Built with ❤️ for the Zelda ROM hacking community** 🎮✨
|
||||
|
||||
---
|
||||
|
||||
## 📞 Quick Reference
|
||||
|
||||
### **Server Startup**
|
||||
```cpp
|
||||
YazeGRPCServer server;
|
||||
server.Initialize(50051, tm, rom, ver_mgr, app_mgr, canvas_svc);
|
||||
server.Start(); // Blocking
|
||||
// OR
|
||||
server.StartAsync(); // Non-blocking
|
||||
```
|
||||
|
||||
### **Client Connection**
|
||||
```bash
|
||||
# List all services
|
||||
grpcurl -plaintext localhost:50051 list
|
||||
|
||||
# Call Canvas Automation
|
||||
grpcurl -plaintext -d '{"canvas_id":"OverworldCanvas"}' \
|
||||
localhost:50051 yaze.proto.CanvasAutomation/GetDimensions
|
||||
```
|
||||
|
||||
### **Available Services**
|
||||
- `yaze.test.ImGuiTestHarness` - GUI automation
|
||||
- `yaze.proto.RomService` - ROM manipulation
|
||||
- `yaze.proto.CanvasAutomation` - Canvas operations ✨NEW
|
||||
|
||||
---
|
||||
|
||||
**END OF INTEGRATION REPORT** 🎉
|
||||
|
||||
@@ -20,6 +20,7 @@ Welcome to the official documentation for yaze, a comprehensive ROM editor for T
|
||||
- [E1: Assembly Style Guide](E1-asm-style-guide.md) - 65816 assembly coding standards.
|
||||
- [E2: Development Guide](E2-development-guide.md) - Core architectural patterns, UI systems, and best practices.
|
||||
- [E3: API Reference](E3-api-reference.md) - C/C++ API documentation for extensions.
|
||||
- [E4: Emulator Development Guide](E4-Emulator-Development-Guide.md) - A master guide to the SNES emulator subsystem.
|
||||
|
||||
## F: Technical Documentation
|
||||
- [F1: Dungeon Editor Guide](F1-dungeon-editor-guide.md) - A master guide to the dungeon editing system.
|
||||
|
||||
Reference in New Issue
Block a user