diff options
author | R. Belmont <rb6502@users.noreply.github.com> | 2019-05-19 12:40:43 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-19 12:40:43 -0400 |
commit | 788ed71261d998f167a2ef80a42831afa58e7520 (patch) | |
tree | fd8a622e1efde8f7185a77592c896edc5cb40247 | |
parent | ab164d186004afd2109f5b489bf2692c52d51810 (diff) | |
parent | ec6cee558f512ed3e7ed0c71a706c5ac153b7c3d (diff) |
Merge pull request #5079 from cam900/mdpal
Sega 315-5313 color related function updates
-rw-r--r-- | src/devices/video/315_5124.cpp | 70 | ||||
-rw-r--r-- | src/devices/video/315_5124.h | 6 | ||||
-rw-r--r-- | src/devices/video/315_5313.cpp | 71 | ||||
-rw-r--r-- | src/devices/video/315_5313.h | 12 | ||||
-rw-r--r-- | src/mame/drivers/megadriv.cpp | 5 | ||||
-rw-r--r-- | src/mame/drivers/vgmplay.cpp | 3 | ||||
-rw-r--r-- | src/mame/includes/megadriv.h | 2 | ||||
-rw-r--r-- | src/mame/machine/mega32x.cpp | 58 | ||||
-rw-r--r-- | src/mame/machine/mega32x.h | 13 | ||||
-rw-r--r-- | src/mame/machine/megadriv.cpp | 7 |
10 files changed, 130 insertions, 117 deletions
diff --git a/src/devices/video/315_5124.cpp b/src/devices/video/315_5124.cpp index 90b94577376..e95b3f92dd3 100644 --- a/src/devices/video/315_5124.cpp +++ b/src/devices/video/315_5124.cpp @@ -123,9 +123,9 @@ void sega315_5124_device::sega315_5124_palette(palette_device &palette) const { for (int i = 0; i < 64; i++) { - const int r = i & 0x03; - const int g = (i & 0x0c) >> 2; - const int b = (i & 0x30) >> 4; + const u8 r = i & 0x03; + const u8 g = (i & 0x0c) >> 2; + const u8 b = (i & 0x30) >> 4; palette.set_pen_color(i, pal2bit(r), pal2bit(g), pal2bit(b)); } // sms and sg1000-mark3 uses a different palette for modes 0 to 3 - see http://www.smspower.org/Development/Palette @@ -153,14 +153,39 @@ void sega315_5377_device::sega315_5377_palette(palette_device &palette) const { for (int i = 0; i < 4096; i++) { - const int r = i & 0x000f; - const int g = (i & 0x00f0) >> 4; - const int b = (i & 0x0f00) >> 8; + const u8 r = i & 0x000f; + const u8 g = (i & 0x00f0) >> 4; + const u8 b = (i & 0x0f00) >> 8; palette.set_pen_color(i, pal4bit(r), pal4bit(g), pal4bit(b)); } } +void sega315_5313_mode4_device::sega315_5313_palette(palette_device &palette) const +{ + // non-linear (reference : http://gendev.spritesmind.net/forum/viewtopic.php?f=22&t=2188) + static const u8 level[15] = {0,29,52,70,87,101,116,130,144,158,172,187,206,228,255}; + for (int i = 0; i < 512; i++) + { + const u8 r = (i & 0x0007) >> 0; + const u8 g = (i & 0x0038) >> 3; + const u8 b = (i & 0x01c0) >> 6; + palette.set_pen_color(i + (512 * 0), level[r << 1], level[g << 1], level[b << 1]); // normal + palette.set_pen_color(i + (512 * 1), level[r], level[g], level[b]); // shadow + palette.set_pen_color(i + (512 * 2), level[7 + r], level[7 + g], level[7 + b]); // hilight + } + // seperated SMS compatible mode color (reference : http://www.sega-16.com/forum/showthread.php?30530-SMS-VDP-output-levels) + static const u8 sms_level[4] = {0,99,162,255}; + for (int i = 0; i < 64; i++) + { + const u8 r = (i & 0x0003) >> 0; + const u8 g = (i & 0x000c) >> 2; + const u8 b = (i & 0x0030) >> 4; + palette.set_pen_color(i + (512 * 3), sms_level[r], sms_level[g], sms_level[b]); // normal + } +} + + // default address map void sega315_5124_device::sega315_5124(address_map &map) { @@ -1759,6 +1784,27 @@ void sega315_5377_device::update_palette() } +void sega315_5313_mode4_device::update_palette() +{ + /* Exit if palette has no changes */ + if (!m_cram_dirty) + { + return; + } + m_cram_dirty = false; + + if (m_vdp_mode != 4) + { + return; + } + + for (int i = 0; i < 32; i++) + { + m_current_palette[i] = (512 * 3) + (m_CRAM[i] & 0x3f); + } +} + + void sega315_5124_device::cram_write(u8 data) { u16 address = m_addr & m_cram_mask; @@ -1960,3 +2006,15 @@ void sega315_5377_device::device_add_mconfig(machine_config &config) m_snsnd->add_route(0, *this, 1.0, AUTO_ALLOC_INPUT, 0); m_snsnd->add_route(1, *this, 1.0, AUTO_ALLOC_INPUT, 1); } + +//------------------------------------------------- +// device_add_mconfig - add machine configuration +//------------------------------------------------- + +void sega315_5313_mode4_device::device_add_mconfig(machine_config &config) +{ + sega315_5246_device::device_add_mconfig(config); + + m_palette->set_entries((512 * 3) + 64); + m_palette->set_init(FUNC(sega315_5313_mode4_device::sega315_5313_palette)); +} diff --git a/src/devices/video/315_5124.h b/src/devices/video/315_5124.h index b88cf5c38d7..21d149b6729 100644 --- a/src/devices/video/315_5124.h +++ b/src/devices/video/315_5124.h @@ -245,6 +245,9 @@ public: protected: sega315_5313_mode4_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u8 cram_size, u8 palette_offset, u8 reg_num_mask, int max_sprite_zoom_hcount, int max_sprite_zoom_vcount, const u8 *line_timing); + virtual void device_add_mconfig(machine_config &config) override; + + virtual void update_palette() override; virtual void write_memory(u8 data) override; virtual void load_vram_addr(u8 data) override; virtual void select_sprites(int line) override; @@ -253,6 +256,9 @@ protected: virtual void select_display_mode() override; virtual void select_extended_res_mode4(bool M1, bool M2, bool M3) override; virtual void draw_leftmost_pixels_mode4(int *line_buffer, int *priority_selected, int fine_x_scroll, int palette_selected, int tile_line) override; + +private: + void sega315_5313_palette(palette_device &palette) const; }; #endif // MAME_VIDEO_315_5124_H diff --git a/src/devices/video/315_5313.cpp b/src/devices/video/315_5313.cpp index b56f1349f59..b37fe8b4999 100644 --- a/src/devices/video/315_5313.cpp +++ b/src/devices/video/315_5313.cpp @@ -204,11 +204,9 @@ sega315_5313_device::sega315_5313_device(const machine_config &mconfig, const ch , m_highpri_renderline(nullptr) , m_video_renderline(nullptr) , m_palette_lookup(nullptr) - , m_palette_lookup_sprite(nullptr) - , m_palette_lookup_shadow(nullptr) - , m_palette_lookup_highlight(nullptr) , m_space68k(nullptr) , m_cpu68k(*this, finder_base::DUMMY_TAG) + , m_ext_palette(*this, finder_base::DUMMY_TAG) { m_use_alt_timing = 0; m_palwrite_base = -1; @@ -223,8 +221,6 @@ void sega315_5313_device::device_add_mconfig(machine_config &config) { sega315_5313_mode4_device::device_add_mconfig(config); - m_palette->set_entries(0x200); // more entries for 32X - not really the cleanest way to do this - SEGAPSG(config.replace(), m_snsnd, DERIVED_CLOCK(1, 15)).add_route(ALL_OUTPUTS, *this, 0.5, AUTO_ALLOC_INPUT, 0); } @@ -294,22 +290,13 @@ void sega315_5313_device::device_start() m_video_renderline = std::make_unique<uint32_t[]>(320); m_palette_lookup = std::make_unique<uint16_t[]>(0x40); - m_palette_lookup_sprite = std::make_unique<uint16_t[]>(0x40); - - m_palette_lookup_shadow = std::make_unique<uint16_t[]>(0x40); - m_palette_lookup_highlight = std::make_unique<uint16_t[]>(0x40); memset(m_palette_lookup.get(),0x00,0x40*2); - memset(m_palette_lookup_sprite.get(),0x00,0x40*2); - - memset(m_palette_lookup_shadow.get(),0x00,0x40*2); - memset(m_palette_lookup_highlight.get(),0x00,0x40*2); - if (!m_use_alt_timing) - m_render_bitmap = std::make_unique<bitmap_ind16>(320, 512); // allocate maximum sizes we're going to use, it's safer. + m_render_bitmap = std::make_unique<bitmap_rgb32>(320, 512); // allocate maximum sizes we're going to use, it's safer. else - m_render_line = std::make_unique<uint16_t[]>(320); + m_render_line = std::make_unique<uint32_t[]>(320); m_render_line_raw = std::make_unique<uint16_t[]>(320); @@ -317,14 +304,11 @@ void sega315_5313_device::device_start() // but better safe than sorry... save_pointer(NAME(m_sprite_renderline), 1024); save_pointer(NAME(m_highpri_renderline), 320); - save_pointer(NAME(m_video_renderline), 320/4); + save_pointer(NAME(m_video_renderline), 320); save_pointer(NAME(m_palette_lookup), 0x40); - save_pointer(NAME(m_palette_lookup_sprite), 0x40); - save_pointer(NAME(m_palette_lookup_shadow), 0x40); - save_pointer(NAME(m_palette_lookup_highlight), 0x40); - save_pointer(NAME(m_render_line_raw), 320/2); + save_pointer(NAME(m_render_line_raw), 320); if (m_use_alt_timing) - save_pointer(NAME(m_render_line), 320/2); + save_pointer(NAME(m_render_line), 320); m_irq6_on_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sega315_5313_device::irq6_on_timer_callback), this)); m_irq4_on_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sega315_5313_device::irq4_on_timer_callback), this)); @@ -414,20 +398,17 @@ void sega315_5313_device::write_cram_value(int offset, int data) //logerror("Wrote to CRAM addr %04x data %04x\n",m_vdp_address&0xfffe,m_cram[m_vdp_address>>1]); if (m_use_cram) { - int r,g,b; - r = ((data >> 1)&0x07); - g = ((data >> 5)&0x07); - b = ((data >> 9)&0x07); - if (m_palwrite_base != -1) + data = ((m_cram[offset] & 0xe) >> 1) | ((m_cram[offset] & 0xe0) >> 2) | ((m_cram[offset] & 0xe00) >> 3); + m_palette_lookup[offset] = data; + if (m_ext_palette != nullptr) { - m_palette->set_pen_color(offset + m_palwrite_base ,pal3bit(r),pal3bit(g),pal3bit(b)); - m_palette->set_pen_color(offset + m_palwrite_base + 0x40 ,pal3bit(r>>1),pal3bit(g>>1),pal3bit(b>>1)); - m_palette->set_pen_color(offset + m_palwrite_base + 0x80 ,pal3bit((r>>1)|0x4),pal3bit((g>>1)|0x4),pal3bit((b>>1)|0x4)); + if (m_palwrite_base != -1) + { + m_ext_palette->set_pen_color(offset + m_palwrite_base, m_palette->pen(data)); + m_ext_palette->set_pen_color(offset + m_palwrite_base + 0x40, m_palette->pen(0x200 | data)); + m_ext_palette->set_pen_color(offset + m_palwrite_base + 0x80, m_palette->pen(0x400 | data)); + } } - m_palette_lookup[offset] = (b<<2) | (g<<7) | (r<<12); - m_palette_lookup_sprite[offset] = (b<<2) | (g<<7) | (r<<12); - m_palette_lookup_shadow[offset] = (b<<1) | (g<<6) | (r<<11); - m_palette_lookup_highlight[offset] = ((b|0x08)<<1) | ((g|0x08)<<6) | ((r|0x08)<<11); } } @@ -2641,16 +2622,14 @@ void sega315_5313_device::render_videoline_to_videobuffer(int scanline) /* This converts our render buffer to real screen colours */ void sega315_5313_device::render_videobuffer_to_screenbuffer(int scanline) { - uint16_t *lineptr; - - + uint32_t *lineptr; if (!m_use_alt_timing) { if (scanline >= m_render_bitmap->height()) // safety, shouldn't happen now we allocate a fixed amount tho return; - lineptr = &m_render_bitmap->pix16(scanline); + lineptr = &m_render_bitmap->pix32(scanline); } else @@ -2659,6 +2638,9 @@ void sega315_5313_device::render_videobuffer_to_screenbuffer(int scanline) for (int x = 0; x < 320; x++) { uint32_t dat = m_video_renderline[x]; + uint16_t clut = m_palette_lookup[(dat & 0x3f)]; + if (!MEGADRIVE_REG0_SPECIAL_PAL) // 3 bit color mode, correct? + clut &= 0x111; if (!(dat & 0x20000)) m_render_line_raw[x] = 0x100; @@ -2670,12 +2652,12 @@ void sega315_5313_device::render_videobuffer_to_screenbuffer(int scanline) { if (dat & 0x10000) { - lineptr[x] = m_palette_lookup_sprite[(dat & 0x3f)]; + lineptr[x] = m_palette->pen(clut); m_render_line_raw[x] |= (dat & 0x3f) | 0x080; } else { - lineptr[x] = m_palette_lookup[(dat & 0x3f)]; + lineptr[x] = m_palette->pen(clut); m_render_line_raw[x] |= (dat & 0x3f) | 0x040; } @@ -2691,26 +2673,25 @@ void sega315_5313_device::render_videobuffer_to_screenbuffer(int scanline) case 0x10000: // (sprite) low priority, no shadow sprite, no highlight = shadow case 0x12000: // (sprite) low priority, shadow sprite, no highlight = shadow case 0x16000: // (sprite) normal pri, shadow sprite, no highlight = shadow? - lineptr[x] = m_palette_lookup_shadow[(dat & 0x3f)]; + lineptr[x] = m_palette->pen(0x200 | clut); m_render_line_raw[x] |= (dat & 0x3f) | 0x000; break; case 0x4000: // normal pri, no shadow sprite, no highlight = normal; case 0x8000: // low pri, highlight sprite = normal; - lineptr[x] = m_palette_lookup[(dat & 0x3f)]; + lineptr[x] = m_palette->pen(clut); m_render_line_raw[x] |= (dat & 0x3f) | 0x040; break; case 0x14000: // (sprite) normal pri, no shadow sprite, no highlight = normal; case 0x18000: // (sprite) low pri, highlight sprite = normal; - lineptr[x] = m_palette_lookup_sprite[(dat & 0x3f)]; + lineptr[x] = m_palette->pen(clut); m_render_line_raw[x] |= (dat & 0x3f) | 0x080; break; - case 0x0c000: // normal pri, highlight set = highlight? case 0x1c000: // (sprite) normal pri, highlight set = highlight? - lineptr[x] = m_palette_lookup_highlight[(dat & 0x3f)]; + lineptr[x] = m_palette->pen(0x400 | clut); m_render_line_raw[x] |= (dat & 0x3f) | 0x0c0; break; diff --git a/src/devices/video/315_5313.h b/src/devices/video/315_5313.h index 28d1d995d97..a62468808e8 100644 --- a/src/devices/video/315_5313.h +++ b/src/devices/video/315_5313.h @@ -23,7 +23,7 @@ public: sega315_5313_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - typedef device_delegate<void (int x, uint32_t priority, uint16_t &lineptr)> md_32x_scanline_delegate; + typedef device_delegate<void (int x, uint32_t priority, uint32_t &lineptr)> md_32x_scanline_delegate; typedef device_delegate<void (int scanline, int irq6)> md_32x_interrupt_delegate; typedef device_delegate<void (int scanline)> md_32x_scanline_helper_delegate; @@ -33,7 +33,7 @@ public: void set_alt_timing(int use_alt_timing) { m_use_alt_timing = use_alt_timing; } void set_pal_write_base(int palwrite_base) { m_palwrite_base = palwrite_base; } - template <typename T> void set_palette(T &&tag) { m_palette.set_tag(std::forward<T>(tag)); } + template <typename T> void set_palette(T &&tag) { m_ext_palette.set_tag(std::forward<T>(tag)); } // Temporary solution while 32x VDP mixing and scanline interrupting is moved outside MD VDP template <typename... T> void set_md_32x_scanline(T &&... args) { m_32x_scanline_func = md_32x_scanline_delegate(std::forward<T>(args)...); } @@ -75,8 +75,8 @@ public: m_render_bitmap->fill(0); } - std::unique_ptr<bitmap_ind16> m_render_bitmap; - std::unique_ptr<uint16_t[]> m_render_line; + std::unique_ptr<bitmap_rgb32> m_render_bitmap; + std::unique_ptr<uint32_t[]> m_render_line; std::unique_ptr<uint16_t[]> m_render_line_raw; TIMER_DEVICE_CALLBACK_MEMBER( megadriv_scanline_timer_callback_alt_timing ); @@ -180,12 +180,10 @@ private: std::unique_ptr<uint8_t[]> m_highpri_renderline; std::unique_ptr<uint32_t[]> m_video_renderline; std::unique_ptr<uint16_t[]> m_palette_lookup; - std::unique_ptr<uint16_t[]> m_palette_lookup_sprite; // for C2 - std::unique_ptr<uint16_t[]> m_palette_lookup_shadow; - std::unique_ptr<uint16_t[]> m_palette_lookup_highlight; address_space *m_space68k; required_device<m68000_base_device> m_cpu68k; + optional_device<palette_device> m_ext_palette; }; diff --git a/src/mame/drivers/megadriv.cpp b/src/mame/drivers/megadriv.cpp index 08571aafb46..6584be13d6f 100644 --- a/src/mame/drivers/megadriv.cpp +++ b/src/mame/drivers/megadriv.cpp @@ -580,7 +580,7 @@ DEVICE_IMAGE_LOAD_MEMBER( md_cons_state, _32x_cart ) } -void md_cons_state::_32x_scanline_callback(int x, uint32_t priority, uint16_t &lineptr) +void md_cons_state::_32x_scanline_callback(int x, uint32_t priority, uint32_t &lineptr) { if (m_32x) m_32x->_32x_render_videobuffer_to_screenbuffer(x, priority, lineptr); @@ -612,7 +612,6 @@ MACHINE_CONFIG_START(md_cons_state::genesis_32x) m_vdp->add_route(ALL_OUTPUTS, "rspeaker", (0.25)/2); SEGA_32X_NTSC(config, m_32x, (MASTER_CLOCK_NTSC * 3) / 7, m_maincpu, m_scan_timer); - m_32x->set_palette_tag("gen_vdp:palette"); subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console)); @@ -647,7 +646,6 @@ MACHINE_CONFIG_START(md_cons_state::mdj_32x) m_vdp->add_route(ALL_OUTPUTS, "rspeaker", (0.25)/2); SEGA_32X_NTSC(config, m_32x, (MASTER_CLOCK_NTSC * 3) / 7, m_maincpu, m_scan_timer); - m_32x->set_palette_tag("gen_vdp:palette"); subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console)); @@ -682,7 +680,6 @@ MACHINE_CONFIG_START(md_cons_state::md_32x) m_vdp->add_route(ALL_OUTPUTS, "rspeaker", (0.25)/2); SEGA_32X_PAL(config, m_32x, (MASTER_CLOCK_PAL * 3) / 7, m_maincpu, m_scan_timer); - m_32x->set_palette_tag("gen_vdp:palette"); subdevice<screen_device>("megadriv")->screen_vblank().set(FUNC(md_cons_state::screen_vblank_console)); diff --git a/src/mame/drivers/vgmplay.cpp b/src/mame/drivers/vgmplay.cpp index ab255886112..4c238980cc5 100644 --- a/src/mame/drivers/vgmplay.cpp +++ b/src/mame/drivers/vgmplay.cpp @@ -3642,15 +3642,12 @@ MACHINE_CONFIG_START(vgmplay_state::vgmplay) /// TODO: rewrite to generate audio without using DAC devices SEGA_32X_NTSC(config, m_sega32x, 0, "sega32x_maincpu", "sega32x_scanline_timer"); - m_sega32x->set_palette_tag("sega32x_palette"); auto& sega32x_maincpu(M68000(config, "sega32x_maincpu", 0)); sega32x_maincpu.set_disable(); TIMER(config, "sega32x_scanline_timer", 0); - PALETTE(config, "sega32x_palette").set_entries(0xc0 * 2); - m_sega32x->subdevice<cpu_device>("32x_master_sh2")->set_disable(); m_sega32x->subdevice<cpu_device>("32x_slave_sh2")->set_disable(); diff --git a/src/mame/includes/megadriv.h b/src/mame/includes/megadriv.h index c208c0a1af0..37e7c27526d 100644 --- a/src/mame/includes/megadriv.h +++ b/src/mame/includes/megadriv.h @@ -183,7 +183,7 @@ public: DECLARE_DEVICE_IMAGE_LOAD_MEMBER( _32x_cart ); - void _32x_scanline_callback(int x, uint32_t priority, uint16_t &lineptr); + void _32x_scanline_callback(int x, uint32_t priority, uint32_t &lineptr); void _32x_interrupt_callback(int scanline, int irq6); void _32x_scanline_helper_callback(int scanline); diff --git a/src/mame/machine/mega32x.cpp b/src/mame/machine/mega32x.cpp index 9a9fa04cdb0..d38872333d2 100644 --- a/src/mame/machine/mega32x.cpp +++ b/src/mame/machine/mega32x.cpp @@ -225,6 +225,7 @@ DEFINE_DEVICE_TYPE(SEGA_32X_PAL, sega_32x_pal_device, "sega_32x_pal", "Sega 3 sega_32x_device::sega_32x_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock) + , device_palette_interface(mconfig, *this) , m_sh2_shared(*this, "sh2_shared") , m_main_cpu(*this, finder_base::DUMMY_TAG) , m_master_cpu(*this, "32x_master_sh2") @@ -232,7 +233,6 @@ sega_32x_device::sega_32x_device(const machine_config &mconfig, device_type type , m_ldac(*this, "ldac") , m_rdac(*this, "rdac") , m_scan_timer(*this, finder_base::DUMMY_TAG) - , m_palette(*this, finder_base::DUMMY_TAG) { } @@ -253,20 +253,7 @@ READ16_MEMBER( sega_32x_device::_32x_68k_palette_r ) WRITE16_MEMBER( sega_32x_device::_32x_68k_palette_w ) { - int r,g,b, p; - COMBINE_DATA(&m_32x_palette[offset]); - data = m_32x_palette[offset]; - - r = ((data >> 0) & 0x1f); - g = ((data >> 5) & 0x1f); - b = ((data >> 10) & 0x1f); - p = ((data >> 15) & 0x01); // priority 'through' bit - - m_32x_palette_lookup[offset] = (r << 10) | (g << 5) | (b << 0) | (p << 15); - - m_palette->set_pen_color(offset+0x40,pal5bit(r),pal5bit(g),pal5bit(b)); - } READ16_MEMBER( sega_32x_device::_32x_68k_dram_r ) @@ -1637,14 +1624,14 @@ void sega_32x_device::_32x_render_videobuffer_to_screenbuffer_helper(int scanlin { if (x>=0) { - m_32x_linerender[x] = m_32x_palette_lookup[(coldata & 0xff00)>>8]; + m_32x_linerender[x] = m_32x_palette[(coldata & 0xff00)>>8]; } x++; if (x>=0) { - m_32x_linerender[x] = m_32x_palette_lookup[(coldata & 0x00ff)]; + m_32x_linerender[x] = m_32x_palette[(coldata & 0x00ff)]; } } @@ -1673,7 +1660,7 @@ void sega_32x_device::_32x_render_videobuffer_to_screenbuffer_helper(int scanlin { if (x>=0) { - m_32x_linerender[x] = m_32x_palette_lookup[(coldata)]; + m_32x_linerender[x] = m_32x_palette[(coldata)]; } x++; } @@ -1695,22 +1682,8 @@ void sega_32x_device::_32x_render_videobuffer_to_screenbuffer_helper(int scanlin x = start; while (x<320) { - uint16_t coldata; - coldata = m_32x_display_dram[lineoffs&0xffff]; - - // need to swap red and blue around for MAME - { - int r = ((coldata >> 0) & 0x1f); - int g = ((coldata >> 5) & 0x1f); - int b = ((coldata >> 10) & 0x1f); - int p = ((coldata >> 15) & 0x01); // priority 'through' bit - - coldata = (r << 10) | (g << 5) | (b << 0) | (p << 15); - - } - if (x>=0) - m_32x_linerender[x] = coldata; + m_32x_linerender[x] = m_32x_display_dram[lineoffs&0xffff]; x++; lineoffs++; @@ -1719,23 +1692,23 @@ void sega_32x_device::_32x_render_videobuffer_to_screenbuffer_helper(int scanlin } } -void sega_32x_device::_32x_render_videobuffer_to_screenbuffer(int x, uint32_t priority, uint16_t &lineptr) +void sega_32x_device::_32x_render_videobuffer_to_screenbuffer(int x, uint32_t priority, uint32_t &lineptr) { if (m_32x_displaymode != 0) { if (!m_32x_videopriority) { if (priority && !(m_32x_linerender[x] & 0x8000)) - lineptr = m_32x_linerender[x] & 0x7fff; + lineptr = pen(m_32x_linerender[x] & 0x7fff); if (m_32x_linerender[x] & 0x8000) - lineptr = m_32x_linerender[x] & 0x7fff; + lineptr = pen(m_32x_linerender[x] & 0x7fff); } else { if (priority && m_32x_linerender[x] & 0x8000) - lineptr = m_32x_linerender[x] & 0x7fff; + lineptr = pen(m_32x_linerender[x] & 0x7fff); if (!(m_32x_linerender[x] & 0x8000)) - lineptr = m_32x_linerender[x] & 0x7fff; + lineptr = pen(m_32x_linerender[x] & 0x7fff); } } } @@ -1814,6 +1787,15 @@ void sega_32x_pal_device::device_add_mconfig(machine_config &config) void sega_32x_device::device_start() { + for (int i = 0; i < 32*32*32/**2*/; i++) + { + int r = (i >> 0) & 0x1f; + int g = (i >> 5) & 0x1f; + int b = (i >> 10) & 0x1f; + //int p = (i >> 15) & 0x01; // priority 'through' bit + set_pen_color(i, pal5bit(r), pal5bit(g), pal5bit(b)); + } + m_32x_pwm_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sega_32x_device::handle_pwm_callback), this)); m_32x_dram0 = std::make_unique<uint16_t[]>(0x40000/2); @@ -1822,10 +1804,8 @@ void sega_32x_device::device_start() memset(m_32x_dram0.get(), 0x00, 0x40000); memset(m_32x_dram1.get(), 0x00, 0x40000); - m_32x_palette_lookup = std::make_unique<uint16_t[]>(0x200/2); m_32x_palette = std::make_unique<uint16_t[]>(0x200/2); - memset(m_32x_palette_lookup.get(), 0x00, 0x200); memset(m_32x_palette.get(), 0x00, 0x200); m_32x_display_dram = m_32x_dram0.get(); diff --git a/src/mame/machine/mega32x.h b/src/mame/machine/mega32x.h index 523ba1ffe77..71571029e88 100644 --- a/src/mame/machine/mega32x.h +++ b/src/mame/machine/mega32x.h @@ -13,7 +13,7 @@ #include "sound/dac.h" #include "emupal.h" -class sega_32x_device : public device_t +class sega_32x_device : public device_t, public device_palette_interface { public: void pause_cpu(); @@ -30,9 +30,6 @@ public: update_total_scanlines(mode3); } - // configuration - template <typename T> void set_palette_tag(T &&tag) { m_palette.set_tag(std::forward<T>(tag)); } - DECLARE_READ32_MEMBER( _32x_sh2_master_4000_common_4002_r ); DECLARE_READ32_MEMBER( _32x_sh2_slave_4000_common_4002_r ); DECLARE_READ32_MEMBER( _32x_sh2_common_4004_common_4006_r ); @@ -101,7 +98,7 @@ public: SH2_DMA_FIFO_DATA_AVAILABLE_CB(_32x_fifo_available_callback); void _32x_render_videobuffer_to_screenbuffer_helper(int scanline); - void _32x_render_videobuffer_to_screenbuffer(int x, uint32_t priority, uint16_t &lineptr); + void _32x_render_videobuffer_to_screenbuffer(int x, uint32_t priority, uint32_t &lineptr); int sh2_master_pwmint_enable, sh2_slave_pwmint_enable; void _32x_check_framebuffer_swap(bool enabled); @@ -120,6 +117,9 @@ protected: virtual void device_reset() override; virtual void device_add_mconfig(machine_config &config) override; + // device_palette_interface overrides + virtual uint32_t palette_entries() const override { return 32*32*32/**2*/; } + void update_total_scanlines(bool mode3) { m_total_scanlines = mode3 ? (m_base_total_scanlines * 2) : m_base_total_scanlines; } // this gets set at each EOF /* our main vblank handler resets this */ @@ -194,7 +194,6 @@ private: std::unique_ptr<uint16_t[]> m_32x_dram1; uint16_t *m_32x_display_dram, *m_32x_access_dram; std::unique_ptr<uint16_t[]> m_32x_palette; - std::unique_ptr<uint16_t[]> m_32x_palette_lookup; uint16_t m_fifo_block_a[4]; uint16_t m_fifo_block_b[4]; @@ -204,8 +203,6 @@ private: int m_current_fifo_read_pos; int m_fifo_block_a_full; int m_fifo_block_b_full; - - required_device<palette_device> m_palette; }; diff --git a/src/mame/machine/megadriv.cpp b/src/mame/machine/megadriv.cpp index 43da1c28c11..e9c0ad38fd3 100644 --- a/src/mame/machine/megadriv.cpp +++ b/src/mame/machine/megadriv.cpp @@ -752,17 +752,16 @@ uint32_t md_base_state::screen_update_megadriv(screen_device &screen, bitmap_rgb for (int y = cliprect.min_y; y <= cliprect.max_y; y++) { uint32_t* desty = &bitmap.pix32(y, 0); - uint16_t* srcy; + uint32_t* srcy; if (!m_vdp->m_use_alt_timing) - srcy = &m_vdp->m_render_bitmap->pix(y, 0); + srcy = &m_vdp->m_render_bitmap->pix32(y, 0); else srcy = m_vdp->m_render_line.get(); for (int x = cliprect.min_x; x <= cliprect.max_x; x++) { - uint16_t src = srcy[x]; - desty[x] = rgb_t(pal5bit(src >> 10), pal5bit(src >> 5), pal5bit(src >> 0)); + desty[x] = srcy[x]; } } |