backend-infra-engineer: Release v0.3.3 snapshot

This commit is contained in:
scawful
2025-11-21 21:35:50 -05:00
parent 3d71417f62
commit 476dd1cd1c
818 changed files with 65706 additions and 35514 deletions

View File

@@ -17,7 +17,7 @@
#include "app/emu/snes.h"
#include "util/log.h"
ABSL_FLAG(std::string, rom, "", "Path to ROM file to test");
ABSL_FLAG(std::string, emu_test_rom, "", "Path to ROM file to test");
ABSL_FLAG(int, max_frames, 60, "Maximum frames to run (0 = infinite)");
ABSL_FLAG(int, log_interval, 10, "Log APU state every N frames");
ABSL_FLAG(bool, dump_audio, false, "Dump audio output to WAV file");
@@ -79,7 +79,7 @@ class HeadlessEmulator {
bool infinite = (max_frames == 0);
printf("Starting emulation (max_frames=%d, log_interval=%d)\n", max_frames,
log_interval);
log_interval);
while (infinite || frame < max_frames) {
// Run one frame
@@ -106,9 +106,10 @@ class HeadlessEmulator {
if (current_pc == last_pc_ && frame > 60) {
stuck_counter_++;
if (stuck_counter_ > 5) {
fprintf(stderr, "ERROR: APU stuck at PC=$%04X for %d frames\n", current_pc,
stuck_counter_ * 60);
fprintf(stderr, "ERROR: This likely indicates a hang or infinite loop\n");
fprintf(stderr, "ERROR: APU stuck at PC=$%04X for %d frames\n",
current_pc, stuck_counter_ * 60);
fprintf(stderr,
"ERROR: This likely indicates a hang or infinite loop\n");
return absl::InternalError("APU stuck in infinite loop");
}
} else {
@@ -135,17 +136,17 @@ class HeadlessEmulator {
printf(" SPC700 Y: $%02X\n", spc.Y);
printf(" SPC700 SP: $%02X\n", spc.SP);
printf(" SPC700 PSW: N=%d V=%d P=%d B=%d H=%d I=%d Z=%d C=%d\n", spc.PSW.N,
spc.PSW.V, spc.PSW.P, spc.PSW.B, spc.PSW.H, spc.PSW.I, spc.PSW.Z,
spc.PSW.C);
spc.PSW.V, spc.PSW.P, spc.PSW.B, spc.PSW.H, spc.PSW.I, spc.PSW.Z,
spc.PSW.C);
printf(" APU Cycles: %llu\n", apu.GetCycles());
// Port status
printf(" Input Ports: F4=$%02X F5=$%02X F6=$%02X F7=$%02X\n",
apu.in_ports_[0], apu.in_ports_[1], apu.in_ports_[2],
apu.in_ports_[3]);
apu.in_ports_[0], apu.in_ports_[1], apu.in_ports_[2],
apu.in_ports_[3]);
printf(" Output Ports: F4=$%02X F5=$%02X F6=$%02X F7=$%02X\n",
apu.out_ports_[0], apu.out_ports_[1], apu.out_ports_[2],
apu.out_ports_[3]);
apu.out_ports_[0], apu.out_ports_[1], apu.out_ports_[2],
apu.out_ports_[3]);
// Handshake phase
const char* handshake_phase = "UNKNOWN";
@@ -177,7 +178,7 @@ class HeadlessEmulator {
// Zero page (used by IPL ROM)
auto& ram = apu.ram;
printf(" Zero Page: $00=$%02X $01=$%02X $02=$%02X $03=$%02X\n", ram[0x00],
ram[0x01], ram[0x02], ram[0x03]);
ram[0x01], ram[0x02], ram[0x03]);
// Check reset vector
uint16_t reset_vector =
@@ -207,17 +208,17 @@ int main(int argc, char** argv) {
absl::ParseCommandLine(argc, argv);
// Configure logging
std::string rom_path = absl::GetFlag(FLAGS_rom);
std::string rom_path = absl::GetFlag(FLAGS_emu_test_rom);
int max_frames = absl::GetFlag(FLAGS_max_frames);
int log_interval = absl::GetFlag(FLAGS_log_interval);
bool verbose = absl::GetFlag(FLAGS_verbose);
bool trace_apu = absl::GetFlag(FLAGS_trace_apu);
if (rom_path.empty()) {
std::cerr << "Error: --rom flag is required\n";
std::cerr << "Usage: yaze_emu_test --rom=zelda3.sfc [options]\n";
std::cerr << "Error: --emu_test_rom flag is required\n";
std::cerr << "Usage: yaze_emu_test --emu_test_rom=zelda3.sfc [options]\n";
std::cerr << "\nOptions:\n";
std::cerr << " --rom=PATH Path to ROM file (required)\n";
std::cerr << " --emu_test_rom=PATH Path to ROM file (required)\n";
std::cerr << " --max_frames=N Run for N frames (0=infinite, "
"default=60)\n";
std::cerr << " --log_interval=N Log APU state every N frames "