summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author angelosa <lordkale4@gmail.com>2018-06-29 07:09:05 +0200
committer angelosa <lordkale4@gmail.com>2018-06-29 07:09:05 +0200
commit94635c5ca0e4a1f4c0dcf438e589aba9071db5a5 (patch)
treef550702b50a86962a3119174ca468a43d59c2993
parent12b9075218aae386cfa963b2836864349f15f114 (diff)
tetrisp2.cpp: added support for YUV422 colors in Stepping Stage [Angelo Salese]
-rw-r--r--src/mame/drivers/tetrisp2.cpp20
-rw-r--r--src/mame/includes/tetrisp2.h8
-rw-r--r--src/mame/video/tetrisp2.cpp86
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);
+}
+