diff options
Diffstat (limited to 'vdp.cpp')
-rw-r--r-- | vdp.cpp | 58 |
1 files changed, 45 insertions, 13 deletions
@@ -131,7 +131,8 @@ 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] = { +static const char* reg_mode_set_1_bits_desc[16] = { + "", "", "", "", "", "", "", "", "Unused(7)", "Unused(6)", "Unused(5)", @@ -142,7 +143,8 @@ static const char* reg_mode_set_1_bits[8] = { "Unused(0)", }; -static const char* reg_mode_set_2_bits[8] = { +static const char* reg_mode_set_2_bits_desc[16] = { + "", "", "", "", "", "", "", "", "Unused(7)", "Display(6)", "VInt(5)", @@ -153,7 +155,8 @@ static const char* reg_mode_set_2_bits[8] = { "Unused(0)", }; -static const char* reg_mode_set_3_bits[8] = { +static const char* reg_mode_set_3_bits_desc[16] = { + "", "", "", "", "", "", "", "", "Unused(7)", "Unused(6)", "Unused(5)", @@ -164,7 +167,8 @@ static const char* reg_mode_set_3_bits[8] = { "HScrollLo(0)", }; -static const char* reg_mode_set_4_bits[8] = { +static const char* reg_mode_set_4_bits_desc[16] = { + "", "", "", "", "", "", "", "", "H40CellHi(7)", "Unused(6)", "Unused(5)", @@ -175,12 +179,26 @@ static const char* reg_mode_set_4_bits[8] = { "H40CellLo(0)", }; -static void TraceRegBits(FILE* s, const char* bits_desc[8], const uint8_t val) +static const char* reg_status_bits_desc[16] = { + "", "", "", "", "", "", + "FIFOEmpty(9)", + "FIFOFull(8)", + "VInt(7)", + "SpriteOverflow(6)", + "SpriteCollision(5)", + "OddFrame(4)", + "InVBlank(3)", + "InHBlank(2)", + "DMABusy(1)", + "PAL(0)", +}; + +static void TraceRegBits(FILE* s, const char* bits_desc[16], const uint16_t val) { - fprintf(s, "("); + fprintf(s, " ("); bool separator{}; - for (size_t i = 0; i < 8; i++) { - if (val & (1 << (7 - i))) { + for (size_t i = 0; i < 16; i++) { + if (val & (1 << (15 - i))) { if (separator) { fprintf(s, " | "); separator = false; @@ -198,26 +216,31 @@ static void TraceRegWrite(FILE* const s, const uint8_t reg, const uint8_t val) 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); + return TraceRegBits(s, reg_mode_set_1_bits_desc, val); case VDP::RegID::kModeSet2: - return TraceRegBits(s, reg_mode_set_2_bits, val); + return TraceRegBits(s, reg_mode_set_2_bits_desc, val); case VDP::RegID::kScrollAAddress: + fprintf(s, " (0x%04x)", uint16_t(val & 0x38) << 10); break; case VDP::RegID::kWindowAddress: + fprintf(s, " (0x%04x)", uint16_t(val & 0x3e) << 10); break; case VDP::RegID::kScrollBAddress: + fprintf(s, " (0x%04x)", uint16_t(val & 0x7) << 13); break; case VDP::RegID::kSpritesTableAddress: + fprintf(s, " (0x%04x)", uint16_t(val & 0x7f) << 9); break; case VDP::RegID::kBackgroundColor: break; case VDP::RegID::kHint: break; case VDP::RegID::kModeSet3: - return TraceRegBits(s, reg_mode_set_3_bits, val); + return TraceRegBits(s, reg_mode_set_3_bits_desc, val); case VDP::RegID::kModeSet4: - return TraceRegBits(s, reg_mode_set_4_bits, val); + return TraceRegBits(s, reg_mode_set_4_bits_desc, val); case VDP::RegID::kHScrollTableAddress: + fprintf(s, " (0x%04x)", uint16_t(val & 0x3f) << 10); break; case VDP::RegID::kAutoIncrement: break; @@ -232,10 +255,18 @@ static void TraceRegWrite(FILE* const s, const uint8_t reg, const uint8_t val) case VDP::RegID::kDMALengthCounterHigh: break; case VDP::RegID::kDMASourceAddressLow: + fprintf(s, " (0xXXXX%02x)", val); break; case VDP::RegID::kDMASourceAddressMid: + fprintf(s, " (0xXX%02xXX)", val); break; case VDP::RegID::kDMASourceAddressHigh: + { + const char* op = (val & 0x80) + ? ((val & 0x40) ? "VRAM Copy" : "VRAM Fill") + : "MemToVRAM"; + fprintf(s, " (%s 0x%02xXXXX)", op, val & ((val & 0x80) ? 0x3f : 0x7f)); + } break; case VDP::RegID::kRegistersCount: break; @@ -837,7 +868,8 @@ uint16_t VDP::readStatusRegister() const | (_status.pal_mode << 0) ; if (DEBUG_TRACE_VDP_ACCESS) { - printf(": Status %04x", value); + fprintf(stdout, ": Status %04x", value); + TraceRegBits(stdout, reg_status_bits_desc, value); } return value; } |