From 7cc6ac973bb269333735ba8d9e5190cd04d7f72c Mon Sep 17 00:00:00 2001 From: Vincent-Halver Date: Sat, 25 Jan 2025 09:31:51 -0800 Subject: [PATCH] philips/mcd212.cpp: Implemented RBG decoding and RGB transparency bit. (#13246) --- src/mame/philips/mcd212.cpp | 56 ++++++++++++++++++++++++------------- src/mame/philips/mcd212.h | 30 ++++++++++---------- 2 files changed, 51 insertions(+), 35 deletions(-) diff --git a/src/mame/philips/mcd212.cpp b/src/mame/philips/mcd212.cpp index 686a0aaf1ee85..e5e69f862649b 100644 --- a/src/mame/philips/mcd212.cpp +++ b/src/mame/philips/mcd212.cpp @@ -638,13 +638,15 @@ template void mcd212_device::process_vsr(uint32_t *pixels, bool *transparent) { const uint8_t *data = reinterpret_cast(Path ? m_planeb.target() : m_planea.target()); + const uint8_t *data2 = reinterpret_cast(!Path ? m_planeb.target() : m_planea.target()); const uint8_t icm = get_icm(); - const uint8_t transp_ctrl = get_transparency_control(); + const uint8_t tp_ctrl = get_transparency_control(); const int width = get_screen_width(); uint32_t vsr = get_vsr(); + uint32_t vsr2 = get_vsr(); - if (transp_ctrl == TCR_COND_1 || !icm || !vsr) + if (tp_ctrl == TCR_ALWAYS || !icm || !vsr) { std::fill_n(pixels, get_screen_width(), s_4bpp_color[0]); std::fill_n(transparent, get_screen_width(), true); @@ -662,14 +664,17 @@ void mcd212_device::process_vsr(uint32_t *pixels, bool *transparent) uint8_t v = (dyuv_abs_start >> 0) & 0x000000ff; const uint32_t mask_bits = (~m_mask_color[Path]) & 0x00fcfcfc; - const uint32_t transp_match = m_transparent_color[Path] & mask_bits; - const uint8_t transp_ctrl_masked = transp_ctrl & 0x07; - const bool transp_always = (transp_ctrl_masked == TCR_COND_1); - const bool invert_transp_condition = BIT(transp_ctrl, 3); - const int region_flag_index = 1 - (transp_ctrl_masked & 1); - const bool *region_flags = m_region_flag[region_flag_index]; - const bool use_region_flag = (transp_ctrl_masked >= TCR_COND_RF0_1 && transp_ctrl_masked <= TCR_COND_RF1KEY_1); - bool use_color_key = (transp_ctrl_masked == TCR_COND_KEY_1 || transp_ctrl_masked == TCR_COND_RF0KEY_1 || transp_ctrl_masked == TCR_COND_RF1KEY_1); + const uint32_t tp_color_match = m_transparent_color[Path] & mask_bits; + const uint8_t tp_ctrl_type = tp_ctrl & 0x07; + + const bool use_rgb_tp_bit = (tp_ctrl_type == TCR_RGB); + const bool tp_check_parity = !BIT(tp_ctrl, 3); + const bool tp_always = ((tp_ctrl_type == TCR_ALWAYS) && tp_check_parity); + const int region_flag_index = BIT(~tp_ctrl_type, 0); + const bool *const region_flags = m_region_flag[region_flag_index]; + const bool use_region_flag = (tp_ctrl_type >= TCR_RF0 && tp_ctrl_type <= TCR_RF1_KEY1); + const bool is_dyuv_rgb = (icm == ICM_DYUV) || ((icm == ICM_RGB555) && (Path == 1)); // DYUV and RGB do not have access to color key. + const bool use_color_key = !is_dyuv_rgb && ((tp_ctrl_type == TCR_KEY) || (tp_ctrl_type == TCR_RF0_KEY1) || (tp_ctrl_type == TCR_RF1_KEY1)); LOGMASKED(LOG_VSR, "Scanline %d: VSR Path %d, ICM (%02x), VSR (%08x)\n", screen().vpos(), Path, icm, vsr); @@ -678,6 +683,7 @@ void mcd212_device::process_vsr(uint32_t *pixels, bool *transparent) const uint8_t byte = data[(vsr++ & 0x0007ffff) ^ 1]; uint32_t color0 = 0; uint32_t color1 = 0; + bool rgb_tp_bit = false; if (icm == ICM_DYUV) { const uint8_t byte1 = data[(vsr++ & 0x0007ffff) ^ 1]; @@ -702,15 +708,24 @@ void mcd212_device::process_vsr(uint32_t *pixels, bool *transparent) pixels[x + 1] = color0; pixels[x + 2] = color1; pixels[x + 3] = color1; - transparent[x] = (transp_always || (use_region_flag && region_flags[x])) != invert_transp_condition; - transparent[x + 1] = (transp_always || (use_region_flag && region_flags[x + 1])) != invert_transp_condition; - transparent[x + 2] = (transp_always || (use_region_flag && region_flags[x + 2])) != invert_transp_condition; - transparent[x + 3] = (transp_always || (use_region_flag && region_flags[x + 3])) != invert_transp_condition; + transparent[x ] = tp_always || (use_region_flag && (region_flags[x ] == tp_check_parity)); + transparent[x + 1] = tp_always || (use_region_flag && (region_flags[x + 1] == tp_check_parity)); + transparent[x + 2] = tp_always || (use_region_flag && (region_flags[x + 2] == tp_check_parity)); + transparent[x + 3] = tp_always || (use_region_flag && (region_flags[x + 3] == tp_check_parity)); x += 4; } else { - if (icm == ICM_CLUT4) + if (icm == ICM_RGB555 && Path == 1) + { + const uint8_t byte1 = data2[(vsr2++ & 0x0007ffff) ^ 1]; + const uint8_t blue = (byte & 0b11111) << 3; + const uint8_t green = ((byte & 0b11100000) >> 2) + ((byte1 & 0b11) << 6); + const uint8_t red = (byte1 & 0b01111100) << 1; + rgb_tp_bit = (use_rgb_tp_bit && ((byte1 & 0x80) == tp_check_parity)); + color1 = color0 = (uint32_t(red) << 16) | (uint32_t(green) << 8) | blue; + } + else if (icm == ICM_CLUT4) { const uint8_t mask = (decodingMode == DDR_FT_RLE) ? 0x7 : 0xf; color0 = m_clut[BYTE_TO_CLUT(icm, mask & (byte >> 4))]; @@ -728,20 +743,21 @@ void mcd212_device::process_vsr(uint32_t *pixels, bool *transparent) length_m = length ? (length * 2) : width; } - const bool color_match0 = (mask_bits & color0) == transp_match; - const bool color_match1 = (mask_bits & color1) == transp_match; + const bool color_match0 = ((mask_bits & color0) == tp_color_match) == tp_check_parity; + const bool color_match1 = ((mask_bits & color1) == tp_color_match) == tp_check_parity; const int end = std::min(width, x + length_m); for (int rl_index = x; rl_index < end; rl_index += 2) { - pixels[rl_index] = color0; - transparent[rl_index] = (transp_always || (use_color_key && color_match0) || (use_region_flag && region_flags[rl_index])) != invert_transp_condition; + pixels[rl_index ] = color0; pixels[rl_index + 1] = color1; - transparent[rl_index + 1] = (transp_always || (use_color_key && color_match1) || (use_region_flag && region_flags[rl_index + 1])) != invert_transp_condition; + transparent[rl_index ] = tp_always || rgb_tp_bit || (use_color_key && color_match0) || (use_region_flag && (region_flags[rl_index ] == tp_check_parity)); + transparent[rl_index + 1] = tp_always || rgb_tp_bit || (use_color_key && color_match1) || (use_region_flag && (region_flags[rl_index + 1] == tp_check_parity)); } x = end; } } set_vsr(vsr); + set_vsr(vsr2); } const uint32_t mcd212_device::s_4bpp_color[16] = diff --git a/src/mame/philips/mcd212.h b/src/mame/philips/mcd212.h index 7856cdc7f75b8..5106dc7f37249 100644 --- a/src/mame/philips/mcd212.h +++ b/src/mame/philips/mcd212.h @@ -107,21 +107,21 @@ class mcd212_device : public device_t, TCR_TA = 0x00000f, // Plane A TCR_TB = 0x000f00, // Plane B TCR_TB_SHIFT = 8, - TCR_COND_1 = 0x0, // Transparent if: Always (Plane Disabled) - TCR_COND_KEY_1 = 0x1, // Transparent if: Color Key = True - TCR_COND_XLU_1 = 0x2, // Transparent if: Transparency Bit = 1 - TCR_COND_RF0_1 = 0x3, // Transparent if: Region Flag 0 = True - TCR_COND_RF1_1 = 0x4, // Transparent if: Region Flag 1 = True - TCR_COND_RF0KEY_1 = 0x5, // Transparent if: Region Flag 0 = True || Color Key = True - TCR_COND_RF1KEY_1 = 0x6, // Transparent if: Region Flag 1 = True || Color Key = True + TCR_ALWAYS = 0x0, // Transparent if: Always (Plane Disabled) + TCR_KEY = 0x1, // Transparent if: Color Key = True + TCR_RGB = 0x2, // Transparent if: Transparency Bit = 1 (RGB Only) + TCR_RF0 = 0x3, // Transparent if: Region Flag 0 = True + TCR_RF1 = 0x4, // Transparent if: Region Flag 1 = True + TCR_RF0_KEY1 = 0x5, // Transparent if: Region Flag 0 = True || Color Key = True + TCR_RF1_KEY1 = 0x6, // Transparent if: Region Flag 1 = True || Color Key = True TCR_COND_UNUSED0 = 0x7, // Unused - TCR_COND_0 = 0x8, // Transparent if: Never (No Transparent Area) - TCR_COND_KEY_0 = 0x9, // Transparent if: Color Key = False - TCR_COND_XLU_0 = 0xa, // Transparent if: Transparency Bit = 0 - TCR_COND_RF0_0 = 0xb, // Transparent if: Region Flag 0 = False - TCR_COND_RF1_0 = 0xc, // Transparent if: Region Flag 1 = False - TCR_COND_RF0KEY_0 = 0xd, // Transparent if: Region Flag 0 = False && Color Key = False - TCR_COND_RF1KEY_0 = 0xe, // Transparent if: Region Flag 1 = False && Color Key = False + TCR_NEVER = 0x8, // Transparent if: Never (No Transparent Area) + TCR_NOT_KEY = 0x9, // Transparent if: Color Key = False + TCR_NOT_RGB = 0xa, // Transparent if: Transparency Bit = 0 (RGB Only) + TCR_NOT_RF0 = 0xb, // Transparent if: Region Flag 0 = False + TCR_NOT_RF1 = 0xc, // Transparent if: Region Flag 1 = False + TCR_NOT_RF0_KEY = 0xd, // Transparent if: Region Flag 0 = False || Color Key = False + TCR_NOT_RF1_KEY = 0xe, // Transparent if: Region Flag 1 = False || Color Key = False TCR_COND_UNUSED1 = 0xf, // Unused TCR_DISABLE_MX = 0x800000, // Mix disable @@ -171,7 +171,7 @@ class mcd212_device : public device_t, ICM_OFF = 0x0, ICM_CLUT8 = 0x1, - ICM_RGB555 = 0x2, + ICM_RGB555 = 0x1, ICM_CLUT7 = 0x3, ICM_CLUT77 = 0x4, ICM_DYUV = 0x5,