summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/video/gba_lcd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/video/gba_lcd.cpp')
-rw-r--r--src/devices/video/gba_lcd.cpp34
1 files changed, 31 insertions, 3 deletions
diff --git a/src/devices/video/gba_lcd.cpp b/src/devices/video/gba_lcd.cpp
index ba63bca0008..c73996e32a3 100644
--- a/src/devices/video/gba_lcd.cpp
+++ b/src/devices/video/gba_lcd.cpp
@@ -1620,6 +1620,34 @@ WRITE32_MEMBER(gba_lcd_device::video_w)
}
}
+static inline uint32_t combine_data_32_16(uint32_t prev, uint32_t data, uint32_t mem_mask)
+{
+ COMBINE_DATA(&prev);
+
+ switch (mem_mask)
+ {
+ case 0x000000ff:
+ prev &= 0xffff00ff;
+ prev |= data << 8;
+ break;
+ case 0x0000ff00:
+ prev &= 0xffffff00;
+ prev |= data >> 8;
+ break;
+ case 0x00ff0000:
+ prev &= 0x00ffffff;
+ prev |= data << 8;
+ break;
+ case 0xff000000:
+ prev &= 0xff00ffff;
+ prev |= data >> 8;
+ break;
+ default:
+ break;
+ }
+ return prev;
+}
+
READ32_MEMBER(gba_lcd_device::gba_pram_r)
{
return m_pram[offset];
@@ -1627,7 +1655,7 @@ READ32_MEMBER(gba_lcd_device::gba_pram_r)
WRITE32_MEMBER(gba_lcd_device::gba_pram_w)
{
- COMBINE_DATA(&m_pram[offset]);
+ m_pram[offset] = combine_data_32_16(m_pram[offset], data, mem_mask);
}
READ32_MEMBER(gba_lcd_device::gba_vram_r)
@@ -1637,7 +1665,7 @@ READ32_MEMBER(gba_lcd_device::gba_vram_r)
WRITE32_MEMBER(gba_lcd_device::gba_vram_w)
{
- COMBINE_DATA(&m_vram[offset]);
+ m_vram[offset] = combine_data_32_16(m_vram[offset], data, mem_mask);
}
READ32_MEMBER(gba_lcd_device::gba_oam_r)
@@ -1647,7 +1675,7 @@ READ32_MEMBER(gba_lcd_device::gba_oam_r)
WRITE32_MEMBER(gba_lcd_device::gba_oam_w)
{
- COMBINE_DATA(&m_oam[offset]);
+ m_oam[offset] = combine_data_32_16(m_oam[offset], data, mem_mask);
}
TIMER_CALLBACK_MEMBER(gba_lcd_device::perform_hbl)