summaryrefslogtreecommitdiff
path: root/vdp.cpp
diff options
context:
space:
mode:
authorOxore <oxore@protonmail.com>2023-06-09 00:41:05 +0300
committerOxore <oxore@protonmail.com>2023-06-09 00:41:05 +0300
commita8beae02428f4c7762c3621b4a6d23a498b7d394 (patch)
treee8f0bcc67aa62aeb1d74a462119923e615ea3031 /vdp.cpp
parent0c6c5803588a06160fbb55dd4228e94453df89ff (diff)
Impl VDP register bits tracing
Diffstat (limited to 'vdp.cpp')
-rw-r--r--vdp.cpp119
1 files changed, 113 insertions, 6 deletions
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<VDP::RegID>(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<RegID>(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: