137 ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f),
138 "Emulator renderer not initialized");
156 LOG_ERROR(
"Emulator",
"Failed to initialize audio backend");
158 LOG_INFO(
"Emulator",
"Audio backend initialized (lazy): %s",
166 LOG_ERROR(
"Emulator",
"Failed to initialize input manager");
168 LOG_INFO(
"Emulator",
"Input manager initialized: %s",
180 512, 480, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING);
182 printf(
"Failed to create PPU texture: %s\n", SDL_GetError());
218 static bool was_running_before_resize =
false;
222 was_running_before_resize =
true;
227 was_running_before_resize =
false;
238 uint64_t current_count = SDL_GetPerformanceCounter();
250 int frames_to_process = 0;
257 if (frames_to_process > 4) {
258 frames_to_process = 4;
263 for (
int i = 0; i < frames_to_process; i++) {
264 bool should_render = (i == frames_to_process - 1);
289 uint32_t queued_frames = audio_status.queued_frames;
309 if (queued_frames < max_buffer) {
311 static int error_count = 0;
312 if (++error_count % 300 == 0) {
313 LOG_WARN(
"Emulator",
"Failed to queue audio (count: %d)", error_count);
319 static int overflow_count = 0;
320 if (++overflow_count % 60 == 0) {
321 LOG_WARN(
"Emulator",
"Audio buffer overflow (count: %d, queued: %u)",
322 overflow_count, queued_frames);
524 const auto& theme = theme_manager.GetCurrentTheme();
540 static char bp_addr[16] =
"00FFD9";
542 ImGui::PushItemWidth(100);
543 ImGui::InputText(
"##BPAddr", bp_addr, IM_ARRAYSIZE(bp_addr),
544 ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase);
545 ImGui::PopItemWidth();
548 uint32_t addr = std::strtoul(bp_addr,
nullptr, 16);
551 "", absl::StrFormat(
"BP at $%06X", addr));
555 ImGui::BeginChild(
"##BPList", ImVec2(0, 100),
true);
558 bool enabled = bp.enabled;
559 if (ImGui::Checkbox(absl::StrFormat(
"##en%d", bp.id).c_str(), &enabled)) {
563 ImGui::Text(
"$%06X", bp.address);
565 ImGui::TextDisabled(
"(hits: %d)", bp.hit_count);
567 if (ImGui::SmallButton(absl::StrFormat(
ICON_MD_DELETE "##%d", bp.id).c_str())) {
576 ImGui::TextColored(ConvertColorToImVec4(theme.accent),
"CPU Status");
577 ImGui::PushStyleColor(ImGuiCol_ChildBg,
578 ConvertColorToImVec4(theme.child_bg));
579 ImGui::BeginChild(
"##CpuStatus", ImVec2(0, 180),
true);
582 if (ImGui::BeginTable(
584 ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit)) {
585 ImGui::TableSetupColumn(
"Register", ImGuiTableColumnFlags_WidthFixed, 60);
586 ImGui::TableSetupColumn(
"Value", ImGuiTableColumnFlags_WidthFixed, 80);
587 ImGui::TableSetupColumn(
"Register", ImGuiTableColumnFlags_WidthFixed, 60);
588 ImGui::TableSetupColumn(
"Value", ImGuiTableColumnFlags_WidthFixed, 80);
589 ImGui::TableHeadersRow();
591 ImGui::TableNextRow();
592 ImGui::TableNextColumn();
594 ImGui::TableNextColumn();
595 ImGui::TextColored(ConvertColorToImVec4(theme.accent),
"0x%04X",
597 ImGui::TableNextColumn();
599 ImGui::TableNextColumn();
600 ImGui::TextColored(ConvertColorToImVec4(theme.accent),
"0x%04X",
603 ImGui::TableNextRow();
604 ImGui::TableNextColumn();
606 ImGui::TableNextColumn();
607 ImGui::TextColored(ConvertColorToImVec4(theme.accent),
"0x%04X",
609 ImGui::TableNextColumn();
611 ImGui::TableNextColumn();
612 ImGui::TextColored(ConvertColorToImVec4(theme.accent),
"0x%02X",
615 ImGui::TableNextRow();
616 ImGui::TableNextColumn();
618 ImGui::TableNextColumn();
619 ImGui::TextColored(ConvertColorToImVec4(theme.accent),
"0x%04X",
621 ImGui::TableNextColumn();
623 ImGui::TableNextColumn();
624 ImGui::TextColored(ConvertColorToImVec4(theme.accent),
"0x%02X",
627 ImGui::TableNextRow();
628 ImGui::TableNextColumn();
630 ImGui::TableNextColumn();
631 ImGui::TextColored(ConvertColorToImVec4(theme.success),
"0x%04X",
633 ImGui::TableNextColumn();
635 ImGui::TableNextColumn();
636 ImGui::TextColored(ConvertColorToImVec4(theme.accent),
"0x%02X",
639 ImGui::TableNextRow();
640 ImGui::TableNextColumn();
642 ImGui::TableNextColumn();
643 ImGui::TextColored(ConvertColorToImVec4(theme.warning),
"0x%02X",
645 ImGui::TableNextColumn();
646 ImGui::Text(
"Cycle");
647 ImGui::TableNextColumn();
648 ImGui::TextColored(ConvertColorToImVec4(theme.info),
"%llu",
655 ImGui::PopStyleColor();
658 ImGui::TextColored(ConvertColorToImVec4(theme.accent),
"SPC700 Status");
659 ImGui::PushStyleColor(ImGuiCol_ChildBg,
660 ConvertColorToImVec4(theme.child_bg));
661 ImGui::BeginChild(
"##SpcStatus", ImVec2(0, 150),
true);
663 if (ImGui::BeginTable(
665 ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit)) {
666 ImGui::TableSetupColumn(
"Register", ImGuiTableColumnFlags_WidthFixed, 50);
667 ImGui::TableSetupColumn(
"Value", ImGuiTableColumnFlags_WidthFixed, 60);
668 ImGui::TableSetupColumn(
"Register", ImGuiTableColumnFlags_WidthFixed, 50);
669 ImGui::TableSetupColumn(
"Value", ImGuiTableColumnFlags_WidthFixed, 60);
670 ImGui::TableHeadersRow();
672 ImGui::TableNextRow();
673 ImGui::TableNextColumn();
675 ImGui::TableNextColumn();
676 ImGui::TextColored(ConvertColorToImVec4(theme.accent),
"0x%02X",
678 ImGui::TableNextColumn();
680 ImGui::TableNextColumn();
681 ImGui::TextColored(ConvertColorToImVec4(theme.success),
"0x%04X",
684 ImGui::TableNextRow();
685 ImGui::TableNextColumn();
687 ImGui::TableNextColumn();
688 ImGui::TextColored(ConvertColorToImVec4(theme.accent),
"0x%02X",
690 ImGui::TableNextColumn();
692 ImGui::TableNextColumn();
693 ImGui::TextColored(ConvertColorToImVec4(theme.accent),
"0x%02X",
696 ImGui::TableNextRow();
697 ImGui::TableNextColumn();
699 ImGui::TableNextColumn();
700 ImGui::TextColored(ConvertColorToImVec4(theme.accent),
"0x%02X",
702 ImGui::TableNextColumn();
704 ImGui::TableNextColumn();
706 ConvertColorToImVec4(theme.warning),
"0x%02X",
713 ImGui::PopStyleColor();
716 if (ImGui::CollapsingHeader(
"Disassembly Viewer",
717 ImGuiTreeNodeFlags_DefaultOpen)) {
718 uint32_t current_pc = (
static_cast<uint32_t
>(
snes_.
cpu().PB) << 16) |
snes_.
cpu().PC;
719 auto& disasm =
snes_.
cpu().disassembly_viewer();
720 if (disasm.IsAvailable()) {
721 disasm.Render(current_pc,
snes_.
cpu().breakpoints_);
723 ImGui::TextColored(ConvertColorToImVec4(theme.error),
"Disassembly viewer unavailable.");
726 }
catch (
const std::exception& e) {
729 ImGui::PopStyleColor();
733 ImGui::Text(
"CPU Debugger Error: %s", e.what());