diff options
author | angelosa <lordkale4@gmail.com> | 2018-06-29 07:09:05 +0200 |
---|---|---|
committer | angelosa <lordkale4@gmail.com> | 2018-06-29 07:09:05 +0200 |
commit | 94635c5ca0e4a1f4c0dcf438e589aba9071db5a5 (patch) | |
tree | f550702b50a86962a3119174ca468a43d59c2993 | |
parent | 12b9075218aae386cfa963b2836864349f15f114 (diff) |
tetrisp2.cpp: added support for YUV422 colors in Stepping Stage [Angelo Salese]
-rw-r--r-- | src/mame/drivers/tetrisp2.cpp | 20 | ||||
-rw-r--r-- | src/mame/includes/tetrisp2.h | 8 | ||||
-rw-r--r-- | src/mame/video/tetrisp2.cpp | 86 |
3 files changed, 80 insertions, 34 deletions
diff --git a/src/mame/drivers/tetrisp2.cpp b/src/mame/drivers/tetrisp2.cpp index ec710c272b1..2598a1a86ba 100644 --- a/src/mame/drivers/tetrisp2.cpp +++ b/src/mame/drivers/tetrisp2.cpp @@ -696,11 +696,11 @@ void stepstag_state::stepstag_sub_map(address_map &map) map(0x200000, 0x20ffff).ram(); // scrambled palettes? - map(0x300000, 0x33ffff).ram() /* .w(FUNC(stepstag_sub_map::stepstag_palette_w))*/ .share("paletteram1"); + map(0x300000, 0x33ffff).ram().w(FUNC(stepstag_state::stepstag_palette_left_w)).share("paletteram1"); - map(0x400000, 0x43ffff).ram() /* .w(FUNC(stepstag_sub_map::stepstag_palette_w))*/ .share("paletteram2"); + map(0x400000, 0x43ffff).ram().w(FUNC(stepstag_state::stepstag_palette_mid_w)).share("paletteram2"); - map(0x500000, 0x53ffff).ram() /* .w(FUNC(stepstag_sub_map::stepstag_palette_w))*/ .share("paletteram3"); + map(0x500000, 0x53ffff).ram().w(FUNC(stepstag_state::stepstag_palette_right_w)).share("paletteram3"); // rgb brightness? map(0x700000, 0x700001).nopw(); // 0-f @@ -1903,7 +1903,7 @@ MACHINE_CONFIG_START(stepstag_state::stepstag) MCFG_SCREEN_SIZE(0x160, 0xf0) MCFG_SCREEN_VISIBLE_AREA(0, 0x160-1, 0, 0xf0-1) MCFG_SCREEN_UPDATE_DRIVER(stepstag_state, screen_update_stepstag_left) -// MCFG_SCREEN_PALETTE("lpalette") +// MCFG_SCREEN_PALETTE("lpalette") MCFG_SCREEN_ADD("mscreen", RASTER) MCFG_SCREEN_REFRESH_RATE(60) @@ -1911,7 +1911,7 @@ MACHINE_CONFIG_START(stepstag_state::stepstag) MCFG_SCREEN_SIZE(0x160, 0xf0) MCFG_SCREEN_VISIBLE_AREA(0, 0x160-1, 0, 0xf0-1) MCFG_SCREEN_UPDATE_DRIVER(stepstag_state, screen_update_stepstag_mid) -// MCFG_SCREEN_PALETTE("palette") +// MCFG_SCREEN_PALETTE("mpalette") MCFG_SCREEN_ADD("rscreen", RASTER) MCFG_SCREEN_REFRESH_RATE(30) @@ -2661,7 +2661,10 @@ ROM_START( vjdash ) ROM_REGION( 0x100000, "sub", ROMREGION_ERASE ) // 68000 ROM_LOAD16_BYTE( "vjdash4_ver1.2.11", 0x00000, 0x80000, NO_DUMP ) ROM_LOAD16_BYTE( "vjdash4_ver1.2.14", 0x00001, 0x80000, NO_DUMP ) - + ROM_FILL( 6, 1, 0x01 ) + ROM_FILL( 0x100, 1, 0x60 ) + ROM_FILL( 0x101, 1, 0xfe ) + ROM_REGION( 0x0c00000, "sprites_left", ROMREGION_ERASE ) // left screen sprites ROM_LOAD( "vjdash-01", 0x000000, 0x400000, NO_DUMP ) ROM_LOAD( "vjdash-02", 0x400000, 0x400000, NO_DUMP ) @@ -2764,7 +2767,10 @@ ROM_START( step3 ) ROM_REGION( 0x100000, "maincpu", ROMREGION_ERASE00 ) // 68000 ROM_LOAD16_BYTE( "vj98344_step3.4", 0x00000, 0x80000, NO_DUMP ) ROM_LOAD16_BYTE( "vj98344_step3.1", 0x00001, 0x80000, NO_DUMP ) - + ROM_FILL( 6, 1, 0x01 ) + ROM_FILL( 0x100, 1, 0x60 ) + ROM_FILL( 0x101, 1, 0xfe ) + ROM_REGION( 0x100000, "sub", 0 ) // 68000 ROM_LOAD16_BYTE( "vj98348_step3_11_v1.1", 0x00000, 0x80000, CRC(9c36aef5) SHA1(bbac48c2c7949a6f8a6ec83515e94a343c88d1b6) ) ROM_LOAD16_BYTE( "vj98348_step3_14_v1.1", 0x00001, 0x80000, CRC(b86be557) SHA1(49dbd6ef1c50adcf3386d5423da8ae7685649c46) ) diff --git a/src/mame/includes/tetrisp2.h b/src/mame/includes/tetrisp2.h index e49dc498ea2..76cf8df8e89 100644 --- a/src/mame/includes/tetrisp2.h +++ b/src/mame/includes/tetrisp2.h @@ -190,14 +190,17 @@ public: DECLARE_WRITE16_MEMBER(stepstag_neon_w); DECLARE_WRITE16_MEMBER(stepstag_step_leds_w); DECLARE_WRITE16_MEMBER(stepstag_button_leds_w); - DECLARE_WRITE16_MEMBER( stepstag_palette_w ); + DECLARE_WRITE16_MEMBER( stepstag_palette_left_w ); + DECLARE_WRITE16_MEMBER( stepstag_palette_mid_w ); + DECLARE_WRITE16_MEMBER( stepstag_palette_right_w ); + void init_stepstag(); DECLARE_VIDEO_START(stepstag); uint32_t screen_update_stepstag_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); uint32_t screen_update_stepstag_mid(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); uint32_t screen_update_stepstag_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); uint32_t screen_update_stepstag_main(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - inline int mypal(int x); +// inline int mypal(int x); void stepstag(machine_config &config); void vjdash(machine_config &config); @@ -218,4 +221,5 @@ private: optional_shared_ptr<uint16_t> m_vj_paletteram_m; optional_shared_ptr<uint16_t> m_vj_paletteram_r; required_device<generic_latch_16_device> m_soundlatch; + void convert_yuv422_to_rgb888(palette_device *paldev, uint16_t *palram,uint32_t offset); }; diff --git a/src/mame/video/tetrisp2.cpp b/src/mame/video/tetrisp2.cpp index 0f53dd44fee..c5d8cb40060 100644 --- a/src/mame/video/tetrisp2.cpp +++ b/src/mame/video/tetrisp2.cpp @@ -322,7 +322,7 @@ VIDEO_START_MEMBER(tetrisp2_state,rocknms) */ template<class _BitmapClass> static void tetrisp2_draw_sprites(_BitmapClass &bitmap, bitmap_ind8 &bitmap_pri, const rectangle &cliprect, uint8_t* priority_ram, - uint16_t *sprram_top, size_t sprram_size, gfx_element *gfx, int flip ) + uint16_t *sprram_top, size_t sprram_size, gfx_element *gfx, int flip, bool is_yuv ) { int tx, ty, sx, sy, flipx, flipy; int xsize, ysize; @@ -353,7 +353,11 @@ static void tetrisp2_draw_sprites(_BitmapClass &bitmap, bitmap_ind8 &bitmap_pri, ty = (code >> 8) & 0xff; code = (color & 0x0fff); - color = (color >> 12) & 0xf; + // encoded to first word when YUV sprites are used + if(is_yuv == true) + color = (attr & 0x7f00) >> 8; + else + color = (color >> 12) & 0xf; size = source[ 3 ]; xsize = ((size >> 0) & 0xff) + 1; @@ -488,7 +492,7 @@ uint32_t tetrisp2_state::screen_update_tetrisp2(screen_device &screen, bitmap_in m_tilemap_fg->draw(screen, bitmap, cliprect, 0, 1 << 2); tetrisp2_draw_sprites(bitmap, screen.priority(), cliprect, m_priority.get(), - m_spriteram, m_spriteram.bytes(), m_gfxdecode->gfx(0), (m_systemregs[0x00] & 0x02) ); + m_spriteram, m_spriteram.bytes(), m_gfxdecode->gfx(0), (m_systemregs[0x00] & 0x02), false ); return 0; } @@ -573,7 +577,7 @@ uint32_t tetrisp2_state::screen_update_rockntread(screen_device &screen, bitmap_ m_tilemap_fg->draw(screen, bitmap, cliprect, 0, 1 << 2); tetrisp2_draw_sprites(bitmap, screen.priority(), cliprect, m_priority.get(), - m_spriteram, m_spriteram.bytes(), m_gfxdecode->gfx(0), (m_systemregs[0x00] & 0x02) ); + m_spriteram, m_spriteram.bytes(), m_gfxdecode->gfx(0), (m_systemregs[0x00] & 0x02), false ); return 0; } @@ -635,7 +639,7 @@ uint32_t tetrisp2_state::screen_update_rocknms_left(screen_device &screen, bitma m_tilemap_sub_fg->draw(screen, bitmap, cliprect, 0, 1 << 2); tetrisp2_draw_sprites(bitmap, screen.priority(), cliprect, m_priority.get(), - m_spriteram2, m_spriteram2.bytes(), m_sub_gfxdecode->gfx(0), (m_systemregs[0x00] & 0x02) ); + m_spriteram2, m_spriteram2.bytes(), m_sub_gfxdecode->gfx(0), (m_systemregs[0x00] & 0x02), false ); return 0; } @@ -696,7 +700,7 @@ uint32_t tetrisp2_state::screen_update_rocknms_right(screen_device &screen, bitm m_tilemap_fg->draw(screen, bitmap, cliprect, 0, 1 << 2); tetrisp2_draw_sprites(bitmap, screen.priority(), cliprect, m_priority.get(), - m_spriteram, m_spriteram.bytes(), m_gfxdecode->gfx(0), (m_systemregs[0x00] & 0x02) ); + m_spriteram, m_spriteram.bytes(), m_gfxdecode->gfx(0), (m_systemregs[0x00] & 0x02), false ); return 0; } @@ -748,7 +752,7 @@ uint32_t stepstag_state::screen_update_stepstag_left(screen_device &screen, bitm tetrisp2_draw_sprites( bitmap, screen.priority(), cliprect, m_priority.get(), - m_spriteram1, m_spriteram1.bytes(), m_vj_gfxdecode_l->gfx(0), (m_systemregs[0x00] & 0x02)); + m_spriteram1, m_spriteram1.bytes(), m_vj_gfxdecode_l->gfx(0), (m_systemregs[0x00] & 0x02), true); return 0; } @@ -760,7 +764,7 @@ uint32_t stepstag_state::screen_update_stepstag_mid(screen_device &screen, bitma tetrisp2_draw_sprites( bitmap, screen.priority(), cliprect, m_priority.get(), - m_spriteram2, m_spriteram2.bytes(), m_vj_gfxdecode_m->gfx(0), (m_systemregs[0x00] & 0x02)); + m_spriteram2, m_spriteram2.bytes(), m_vj_gfxdecode_m->gfx(0), (m_systemregs[0x00] & 0x02), true); // m_tilemap_rot->draw(screen, bitmap, cliprect, 0, 1 << 1); // m_tilemap_bg->draw(screen, bitmap, cliprect, 0, 1 << 0); @@ -771,12 +775,13 @@ uint32_t stepstag_state::screen_update_stepstag_mid(screen_device &screen, bitma uint32_t stepstag_state::screen_update_stepstag_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - bitmap.fill(0, cliprect); + // TODO: doesn't like pen 0? + bitmap.fill(m_vj_palette_r->black_pen(), cliprect); screen.priority().fill(0); tetrisp2_draw_sprites( bitmap, screen.priority(), cliprect, m_priority.get(), - m_spriteram3, m_spriteram3.bytes(), m_vj_gfxdecode_r->gfx(0), (m_systemregs[0x00] & 0x02)); + m_spriteram3, m_spriteram3.bytes(), m_vj_gfxdecode_r->gfx(0), (m_systemregs[0x00] & 0x02), true); return 0; } @@ -849,27 +854,58 @@ uint32_t stepstag_state::screen_update_stepstag_main(screen_device &screen, bitm tetrisp2_draw_sprites( bitmap, screen.priority(), cliprect, m_priority.get(), - m_spriteram, m_spriteram.bytes(), m_gfxdecode->gfx(0), (m_systemregs[0x00] & 0x02)); + m_spriteram, m_spriteram.bytes(), m_gfxdecode->gfx(0), (m_systemregs[0x00] & 0x02), false); return 0; } -// scrambled palettes? -inline int stepstag_state::mypal(int x) +// Stepping Stage encodes palette as YUV422. +// Convert them on the fly +void stepstag_state::convert_yuv422_to_rgb888(palette_device *paldev, uint16_t *palram, uint32_t offset) { -// return pal5bit(x >> 3); - return pal5bit((x^0xff) >> 3); -// return (((x - 0x80) >= 0) ? (x - 0x80) : 0) ^ 0x7f; -// return (x - 0x80); + uint8_t u = palram[offset/4*4+0] & 0xff; + uint8_t y1 = palram[offset/4*4+1] & 0xff; + uint8_t v = palram[offset/4*4+2] & 0xff; + //uint8_t y2 = palram[offset/4*4+3] & 0xff; + double bf = y1+1.772*(u - 128); + double gf = y1-0.334*(u - 128) - 0.714 * (v - 128); + double rf = y1+1.772*(v - 128); + if(rf > 255.0) + rf = 255.0; + if(rf < 0.0) + rf = 0.0; + if(gf > 255.0) + gf = 255.0; + if(gf < 0.0) + gf = 0.0; + if(bf > 255.0) + bf = 255.0; + if(bf < 0.0) + bf = 0.0; + + uint8_t r = (uint8_t)rf; + uint8_t g = (uint8_t)gf; + uint8_t b = (uint8_t)bf; + + paldev->set_pen_color(offset/4, r, g, b); + } -WRITE16_MEMBER(stepstag_state::stepstag_palette_w) +WRITE16_MEMBER(stepstag_state::stepstag_palette_left_w) { - data = COMBINE_DATA(&m_paletteram[offset]); -// if ((offset & 1) == 0) - m_palette->set_pen_color(offset/4, - mypal(m_paletteram[offset/4*4+0] & 0xff), - mypal(m_paletteram[offset/4*4+1] & 0xff), - mypal(m_paletteram[offset/4*4+2] & 0xff) - ); + COMBINE_DATA(&m_vj_paletteram_l[offset]); + convert_yuv422_to_rgb888(m_vj_palette_l,m_vj_paletteram_l,offset); +} + +WRITE16_MEMBER(stepstag_state::stepstag_palette_mid_w) +{ + COMBINE_DATA(&m_vj_paletteram_m[offset]); + convert_yuv422_to_rgb888(m_vj_palette_m,m_vj_paletteram_m,offset); } + +WRITE16_MEMBER(stepstag_state::stepstag_palette_right_w) +{ + COMBINE_DATA(&m_vj_paletteram_r[offset]); + convert_yuv422_to_rgb888(m_vj_palette_r,m_vj_paletteram_r,offset); +} + |