summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/spg_renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/spg_renderer.cpp')
-rw-r--r--src/devices/machine/spg_renderer.cpp39
1 files changed, 25 insertions, 14 deletions
diff --git a/src/devices/machine/spg_renderer.cpp b/src/devices/machine/spg_renderer.cpp
index 0bb116ef784..b1dcd7d46b8 100644
--- a/src/devices/machine/spg_renderer.cpp
+++ b/src/devices/machine/spg_renderer.cpp
@@ -255,7 +255,8 @@ void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectang
uint32_t tilemap = tilemapregs[2];
uint32_t palette_map = tilemapregs[3];
- //popmessage("draw draw_linemap bases %04x %04x\n", tilemap, palette_map);
+ //if (scanline == 128)
+ // popmessage("draw draw_linemap reg0 %04x reg1 %04x bases %04x %04x\n", tilemapregs[0], tilemapregs[1], tilemap, palette_map);
//uint32_t xscroll = scrollregs[0];
uint32_t yscroll = scrollregs[1];
@@ -294,26 +295,36 @@ void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectang
}
else
{
- for (int i = 0; i < 320 / 2; i++)
- {
- uint8_t palette_entry;
- uint16_t color;
- const uint16_t data = spc.read_word(sourcebase + i);
+ const uint32_t attr = tilemapregs[0];
+ const uint8_t bpp = attr & 0x0003;
+ const uint32_t nc_bpp = ((bpp)+1) << 1;
+ uint32_t palette_offset = (attr & 0x0f00) >> 4;
+ palette_offset >>= nc_bpp;
+ palette_offset <<= nc_bpp;
- palette_entry = (data & 0x00ff);
- color = paletteram[palette_entry];
+ uint32_t bits = 0;
+ uint32_t nbits = 0;
- if (!(color & 0x8000))
+ for (int i = 0; i < 320; i++)
+ {
+ bits <<= nc_bpp;
+ if (nbits < nc_bpp)
{
- m_linebuf[(i * 2) + 0] = color & 0x7fff;
+ uint16_t b = spc.read_word(sourcebase++ & 0x3fffff);
+ b = (b << 8) | (b >> 8);
+ bits |= b << (nc_bpp - nbits);
+ nbits += 16;
}
+ nbits -= nc_bpp;
+
+ uint32_t pal = palette_offset + (bits >> 16);
+ bits &= 0xffff;
- palette_entry = (data & 0xff00) >> 8;
- color = paletteram[palette_entry];
+ uint16_t rgb = paletteram[pal];
- if (!(color & 0x8000))
+ if (!(rgb & 0x8000))
{
- m_linebuf[(i * 2) + 1] = color & 0x7fff;
+ m_linebuf[i] = rgb;
}
}
}