diff options
author | BALATON Zoltan <balaton@eik.bme.hu> | 2017-04-21 17:18:09 +0200 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2017-04-24 12:32:12 +0100 |
commit | afef2e1d537dce002f15ab12d85e99baaa7b6651 (patch) | |
tree | 559375e86993c8d9b65252a7a909aa38ad1d0e95 /hw/display/sm501_template.h | |
parent | efae27848da0cf5ea5c88f0172c482b8f37b8725 (diff) | |
download | qemu-afef2e1d537dce002f15ab12d85e99baaa7b6651.zip qemu-afef2e1d537dce002f15ab12d85e99baaa7b6651.tar.gz qemu-afef2e1d537dce002f15ab12d85e99baaa7b6651.tar.bz2 |
sm501: Fix device endianness
We only emulate the sysbus device in its default LE mode and PCI is LE
as well so specify this for registers and framebuffer memory.
Note that though the Linux kernel driver has code which claims to
handle both big and little endian, it is obviously bogus for 16 bit
and cannot be trusted as a source of information on the framebuffer
pixel format. This is our best guess about device behaviour based on
the specs and testing with MorphOS that is known to work on real HW.
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Tested-by: Aurelien Jarno <aurelien@aurel32.net>
Message-id: 8b9605a569f8bf54074e15903620b18cd9967c89.1492787889.git.balaton@eik.bme.hu
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw/display/sm501_template.h')
-rw-r--r-- | hw/display/sm501_template.h | 19 |
1 files changed, 6 insertions, 13 deletions
diff --git a/hw/display/sm501_template.h b/hw/display/sm501_template.h index 832ee61..54807bd 100644 --- a/hw/display/sm501_template.h +++ b/hw/display/sm501_template.h @@ -64,10 +64,10 @@ static void glue(draw_line16_, PIXEL_NAME)( uint8_t r, g, b; do { - rgb565 = lduw_p(s); - r = ((rgb565 >> 11) & 0x1f) << 3; - g = ((rgb565 >> 5) & 0x3f) << 2; - b = ((rgb565 >> 0) & 0x1f) << 3; + rgb565 = lduw_le_p(s); + r = (rgb565 >> 8) & 0xf8; + g = (rgb565 >> 3) & 0xfc; + b = (rgb565 << 3) & 0xf8; *(PIXEL_TYPE *)d = glue(rgb_to_pixel, PIXEL_NAME)(r, g, b); s += 2; d += BPP; @@ -80,16 +80,9 @@ static void glue(draw_line32_, PIXEL_NAME)( uint8_t r, g, b; do { - ldub_p(s); -#if defined(TARGET_WORDS_BIGENDIAN) - r = s[1]; - g = s[2]; - b = s[3]; -#else - b = s[0]; - g = s[1]; r = s[2]; -#endif + g = s[1]; + b = s[0]; *(PIXEL_TYPE *)d = glue(rgb_to_pixel, PIXEL_NAME)(r, g, b); s += 4; d += BPP; |