diff --git a/drivers/dvhstx/dvhstx.cpp b/drivers/dvhstx/dvhstx.cpp index 7b62a97..df4ff0a 100644 --- a/drivers/dvhstx/dvhstx.cpp +++ b/drivers/dvhstx/dvhstx.cpp @@ -160,18 +160,35 @@ void __scratch_x("display") DVHSTX::gfx_dma_handler() { if (line_bytes_per_pixel == 2) { uint16_t* src_ptr = (uint16_t*)&frame_buffer_display[y * 2 * (timing_mode->h_active_pixels >> h_repeat_shift)]; - for (int i = 0; i < timing_mode->h_active_pixels >> 1; i += 2) { - uint32_t val = (uint32_t)(*src_ptr++) * 0x10001; - *dst_ptr++ = val; - *dst_ptr++ = val; + if (h_repeat_shift == 2) { + for (int i = 0; i < timing_mode->h_active_pixels >> 1; i += 2) { + uint32_t val = (uint32_t)(*src_ptr++) * 0x10001; + *dst_ptr++ = val; + *dst_ptr++ = val; + } + } + else { + for (int i = 0; i < timing_mode->h_active_pixels >> 1; ++i) { + uint32_t val = (uint32_t)(*src_ptr++) * 0x10001; + *dst_ptr++ = val; + } } } else if (line_bytes_per_pixel == 1) { uint8_t* src_ptr = &frame_buffer_display[y * (timing_mode->h_active_pixels >> h_repeat_shift)]; - for (int i = 0; i < timing_mode->h_active_pixels >> 2; ++i) { - uint32_t val = (uint32_t)(*src_ptr++) * 0x01010101; - *dst_ptr++ = val; - } + if (h_repeat_shift == 2) { + for (int i = 0; i < timing_mode->h_active_pixels >> 2; ++i) { + uint32_t val = (uint32_t)(*src_ptr++) * 0x01010101; + *dst_ptr++ = val; + } + } + else { + for (int i = 0; i < timing_mode->h_active_pixels >> 2; ++i) { + uint32_t val = ((uint32_t)(*src_ptr++) * 0x0101); + val |= ((uint32_t)(*src_ptr++) * 0x01010000); + *dst_ptr++ = val; + } + } } else if (line_bytes_per_pixel == 4) { uint8_t* src_ptr = &frame_buffer_display[y * (timing_mode->h_active_pixels >> h_repeat_shift)];