From a8beae02428f4c7762c3621b4a6d23a498b7d394 Mon Sep 17 00:00:00 2001 From: Oxore Date: Fri, 9 Jun 2023 00:41:05 +0300 Subject: Impl VDP register bits tracing --- vdp.cpp | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 113 insertions(+), 6 deletions(-) (limited to 'vdp.cpp') diff --git a/vdp.cpp b/vdp.cpp index 02cc21c..df3a7cc 100644 --- a/vdp.cpp +++ b/vdp.cpp @@ -131,6 +131,117 @@ static constexpr uint16_t kScrollSpeedMask = BitsCountToMask(10); // Each pixel has 4 bit depth color static constexpr uint16_t kPixelColorMask = BitsCountToMask(kBitsPerPixel); +static const char* reg_mode_set_1_bits[8] = { + "Unused(7)", + "Unused(6)", + "Unused(5)", + "HInt(4)", + "Unused(3)", + "AllBitsFromColor(2)", + "HVCounter(1)", + "Unused(0)", +}; + +static const char* reg_mode_set_2_bits[8] = { + "Unused(7)", + "Display(6)", + "VInt(5)", + "DMA(4)", + "V30Cell(3)", + "Unused(2)", + "Unused(1)", + "Unused(0)", +}; + +static const char* reg_mode_set_3_bits[8] = { + "Unused(7)", + "Unused(6)", + "Unused(5)", + "Unused(4)", + "ExtInt(3)", + "2CellVScroll(2)", + "HScrollHi(1)", + "HScrollLo(0)", +}; + +static const char* reg_mode_set_4_bits[8] = { + "H40CellHi(7)", + "Unused(6)", + "Unused(5)", + "Unused(4)", + "Shadow(3)", + "InterlaceHi(2)", + "InterlaceLo(1)", + "H40CellLo(0)", +}; + +static void TraceRegBits(FILE* s, const char* bits_desc[8], const uint8_t val) +{ + fprintf(s, "("); + bool separator{}; + for (size_t i = 0; i < 8; i++) { + if (val & (1 << (7 - i))) { + if (separator) { + fprintf(s, " | "); + separator = false; + } + fprintf(s, bits_desc[i]); + separator = true; + } + } + fprintf(s, ")"); +} + +static void TraceRegWrite(FILE* const s, const uint8_t reg, const uint8_t val) +{ + const auto reg_id = static_cast(reg); + fprintf(s, ": reg 0x%02x(%s) = 0x%02x", reg, VDP::RegIDToString(reg_id), val); + switch (reg_id) { + case VDP::RegID::kModeSet1: + return TraceRegBits(s, reg_mode_set_1_bits, val); + case VDP::RegID::kModeSet2: + return TraceRegBits(s, reg_mode_set_2_bits, val); + case VDP::RegID::kScrollAAddress: + break; + case VDP::RegID::kWindowAddress: + break; + case VDP::RegID::kScrollBAddress: + break; + case VDP::RegID::kSpritesTableAddress: + break; + case VDP::RegID::kBackgroundColor: + break; + case VDP::RegID::kHint: + break; + case VDP::RegID::kModeSet3: + return TraceRegBits(s, reg_mode_set_3_bits, val); + case VDP::RegID::kModeSet4: + return TraceRegBits(s, reg_mode_set_4_bits, val); + case VDP::RegID::kHScrollTableAddress: + break; + case VDP::RegID::kAutoIncrement: + break; + case VDP::RegID::kScrollSize: + break; + case VDP::RegID::kWindowHorizontalPosition: + break; + case VDP::RegID::kWindowVertialPosition: + break; + case VDP::RegID::kDMALengthCounterLow: + break; + case VDP::RegID::kDMALengthCounterHigh: + break; + case VDP::RegID::kDMASourceAddressLow: + break; + case VDP::RegID::kDMASourceAddressMid: + break; + case VDP::RegID::kDMASourceAddressHigh: + break; + case VDP::RegID::kRegistersCount: + break; + } +} + uint32_t VDP::Read(const uint32_t offset, const enum bitness bitness) { uint32_t ret{}; @@ -634,11 +745,7 @@ void VDP::writeControl(const uint16_t value) const uint8_t reg_num = (value >> 8) & 0x1f; const uint8_t reg_val = value & 0xff; if (DEBUG_TRACE_VDP_ACCESS) { - printf( - ": reg 0x%02x(%s) = 0x%02x", - reg_num, - regIDToString(static_cast(reg_num)), - reg_val); + TraceRegWrite(stdout, reg_num, reg_val); } _reg[reg_num] = reg_val; // TODO print warnings of all invalid values or writes that ignore a mask @@ -838,7 +945,7 @@ const char* VDP::addressModeToString(const uint8_t address_mode) return "Unknown"; } -const char* VDP::regIDToString(const RegID reg_id) +const char* VDP::RegIDToString(const RegID reg_id) { switch (reg_id) { case RegID::kModeSet1: -- cgit v1.2.3