5#include "absl/strings/str_format.h"
29 LOG_DEBUG(
"APU_DEBUG",
"Handshake tracker reset");
43 LogPortWrite(
true, port, value, pc,
"HANDSHAKE ACKNOWLEDGE");
44 LOG_INFO(
"APU_DEBUG",
"✓ CPU sent handshake $CC at PC=$%06X", pc);
55 }
else if (port == 1) {
57 bool is_final = (value & 0x01) != 0;
59 is_final ?
"FINAL BLOCK" :
"More blocks");
60 }
else if (port == 2 || port == 3) {
80 LogPortWrite(
false, port, value, pc,
"READY SIGNAL $BBAA");
81 LOG_INFO(
"APU_DEBUG",
"✓ SPC ready signal: F4=$AA F5=$BB at PC=$%04X",
90 LogPortWrite(
false, port, value, pc,
"READY SIGNAL $BBAA");
91 LOG_INFO(
"APU_DEBUG",
"✓ SPC ready signal: F4=$AA F5=$BB at PC=$%04X",
99 int echoed_counter = value;
103 absl::StrFormat(
"Echo counter=%d (byte %d)", echoed_counter,
107 absl::StrFormat(
"Counter mismatch! Expected=%d Got=%d",
109 LOG_WARN(
"APU_DEBUG",
"Counter mismatch at PC=$%04X: expected %d, got %d",
121 LOG_INFO(
"APU_DEBUG",
"✓ SPC entered IPL ROM at PC=$%04X", new_pc);
130 "✓ Transfer complete! SPC jumped to $%04X (audio driver entry)",
138 if (
phase_ != new_phase) {
147 return "WAITING_BBAA";
149 return "HANDSHAKE_CC";
151 return "TRANSFER_ACTIVE";
153 return "TRANSFER_DONE";
165 uint32_t pc,
const std::string& desc) {
168 entry.
pc =
static_cast<uint16_t
>(pc & 0xFFFF);
189 return "WAITING_BBAA";
191 return "HANDSHAKE_CC";
193 return "TRANSFER_ACTIVE";
195 return "TRANSFER_DONE";
204 return absl::StrFormat(
"Phase: %s | Handshake: %s | Bytes: %d | Blocks: %d",
215 int estimated_total = 8192;
217 percent = std::min(percent, 100);
220 int filled = (percent * bar_width) / 100;
222 std::string bar =
"[";
223 for (
int i = 0; i < bar_width; ++i) {
224 bar += (i < filled) ?
"█" :
"░";
226 bar += absl::StrFormat(
"] %d%%", percent);
std::string GetStatusSummary() const
std::string GetPhaseString() const
void OnCpuPortWrite(uint8_t port, uint8_t value, uint32_t pc)
int total_bytes_transferred_
void UpdatePhase(Phase new_phase)
void OnSpcPCChange(uint16_t old_pc, uint16_t new_pc)
void LogPortWrite(bool is_cpu, uint8_t port, uint8_t value, uint32_t pc, const std::string &desc)
std::vector< TransferBlock > blocks_
std::string GetTransferProgress() const
static constexpr size_t kMaxHistorySize
void OnSpcPortWrite(uint8_t port, uint8_t value, uint16_t pc)
std::deque< PortWrite > port_history_
#define LOG_DEBUG(category, format,...)
#define LOG_WARN(category, format,...)
#define LOG_INFO(category, format,...)