From dfbb4f2f7258ce0b23d71312a3116e3bbd4b2957 Mon Sep 17 00:00:00 2001 From: cam900 Date: Sat, 14 Dec 2019 00:13:07 +0900 Subject: ms32.cpp, bnstars.cpp, tetrisp2.cpp : Device-fied sprite hardware (ms32_sprite.cpp), Fix zooming algorithm, Use shorter/correct type values, Verify clock related to XTAL (#6005) * ms32.cpp, bnstars.cpp, tetrisp2.cpp : Device-fied sprite hardware (ms32_sprite.cpp), Fix zooming algorithm, Use shorter/correct type values, Verify clock related to XTAL ms32.cpp : Fix sprite delaying * bnstars.cpp : Fix spacing * ms32_sprite.cpp : Fix non-clip case * ms32_sprite.cpp : Add notes --- scripts/target/mame/arcade.lua | 2 + src/mame/drivers/bnstars.cpp | 265 ++++----- src/mame/drivers/ms32.cpp | 92 +--- src/mame/drivers/tetrisp2.cpp | 223 ++++---- src/mame/includes/ms32.h | 46 +- src/mame/includes/tetrisp2.h | 102 ++-- src/mame/video/ms32.cpp | 130 ++--- src/mame/video/ms32_sprite.cpp | 1158 ++++++++++++++++++++++++++++++++++++++++ src/mame/video/ms32_sprite.h | 90 ++++ src/mame/video/tetrisp2.cpp | 168 +++--- 10 files changed, 1707 insertions(+), 569 deletions(-) create mode 100644 src/mame/video/ms32_sprite.cpp create mode 100644 src/mame/video/ms32_sprite.h diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index 812bee794fe..ba6ba0a04cc 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -2234,6 +2234,8 @@ files { MAME_DIR .. "src/mame/video/jalblend.h", MAME_DIR .. "src/mame/video/ms1_tmap.cpp", MAME_DIR .. "src/mame/video/ms1_tmap.h", + MAME_DIR .. "src/mame/video/ms32_sprite.cpp", + MAME_DIR .. "src/mame/video/ms32_sprite.h", } createMAMEProjects(_target, _subtarget, "jpm") diff --git a/src/mame/drivers/bnstars.cpp b/src/mame/drivers/bnstars.cpp index d6a88d8864d..ddc8e4709fc 100644 --- a/src/mame/drivers/bnstars.cpp +++ b/src/mame/drivers/bnstars.cpp @@ -55,20 +55,20 @@ ROMs : MB-93142.36 [2eb6a503] (IC42, also printed "?u?????j???[Ver1.2") VSJANSHI5.6 [fdbbac21] (IC9, actual label is "VS?W?????V 5 Ver1.0") VSJANSHI6.5 [fdbbac21] (IC8, actual label is "VS?W?????V 6 Ver1.0") -?@?@?@?@?@MR96004-01.20 [3366d104] (IC29) -?@?@?@?@?@MR96004-02.28 [ad556664] (IC49) -?@?@?@?@?@MR96004-03.21 [b399e2b1] (IC30) -?@?@?@?@?@MR96004-04.29 [f4f4cf4a] (IC50) -?@?@?@?@?@MR96004-05.22 [cd6c357e] (IC31) -?@?@?@?@?@MR96004-06.30 [fc6daad7] (IC51) -?@?@?@?@?@MR96004-07.23 [177e32fa] (IC32) -?@?@?@?@?@MR96004-08.31 [f6df27b2] (IC52) + MR96004-01.20 [3366d104] (IC29) + MR96004-02.28 [ad556664] (IC49) + MR96004-03.21 [b399e2b1] (IC30) + MR96004-04.29 [f4f4cf4a] (IC50) + MR96004-05.22 [cd6c357e] (IC31) + MR96004-06.30 [fc6daad7] (IC51) + MR96004-07.23 [177e32fa] (IC32) + MR96004-08.31 [f6df27b2] (IC52) -?@?@?@?@?@MR96004-09.1 [603143e8] (IC4) -?@?@?@?@?@MR96004-09.7 [603143e8] (IC10) + MR96004-09.1 [603143e8] (IC4) + MR96004-09.7 [603143e8] (IC10) -?@?@?@?@?@MR96004-11.11 [e6da552c] (IC17) -?@?@?@?@?@MR96004-11.13 [e6da552c] (IC19) + MR96004-11.11 [e6da552c] (IC17) + MR96004-11.13 [e6da552c] (IC19) Sound PCB @@ -106,14 +106,14 @@ class bnstars_state : public ms32_state public: bnstars_state(const machine_config &mconfig, device_type type, const char *tag) : ms32_state(mconfig, type, tag) - , m_ms32_tx0_ram(*this, "tx0_ram") - , m_ms32_tx1_ram(*this, "tx1_ram") - , m_ms32_bg0_ram(*this, "bg0_ram") - , m_ms32_bg1_ram(*this, "bg1_ram") - , m_ms32_roz0_ram(*this, "roz0_ram") - , m_ms32_roz1_ram(*this, "roz1_ram") + , m_ms32_tx0_ram(*this, "tx0_ram", 32) + , m_ms32_tx1_ram(*this, "tx1_ram", 32) + , m_ms32_bg0_ram(*this, "bg0_ram", 32) + , m_ms32_bg1_ram(*this, "bg1_ram", 32) + , m_ms32_roz0_ram(*this, "roz0_ram", 32) + , m_ms32_roz1_ram(*this, "roz1_ram", 32) , m_ms32_roz_ctrl(*this, "roz_ctrl.%u", 0) - , m_ms32_spram(*this, "spram") + , m_ms32_spram(*this, "spram", 32) , m_ms32_tx0_scroll(*this, "tx0_scroll") , m_ms32_bg0_scroll(*this, "bg0_scroll") , m_ms32_tx1_scroll(*this, "tx1_scroll") @@ -133,29 +133,29 @@ private: tilemap_t *m_ms32_tx_tilemap[2]; tilemap_t *m_ms32_bg_tilemap[2]; tilemap_t *m_ms32_roz_tilemap[2]; - required_shared_ptr m_ms32_tx0_ram; - required_shared_ptr m_ms32_tx1_ram; - required_shared_ptr m_ms32_bg0_ram; - required_shared_ptr m_ms32_bg1_ram; - required_shared_ptr m_ms32_roz0_ram; - required_shared_ptr m_ms32_roz1_ram; - required_shared_ptr_array m_ms32_roz_ctrl; - required_shared_ptr m_ms32_spram; - required_shared_ptr m_ms32_tx0_scroll; - required_shared_ptr m_ms32_bg0_scroll; - required_shared_ptr m_ms32_tx1_scroll; - required_shared_ptr m_ms32_bg1_scroll; + required_shared_ptr m_ms32_tx0_ram; + required_shared_ptr m_ms32_tx1_ram; + required_shared_ptr m_ms32_bg0_ram; + required_shared_ptr m_ms32_bg1_ram; + required_shared_ptr m_ms32_roz0_ram; + required_shared_ptr m_ms32_roz1_ram; + required_shared_ptr_array m_ms32_roz_ctrl; + required_shared_ptr m_ms32_spram; + required_shared_ptr m_ms32_tx0_scroll; + required_shared_ptr m_ms32_bg0_scroll; + required_shared_ptr m_ms32_tx1_scroll; + required_shared_ptr m_ms32_bg1_scroll; required_ioport_array<4> m_p1_keys; required_ioport_array<4> m_p2_keys; - uint32_t m_bnstars1_mahjong_select; - DECLARE_WRITE32_MEMBER(ms32_tx0_ram_w); - DECLARE_WRITE32_MEMBER(ms32_tx1_ram_w); - DECLARE_WRITE32_MEMBER(ms32_bg0_ram_w); - DECLARE_WRITE32_MEMBER(ms32_bg1_ram_w); - DECLARE_WRITE32_MEMBER(ms32_roz0_ram_w); - DECLARE_WRITE32_MEMBER(ms32_roz1_ram_w); + u32 m_bnstars1_mahjong_select; + DECLARE_WRITE16_MEMBER(ms32_tx0_ram_w); + DECLARE_WRITE16_MEMBER(ms32_tx1_ram_w); + DECLARE_WRITE16_MEMBER(ms32_bg0_ram_w); + DECLARE_WRITE16_MEMBER(ms32_bg1_ram_w); + DECLARE_WRITE16_MEMBER(ms32_roz0_ram_w); + DECLARE_WRITE16_MEMBER(ms32_roz1_ram_w); DECLARE_WRITE32_MEMBER(bnstars1_mahjong_select_w); TILE_GET_INFO_MEMBER(get_ms32_tx0_tile_info); TILE_GET_INFO_MEMBER(get_ms32_tx1_tile_info); @@ -164,10 +164,10 @@ private: TILE_GET_INFO_MEMBER(get_ms32_roz0_tile_info); TILE_GET_INFO_MEMBER(get_ms32_roz1_tile_info); virtual void video_start() override; - uint32_t screen_update_bnstars_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_bnstars_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update_bnstars_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update_bnstars_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int priority, int chip); - void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, uint32_t *sprram_top, size_t sprram_size); + void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u16 *sprram_top, size_t sprram_size); void bnstars_map(address_map &map); void bnstars_sound_map(address_map &map); }; @@ -181,7 +181,7 @@ TILE_GET_INFO_MEMBER(bnstars_state::get_ms32_tx0_tile_info) tileno = m_ms32_tx0_ram[tile_index *2+0] & 0x0000ffff; colour = m_ms32_tx0_ram[tile_index *2+1] & 0x0000000f; - SET_TILE_INFO_MEMBER(3,tileno,colour,0); + SET_TILE_INFO_MEMBER(2,tileno,colour,0); } TILE_GET_INFO_MEMBER(bnstars_state::get_ms32_tx1_tile_info) @@ -191,16 +191,16 @@ TILE_GET_INFO_MEMBER(bnstars_state::get_ms32_tx1_tile_info) tileno = m_ms32_tx1_ram[tile_index *2+0] & 0x0000ffff; colour = m_ms32_tx1_ram[tile_index *2+1] & 0x0000000f; - SET_TILE_INFO_MEMBER(6,tileno,colour,0); + SET_TILE_INFO_MEMBER(5,tileno,colour,0); } -WRITE32_MEMBER(bnstars_state::ms32_tx0_ram_w) +WRITE16_MEMBER(bnstars_state::ms32_tx0_ram_w) { COMBINE_DATA(&m_ms32_tx0_ram[offset]); m_ms32_tx_tilemap[0]->mark_tile_dirty(offset/2); } -WRITE32_MEMBER(bnstars_state::ms32_tx1_ram_w) +WRITE16_MEMBER(bnstars_state::ms32_tx1_ram_w) { COMBINE_DATA(&m_ms32_tx1_ram[offset]); m_ms32_tx_tilemap[1]->mark_tile_dirty(offset/2); @@ -215,7 +215,7 @@ TILE_GET_INFO_MEMBER(bnstars_state::get_ms32_bg0_tile_info) tileno = m_ms32_bg0_ram[tile_index *2+0] & 0x0000ffff; colour = m_ms32_bg0_ram[tile_index *2+1] & 0x0000000f; - SET_TILE_INFO_MEMBER(2,tileno,colour,0); + SET_TILE_INFO_MEMBER(1,tileno,colour,0); } TILE_GET_INFO_MEMBER(bnstars_state::get_ms32_bg1_tile_info) @@ -225,16 +225,16 @@ TILE_GET_INFO_MEMBER(bnstars_state::get_ms32_bg1_tile_info) tileno = m_ms32_bg1_ram[tile_index *2+0] & 0x0000ffff; colour = m_ms32_bg1_ram[tile_index *2+1] & 0x0000000f; - SET_TILE_INFO_MEMBER(5,tileno,colour,0); + SET_TILE_INFO_MEMBER(4,tileno,colour,0); } -WRITE32_MEMBER(bnstars_state::ms32_bg0_ram_w) +WRITE16_MEMBER(bnstars_state::ms32_bg0_ram_w) { COMBINE_DATA(&m_ms32_bg0_ram[offset]); m_ms32_bg_tilemap[0]->mark_tile_dirty(offset/2); } -WRITE32_MEMBER(bnstars_state::ms32_bg1_ram_w) +WRITE16_MEMBER(bnstars_state::ms32_bg1_ram_w) { COMBINE_DATA(&m_ms32_bg1_ram[offset]); m_ms32_bg_tilemap[1]->mark_tile_dirty(offset/2); @@ -262,7 +262,7 @@ void bnstars_state::draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const while (y <= maxy) { - uint32_t *lineaddr = ms32_lineram + 8 * (y & 0xff); + u32 *lineaddr = ms32_lineram + 8 * (y & 0xff); int start2x = (lineaddr[0x00/4] & 0xffff) | ((lineaddr[0x04/4] & 3) << 16); int start2y = (lineaddr[0x08/4] & 0xffff) | ((lineaddr[0x0c/4] & 3) << 16); @@ -334,7 +334,7 @@ TILE_GET_INFO_MEMBER(bnstars_state::get_ms32_roz0_tile_info) tileno = m_ms32_roz0_ram[tile_index *2+0] & 0x0000ffff; colour = m_ms32_roz0_ram[tile_index *2+1] & 0x0000000f; - SET_TILE_INFO_MEMBER(1,tileno,colour,0); + SET_TILE_INFO_MEMBER(0,tileno,colour,0); } TILE_GET_INFO_MEMBER(bnstars_state::get_ms32_roz1_tile_info) @@ -344,16 +344,16 @@ TILE_GET_INFO_MEMBER(bnstars_state::get_ms32_roz1_tile_info) tileno = m_ms32_roz1_ram[tile_index *2+0] & 0x0000ffff; colour = m_ms32_roz1_ram[tile_index *2+1] & 0x0000000f; - SET_TILE_INFO_MEMBER(4,tileno,colour,0); + SET_TILE_INFO_MEMBER(3,tileno,colour,0); } -WRITE32_MEMBER(bnstars_state::ms32_roz0_ram_w) +WRITE16_MEMBER(bnstars_state::ms32_roz0_ram_w) { COMBINE_DATA(&m_ms32_roz0_ram[offset]); m_ms32_roz_tilemap[0]->mark_tile_dirty(offset/2); } -WRITE32_MEMBER(bnstars_state::ms32_roz1_ram_w) +WRITE16_MEMBER(bnstars_state::ms32_roz1_ram_w) { COMBINE_DATA(&m_ms32_roz1_ram[offset]); m_ms32_roz_tilemap[1]->mark_tile_dirty(offset/2); @@ -361,7 +361,7 @@ WRITE32_MEMBER(bnstars_state::ms32_roz1_ram_w) /* SPRITES based on tetrisp2 for now, readd priority bits later */ -void bnstars_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, uint32_t *sprram_top, size_t sprram_size) +void bnstars_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, u16 *sprram_top, size_t sprram_size) { /*************************************************************************** @@ -400,68 +400,43 @@ void bnstars_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, co ***************************************************************************/ - int tx, ty, sx, sy, flipx, flipy; - int xsize, ysize, xzoom, yzoom; - int code, attr, color, size, pri, pri_mask; - gfx_element *gfx = m_gfxdecode->gfx(0); - - uint32_t *source = sprram_top; - const uint32_t *finish = sprram_top + (sprram_size - 0x10) / 4; + u16 *source = sprram_top; + const u16 *finish = sprram_top + (sprram_size - 0x10) / 2; if (m_reverse_sprite_order == 1) { - source = sprram_top + (sprram_size - 0x10) / 4; + source = sprram_top + (sprram_size - 0x10) / 2; finish = sprram_top; } - for (;m_reverse_sprite_order ? (source>=finish) : (source=finish) : (source> 4)&0xf; - - code = source[ 1 ]; - color = source[ 2 ]; - - tx = (code >> 0) & 0xff; - ty = (code >> 8) & 0xff; - - code = (color & 0x0fff); + bool disable; + u8 pri; + bool flipx, flipy; + u32 code, color; + u8 tx, ty; + u16 xsize, ysize; + s32 sx, sy; + u16 xzoom, yzoom; + u32 pri_mask = 0; - color = (color >> 12) & 0xf; + m_sprite->extract_parameters(true, false, source, disable, pri, flipx, flipy, code, color, tx, ty, xsize, ysize, sx, sy, xzoom, yzoom); - size = source[ 3 ]; - - xsize = ((size >> 0) & 0xff) + 1; - ysize = ((size >> 8) & 0xff) + 1; - - sy = source[ 4 ]; - sx = source[ 5 ]; - - sx = (sx & 0x3ff) - (sx & 0x400); - sy = (sy & 0x1ff) - (sy & 0x200); - - xzoom = (source[ 6 ]&0xffff); - yzoom = (source[ 7 ]&0xffff); - - if (!yzoom || !xzoom) continue; - - yzoom = 0x1000000/yzoom; - xzoom = 0x1000000/xzoom; + if (disable || !xzoom || !yzoom) + continue; // there are surely also shadows (see gametngk) but how they're enabled we don't know if (m_flipscreen) { - sx = 320 - ((xsize*xzoom)>>16) - sx; - sy = 224 - ((ysize*yzoom)>>16) - sy; + int yscale = 0x1000000/yzoom; + int xscale = 0x1000000/xzoom; + + sx = 320 - ((xsize*xscale)>>16) - sx; + sy = 224 - ((ysize*yscale)>>16) - sy; flipx = !flipx; flipy = !flipy; } @@ -476,12 +451,12 @@ void bnstars_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, co else pri_mask = 0xfe; - gfx->set_source_clip(tx, xsize, ty, ysize); - gfx->prio_zoom_transpen(bitmap,cliprect, + m_sprite->prio_zoom_transpen(bitmap,cliprect, code, color, flipx, flipy, sx,sy, + tx, ty, xsize, ysize, xzoom, yzoom, screen.priority(),pri_mask, 0); } /* end sprite loop */ } @@ -507,7 +482,7 @@ void bnstars_state::video_start() -uint32_t bnstars_state::screen_update_bnstars_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 bnstars_state::screen_update_bnstars_left(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { screen.priority().fill(0, cliprect); @@ -525,12 +500,12 @@ uint32_t bnstars_state::screen_update_bnstars_left(screen_device &screen, bitmap m_ms32_tx_tilemap[0]->draw(screen, bitmap, cliprect, 0,4); - draw_sprites(screen,bitmap,cliprect, m_ms32_spram, 0x20000); + draw_sprites(screen,bitmap,cliprect, m_ms32_spram, 0x20000/2); return 0; } -uint32_t bnstars_state::screen_update_bnstars_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 bnstars_state::screen_update_bnstars_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { screen.priority().fill(0, cliprect); @@ -547,7 +522,7 @@ uint32_t bnstars_state::screen_update_bnstars_right(screen_device &screen, bitma m_ms32_tx_tilemap[1]->set_scrolly(0, m_ms32_tx1_scroll[0x0c/4] + m_ms32_tx1_scroll[0x14/4]); m_ms32_tx_tilemap[1]->draw(screen, bitmap, cliprect, 0,4); - draw_sprites(screen,bitmap,cliprect, m_ms32_spram+(0x20000/4), 0x20000); + draw_sprites(screen,bitmap,cliprect, m_ms32_spram+(0x20000/4), 0x20000/2); return 0; } @@ -698,47 +673,10 @@ static INPUT_PORTS_START( bnstars ) INPUT_PORTS_END -/* sprites are contained in 256x256 "tiles" */ -static const uint32_t sprite_xoffset[256] = -{ - STEP8(8*8*8*0, 8), STEP8(8*8*8*1, 8), STEP8(8*8*8*2, 8), STEP8(8*8*8*3, 8), - STEP8(8*8*8*4, 8), STEP8(8*8*8*5, 8), STEP8(8*8*8*6, 8), STEP8(8*8*8*7, 8), - STEP8(8*8*8*8, 8), STEP8(8*8*8*9, 8), STEP8(8*8*8*10, 8), STEP8(8*8*8*11, 8), - STEP8(8*8*8*12, 8), STEP8(8*8*8*13, 8), STEP8(8*8*8*14, 8), STEP8(8*8*8*15, 8), - STEP8(8*8*8*16, 8), STEP8(8*8*8*17, 8), STEP8(8*8*8*18, 8), STEP8(8*8*8*19, 8), - STEP8(8*8*8*20, 8), STEP8(8*8*8*21, 8), STEP8(8*8*8*22, 8), STEP8(8*8*8*23, 8), - STEP8(8*8*8*24, 8), STEP8(8*8*8*25, 8), STEP8(8*8*8*26, 8), STEP8(8*8*8*27, 8), - STEP8(8*8*8*28, 8), STEP8(8*8*8*29, 8), STEP8(8*8*8*30, 8), STEP8(8*8*8*31, 8) -}; -static const uint32_t sprite_yoffset[256] = -{ - STEP8(8*8*8*0, 8*8), STEP8(8*8*8*32, 8*8), STEP8(8*8*8*64, 8*8), STEP8(8*8*8*96, 8*8), - STEP8(8*8*8*128,8*8), STEP8(8*8*8*160,8*8), STEP8(8*8*8*192,8*8), STEP8(8*8*8*224,8*8), - STEP8(8*8*8*256,8*8), STEP8(8*8*8*288,8*8), STEP8(8*8*8*320,8*8), STEP8(8*8*8*352,8*8), - STEP8(8*8*8*384,8*8), STEP8(8*8*8*416,8*8), STEP8(8*8*8*448,8*8), STEP8(8*8*8*480,8*8), - STEP8(8*8*8*512,8*8), STEP8(8*8*8*544,8*8), STEP8(8*8*8*576,8*8), STEP8(8*8*8*608,8*8), - STEP8(8*8*8*640,8*8), STEP8(8*8*8*672,8*8), STEP8(8*8*8*704,8*8), STEP8(8*8*8*736,8*8), - STEP8(8*8*8*768,8*8), STEP8(8*8*8*800,8*8), STEP8(8*8*8*832,8*8), STEP8(8*8*8*864,8*8), - STEP8(8*8*8*896,8*8), STEP8(8*8*8*928,8*8), STEP8(8*8*8*960,8*8), STEP8(8*8*8*992,8*8) -}; -static const gfx_layout spritelayout = -{ - 256, 256, - RGN_FRAC(1,1), - 8, - { STEP8(0,1) }, - EXTENDED_XOFFS, - EXTENDED_YOFFS, - 256*256*8, - sprite_xoffset, - sprite_yoffset -}; - static GFXLAYOUT_RAW( bglayout, 16, 16, 16*8, 16*16*8 ) static GFXLAYOUT_RAW( txlayout, 8, 8, 8*8, 8*8*8 ) static GFXDECODE_START( gfx_bnstars ) - GFXDECODE_ENTRY( "gfx1", 0, spritelayout, 0x0000, 0x10 ) GFXDECODE_ENTRY( "gfx2", 0, bglayout, 0x5000, 0x10 ) /* Roz scr1 */ GFXDECODE_ENTRY( "gfx4", 0, bglayout, 0x1000, 0x10 ) /* Bg scr1 */ GFXDECODE_ENTRY( "gfx5", 0, txlayout, 0x6000, 0x10 ) /* Tx scr1 */ @@ -814,13 +752,21 @@ void bnstars_state::bnstars_map(address_map &map) map(0xfd080000, 0xfd087fff).ram(); map(0xfd200000, 0xfd237fff).rw("palette2", FUNC(palette_device::read16), FUNC(palette_device::write16)).umask32(0x0000ffff).share("palette2"); map(0xfd400000, 0xfd437fff).rw(m_palette, FUNC(palette_device::read16), FUNC(palette_device::write16)).umask32(0x0000ffff).share("palette"); - map(0xfe000000, 0xfe01ffff).ram().w(FUNC(bnstars_state::ms32_roz1_ram_w)).share("roz1_ram"); - map(0xfe400000, 0xfe41ffff).ram().w(FUNC(bnstars_state::ms32_roz0_ram_w)).share("roz0_ram"); - map(0xfe800000, 0xfe83ffff).ram().share("spram"); - map(0xfea00000, 0xfea07fff).ram().w(FUNC(bnstars_state::ms32_tx1_ram_w)).share("tx1_ram"); - map(0xfea08000, 0xfea0ffff).ram().w(FUNC(bnstars_state::ms32_bg1_ram_w)).share("bg1_ram"); - map(0xfec00000, 0xfec07fff).ram().w(FUNC(bnstars_state::ms32_tx0_ram_w)).share("tx0_ram"); - map(0xfec08000, 0xfec0ffff).ram().w(FUNC(bnstars_state::ms32_bg0_ram_w)).share("bg0_ram"); + map(0xfe000000, 0xfe01ffff).lr16( + NAME([this] (offs_t offset) -> u16 { return m_ms32_roz1_ram[offset]; })).w(FUNC(bnstars_state::ms32_roz1_ram_w)).umask32(0x0000ffff).share("roz1_ram"); + map(0xfe400000, 0xfe41ffff).lr16( + NAME([this] (offs_t offset) -> u16 { return m_ms32_roz0_ram[offset]; })).w(FUNC(bnstars_state::ms32_roz0_ram_w)).umask32(0x0000ffff).share("roz0_ram"); + map(0xfe800000, 0xfe83ffff).lrw16( + NAME([this] (offs_t offset) -> u16 { return m_ms32_spram[offset]; }), + NAME([this] (offs_t offset, u16 data, u16 mem_mask) { COMBINE_DATA(&m_ms32_spram[offset]); })).umask32(0x0000ffff).share("spram"); + map(0xfea00000, 0xfea07fff).lr16( + NAME([this] (offs_t offset) -> u16 { return m_ms32_tx1_ram[offset]; })).w(FUNC(bnstars_state::ms32_tx1_ram_w)).umask32(0x0000ffff).share("tx1_ram"); + map(0xfea08000, 0xfea0ffff).lr16( + NAME([this] (offs_t offset) -> u16 { return m_ms32_bg1_ram[offset]; })).w(FUNC(bnstars_state::ms32_bg1_ram_w)).umask32(0x0000ffff).share("bg1_ram"); + map(0xfec00000, 0xfec07fff).lr16( + NAME([this] (offs_t offset) -> u16 { return m_ms32_tx0_ram[offset]; })).w(FUNC(bnstars_state::ms32_tx0_ram_w)).umask32(0x0000ffff).share("tx0_ram"); + map(0xfec08000, 0xfec0ffff).lr16( + NAME([this] (offs_t offset) -> u16 { return m_ms32_bg0_ram[offset]; })).w(FUNC(bnstars_state::ms32_bg0_ram_w)).umask32(0x0000ffff).share("bg0_ram"); map(0xfee00000, 0xfee1ffff).ram(); map(0xffe00000, 0xffffffff).rom().region("maincpu", 0); @@ -844,13 +790,14 @@ void bnstars_state::bnstars_sound_map(address_map &map) void bnstars_state::bnstars(machine_config &config) { /* basic machine hardware */ - V70(config, m_maincpu, 40_MHz_XTAL/2); // 20MHz (40MHz / 2) + + V70(config, m_maincpu, XTAL(40'000'000)/2); // 20MHz (40MHz / 2) m_maincpu->set_addrmap(AS_PROGRAM, &bnstars_state::bnstars_map); m_maincpu->set_irq_acknowledge_callback(FUNC(ms32_state::irq_callback)); TIMER(config, "scantimer").configure_scanline(FUNC(bnstars_state::ms32_interrupt), "lscreen", 0, 1); - Z80(config, m_audiocpu, 8_MHz_XTAL); // presented on sound PCB, Verified + Z80(config, m_audiocpu, XTAL(8'000'000)); // 8MHz presented on sound PCB, Verified m_audiocpu->set_addrmap(AS_PROGRAM, &bnstars_state::bnstars_sound_map); config.set_maximum_quantum(attotime::from_hz(60000)); @@ -865,6 +812,11 @@ void bnstars_state::bnstars(machine_config &config) palette2.set_format(palette_device::xBRG_888, 0x8000); palette2.set_membits(16); + JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, XTAL(48'000'000)); // 48MHz for video? + m_sprite->set_palette(m_palette); + m_sprite->set_color_base(0); + m_sprite->set_color_entries(16); + config.set_default_layout(layout_dualhsxs); screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER)); @@ -883,7 +835,6 @@ void bnstars_state::bnstars(machine_config &config) rscreen.set_screen_update(FUNC(bnstars_state::screen_update_bnstars_right)); rscreen.set_palette("palette2"); - /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); @@ -891,13 +842,13 @@ void bnstars_state::bnstars(machine_config &config) GENERIC_LATCH_8(config, m_soundlatch); m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); - ymf271_device &ymf1(YMF271(config, "ymf1", 16.9344_MHz_XTAL)); + ymf271_device &ymf1(YMF271(config, "ymf1", XTAL(16'934'400))); // 16.9344MHz ymf1.add_route(0, "lspeaker", 1.0); ymf1.add_route(1, "rspeaker", 1.0); // ymf1.add_route(2, "lspeaker", 1.0); Output 2/3 not used? // ymf1.add_route(3, "rspeaker", 1.0); - ymf271_device &ymf2(YMF271(config, "ymf2", 16.9344_MHz_XTAL)); + ymf271_device &ymf2(YMF271(config, "ymf2", XTAL(16'934'400))); // 16.9344MHz ymf2.add_route(0, "lspeaker", 1.0); ymf2.add_route(1, "rspeaker", 1.0); // ymf2.add_route(2, "lspeaker", 1.0); Output 2/3 not used? @@ -913,7 +864,7 @@ ROM_START( bnstars1 ) ROM_LOAD32_BYTE( "mb-93142.39", 0x000000, 0x80000, CRC(56b98539) SHA1(5eb0e77729b31e6a100c1b43813a39fea57bedee) ) /* Sprites - shared by both screens? */ - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x1000000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr96004-01.20", 0x0000000, 0x200000, CRC(3366d104) SHA1(2de0cabe2ead777b5b02cade7f2003ef7f90b75b) ) ROM_LOAD32_WORD( "mr96004-02.28", 0x0000002, 0x200000, CRC(ad556664) SHA1(4b36f8d8d9efa37cf515af41d14433e7eafa27a2) ) ROM_LOAD32_WORD( "mr96004-03.21", 0x0400000, 0x200000, CRC(b399e2b1) SHA1(9b6a00a219db8d66dcf592160b7b5f7a86b8f0c9) ) diff --git a/src/mame/drivers/ms32.cpp b/src/mame/drivers/ms32.cpp index ae6d5d73d09..95b3c3a3b5a 100644 --- a/src/mame/drivers/ms32.cpp +++ b/src/mame/drivers/ms32.cpp @@ -481,7 +481,7 @@ Notes from Charles MacDonald CUSTOM_INPUT_MEMBER(ms32_state::mahjong_ctrl_r) { - uint32_t mj_input; + u32 mj_input; switch (m_mahjong_input_select[0]) { @@ -1562,42 +1562,6 @@ INPUT_PORTS_END /********** GFX DECODE **********/ -/* sprites are contained in 256x256 "tiles" */ -static const uint32_t sprite_xoffset[256] = -{ - STEP8(8*8*8*0, 8), STEP8(8*8*8*1, 8), STEP8(8*8*8*2, 8), STEP8(8*8*8*3, 8), - STEP8(8*8*8*4, 8), STEP8(8*8*8*5, 8), STEP8(8*8*8*6, 8), STEP8(8*8*8*7, 8), - STEP8(8*8*8*8, 8), STEP8(8*8*8*9, 8), STEP8(8*8*8*10, 8), STEP8(8*8*8*11, 8), - STEP8(8*8*8*12, 8), STEP8(8*8*8*13, 8), STEP8(8*8*8*14, 8), STEP8(8*8*8*15, 8), - STEP8(8*8*8*16, 8), STEP8(8*8*8*17, 8), STEP8(8*8*8*18, 8), STEP8(8*8*8*19, 8), - STEP8(8*8*8*20, 8), STEP8(8*8*8*21, 8), STEP8(8*8*8*22, 8), STEP8(8*8*8*23, 8), - STEP8(8*8*8*24, 8), STEP8(8*8*8*25, 8), STEP8(8*8*8*26, 8), STEP8(8*8*8*27, 8), - STEP8(8*8*8*28, 8), STEP8(8*8*8*29, 8), STEP8(8*8*8*30, 8), STEP8(8*8*8*31, 8) -}; -static const uint32_t sprite_yoffset[256] = -{ - STEP8(8*8*8*0, 8*8), STEP8(8*8*8*32, 8*8), STEP8(8*8*8*64, 8*8), STEP8(8*8*8*96, 8*8), - STEP8(8*8*8*128,8*8), STEP8(8*8*8*160,8*8), STEP8(8*8*8*192,8*8), STEP8(8*8*8*224,8*8), - STEP8(8*8*8*256,8*8), STEP8(8*8*8*288,8*8), STEP8(8*8*8*320,8*8), STEP8(8*8*8*352,8*8), - STEP8(8*8*8*384,8*8), STEP8(8*8*8*416,8*8), STEP8(8*8*8*448,8*8), STEP8(8*8*8*480,8*8), - STEP8(8*8*8*512,8*8), STEP8(8*8*8*544,8*8), STEP8(8*8*8*576,8*8), STEP8(8*8*8*608,8*8), - STEP8(8*8*8*640,8*8), STEP8(8*8*8*672,8*8), STEP8(8*8*8*704,8*8), STEP8(8*8*8*736,8*8), - STEP8(8*8*8*768,8*8), STEP8(8*8*8*800,8*8), STEP8(8*8*8*832,8*8), STEP8(8*8*8*864,8*8), - STEP8(8*8*8*896,8*8), STEP8(8*8*8*928,8*8), STEP8(8*8*8*960,8*8), STEP8(8*8*8*992,8*8) -}; -static const gfx_layout spritelayout = -{ - 256, 256, - RGN_FRAC(1,1), - 8, - { STEP8(0,1) }, - EXTENDED_XOFFS, - EXTENDED_YOFFS, - 256*256*8, - sprite_xoffset, - sprite_yoffset -}; - static GFXLAYOUT_RAW( bglayout, 16, 16, 16*8, 16*16*8 ) static GFXLAYOUT_RAW( txlayout, 8, 8, 8*8, 8*8*8 ) @@ -1605,14 +1569,12 @@ static GFXLAYOUT_RAW( f1layout, 2048, 1, 2048*8, 2048*8 ) static GFXDECODE_START( gfx_ms32 ) - GFXDECODE_ENTRY( "gfx1", 0, spritelayout, 0x0000, 0x10 ) GFXDECODE_ENTRY( "gfx2", 0, bglayout, 0x2000, 0x10 ) GFXDECODE_ENTRY( "gfx3", 0, bglayout, 0x1000, 0x10 ) GFXDECODE_ENTRY( "gfx4", 0, txlayout, 0x6000, 0x10 ) GFXDECODE_END static GFXDECODE_START( gfx_f1superb ) - GFXDECODE_ENTRY( "gfx1", 0, spritelayout, 0x0000, 0x10 ) GFXDECODE_ENTRY( "gfx2", 0, bglayout, 0x2000, 0x10 ) GFXDECODE_ENTRY( "gfx3", 0, bglayout, 0x1000, 0x10 ) GFXDECODE_ENTRY( "gfx4", 0, txlayout, 0x6000, 0x10 ) @@ -1741,18 +1703,17 @@ void ms32_state::machine_reset() void ms32_state::ms32(machine_config &config) { /* basic machine hardware */ - V70(config, m_maincpu, 20000000); // D70632GD-20 20MHz + V70(config, m_maincpu, XTAL(40'000'000)/2); // D70632GD-20 20MHz (40MHz / 2) m_maincpu->set_addrmap(AS_PROGRAM, &ms32_state::ms32_map); m_maincpu->set_irq_acknowledge_callback(FUNC(ms32_state::irq_callback)); TIMER(config, "scantimer").configure_scanline(FUNC(ms32_state::ms32_interrupt), "screen", 0, 1); - Z80(config, m_audiocpu, 8000000); // Z0840008PSC, Clock from notes + Z80(config, m_audiocpu, 8000000); // Z0840008PSC, Clock from notes (40MHz / 5 or 48MHz / 6?) m_audiocpu->set_addrmap(AS_PROGRAM, &ms32_state::ms32_sound_map); config.set_maximum_quantum(attotime::from_hz(60000)); - /* video hardware */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_refresh_hz(60); @@ -1760,10 +1721,15 @@ void ms32_state::ms32(machine_config &config) m_screen->set_size(40*8, 28*8); m_screen->set_visarea(0*8, 40*8-1, 0*8, 28*8-1); m_screen->set_screen_update(FUNC(ms32_state::screen_update_ms32)); + m_screen->screen_vblank().set(FUNC(ms32_state::screen_vblank_ms32)); GFXDECODE(config, m_gfxdecode, m_palette, gfx_ms32); PALETTE(config, m_palette).set_entries(0x10000); + JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, XTAL(48'000'000)); // 48MHz for video? + m_sprite->set_palette(m_palette); + m_sprite->set_color_base(0); + m_sprite->set_color_entries(16); /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); @@ -1772,7 +1738,7 @@ void ms32_state::ms32(machine_config &config) GENERIC_LATCH_8(config, m_soundlatch); m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI); - ymf271_device &ymf(YMF271(config, "ymf", 16934400)); + ymf271_device &ymf(YMF271(config, "ymf", XTAL(16'934'400))); // 16.9344MHz ymf.add_route(0, "lspeaker", 1.0); ymf.add_route(1, "rspeaker", 1.0); // ymf.add_route(2, "lspeaker", 1.0); Output 2/3 not used? @@ -1801,7 +1767,7 @@ ROM_START( bbbxing ) ROM_LOAD32_BYTE( "mb93138a_29_ver1.3.29", 0x000001, 0x80000, CRC(85bbbe79) SHA1(bc5ebb96491762e6a0d202ddf7faeb57c66211b4) ) ROM_LOAD32_BYTE( "mb93138a_31_ver1.3.31", 0x000000, 0x80000, CRC(e0c865ed) SHA1(f21e8dc174c50d7afdd3f82c1c66dfcc002bdd07) ) - ROM_REGION( 0x1100000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x1100000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr92042-07.1", 0x0000002, 0x200000, CRC(c1c10c3b) SHA1(e1f739f38e148c4d7aff6b81b3e42131c5c6c3dd) ) ROM_LOAD32_WORD( "mr92042-06.13", 0x0000000, 0x200000, CRC(4b8c1574) SHA1(c389c70b532d54528a175f460ca3f329b34cf67c) ) ROM_LOAD32_WORD( "mr92042-09.2", 0x0400002, 0x200000, CRC(03b77c1e) SHA1(f156ae6a4f2a8ae99815eb5a7b28425d273c1c3e) ) @@ -1840,7 +1806,7 @@ ROM_START( suchie2 ) ROM_LOAD32_BYTE( "mb-93166-28_ver1.1.28", 0x000001, 0x80000, CRC(aa49eec2) SHA1(173afc596caa1c464fc3247cb64d36c1d97a1520) ) ROM_LOAD32_BYTE( "mb-93166-29_ver1.1.29", 0x000000, 0x80000, CRC(92763e41) SHA1(eb593bbb586661c4c4e8728d845b146974d0bdf8) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x1000000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mb94019-02.1", 0x000002, 0x200000, CRC(f9d692f2) SHA1(666df55d26e00be39073173fa3616ac9dafbe615) ) ROM_LOAD32_WORD( "mb94019-01.13", 0x000000, 0x200000, CRC(1ddfe825) SHA1(27fbf492fdb4f0b4b8db18330e840c130213e15e) ) ROM_LOAD32_WORD( "mb94019-04.2", 0x400002, 0x200000, CRC(24ca77ec) SHA1(a5c575224ab276cbed5785f40fc0d35dd2748e74) ) @@ -1877,7 +1843,7 @@ ROM_START( suchie2o ) ROM_LOAD32_BYTE( "mb-93166-28_ver1.0.28", 0x000001, 0x80000, CRC(b1261d51) SHA1(3f393aeb7a076c4d2d2cc7f22ead05f405186d80) ) ROM_LOAD32_BYTE( "mb-93166-29_ver1.0.29", 0x000000, 0x80000, CRC(9211c82a) SHA1(0aa3f93293b81e0f66b985046eb5e91708693959) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x1000000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mb94019-02.1", 0x000002, 0x200000, CRC(f9d692f2) SHA1(666df55d26e00be39073173fa3616ac9dafbe615) ) ROM_LOAD32_WORD( "mb94019-01.13", 0x000000, 0x200000, CRC(1ddfe825) SHA1(27fbf492fdb4f0b4b8db18330e840c130213e15e) ) ROM_LOAD32_WORD( "mb94019-04.2", 0x400002, 0x200000, CRC(24ca77ec) SHA1(a5c575224ab276cbed5785f40fc0d35dd2748e74) ) @@ -1914,7 +1880,7 @@ ROM_START( desertwr ) ROM_LOAD32_BYTE( "mb93166_ver1.0-28.28", 0x000001, 0x80000, CRC(0de40efb) SHA1(c49c3b27939e428dec1f642b7fdb9a1ff760289a) ) ROM_LOAD32_BYTE( "mb93166_ver1.0-29.29", 0x000000, 0x80000, CRC(fc25eae2) SHA1(a4d47fcb4d4c3285cf67d77d8a21478f344b98ca) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x1000000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mb94038-01.13", 0x000000, 0x200000, CRC(f11f83e2) SHA1(e3c99e6583003210483163c79182cb14aa334702) ) ROM_LOAD32_WORD( "mb94038-02.1", 0x000002, 0x200000, CRC(3d1fa710) SHA1(5fae3e8c714cca88e22e432dd7275c6898c631a8) ) ROM_LOAD32_WORD( "mb94038-03.14", 0x400000, 0x200000, CRC(84fd5790) SHA1(6187ff32a63f3b4105ea875f52237f0d4314f8b6) ) @@ -1953,7 +1919,7 @@ ROM_START( f1superb ) ROM_LOAD32_BYTE( "f1sb28.bin", 0x000001, 0x80000, CRC(cfda8003) SHA1(460146556f606bf213d7e2ab29d2eb8827131bd0) ) ROM_LOAD32_BYTE( "f1sb29.bin", 0x000000, 0x80000, CRC(f21f1481) SHA1(97a97ff3b9a71b1a024d8f2cfe57a1d02cec5ea4) ) - ROM_REGION( 0x2000000, "gfx1", 0 ) /* 8x8 not all? */ + ROM_REGION( 0x2000000, "sprite", 0 ) /* 8x8 not all? */ ROM_LOAD32_WORD( "f1sb1.bin", 0x0000002, 0x200000, CRC(53a3a97b) SHA1(c8cd501ae10d9eb48a02e4e59a1ce389a27afc44) ) ROM_LOAD32_WORD( "f1sb13.bin", 0x0000000, 0x200000, CRC(36565a99) SHA1(db08ff3107dcc07ca31140715d7d4b7bd27fa4c5) ) ROM_LOAD32_WORD( "f1sb2.bin", 0x0400002, 0x200000, CRC(a452f50a) SHA1(3782a37203b652ea5df5b04dc74a0fdace7b14cc) ) @@ -2007,7 +1973,7 @@ ROM_START( gratia ) ROM_LOAD32_BYTE( "94019_28_ver1.0.28", 0x000001, 0x80000, CRC(e0762e89) SHA1(a567c347e7f73f1ef1c753d14ac4f58311380fac) ) /* Labeled 94019 (28)Ver1,0 with the Kanji verson of the game name before "(28)" */ ROM_LOAD32_BYTE( "94019_29_ver1.0.29", 0x000000, 0x80000, CRC(8059800b) SHA1(7548d01b6ea15e962353b3585db6515e5819e5ce) ) /* Labeled 94019 (29)Ver1,0 with the Kanji verson of the game name before "(29)" */ - ROM_REGION( 0x0c00000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x0c00000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr94019-01.13", 0x000000, 0x200000, CRC(92d8ae9b) SHA1(02b36e6e14b28a9830e07fd328772dbb20b76889) ) ROM_LOAD32_WORD( "mr94019-02.1", 0x000002, 0x200000, CRC(f7bd9cc4) SHA1(5658bfb4081439ab06c6ade2531581aa60d1c6be) ) ROM_LOAD32_WORD( "mr94019-03.14", 0x400000, 0x200000, CRC(62a69590) SHA1(d95cc1e1ec85161ee6cd1ae77b405cf8ef81217a) ) @@ -2043,7 +2009,7 @@ ROM_START( gratiaa ) ROM_LOAD32_BYTE( "94019_28_ver1.0.28", 0x000001, 0x80000, CRC(e0762e89) SHA1(a567c347e7f73f1ef1c753d14ac4f58311380fac) ) /* Labeled 94019 (28)Ver1,0 with the Kanji verson of the game name before "(28)" */ ROM_LOAD32_BYTE( "94019_29_ver1.0.29", 0x000000, 0x80000, CRC(8059800b) SHA1(7548d01b6ea15e962353b3585db6515e5819e5ce) ) /* Labeled 94019 (29)Ver1,0 with the Kanji verson of the game name before "(29)" */ - ROM_REGION( 0x0c00000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x0c00000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr94019-01.13", 0x000000, 0x200000, CRC(92d8ae9b) SHA1(02b36e6e14b28a9830e07fd328772dbb20b76889) ) ROM_LOAD32_WORD( "mr94019-02.1", 0x000002, 0x200000, CRC(f7bd9cc4) SHA1(5658bfb4081439ab06c6ade2531581aa60d1c6be) ) ROM_LOAD32_WORD( "mr94019-03.14", 0x400000, 0x200000, CRC(62a69590) SHA1(d95cc1e1ec85161ee6cd1ae77b405cf8ef81217a) ) @@ -2079,7 +2045,7 @@ ROM_START( gametngk ) ROM_LOAD32_BYTE( "mb94166_ver1.0-28.28", 0x000001, 0x80000, CRC(b3738934) SHA1(cd07572e55e83807e76179cfc6b97e0410067911) ) ROM_LOAD32_BYTE( "mb94166_ver1.0-29.29", 0x000000, 0x80000, CRC(45154a45) SHA1(4c7c2c6738fdfe54ebe41a0ac6222cbfce5d7757) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x1000000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr94041-01.13", 0x0000000, 0x200000, CRC(3f99adf7) SHA1(cbb8d2fc253b0c58e7eb9286c66e6b36daf9d4af) ) ROM_LOAD32_WORD( "mr94041-02.1", 0x0000002, 0x200000, CRC(c3c5ae69) SHA1(5ed7f57a7139f87c680c68e44ea4022b917a9381) ) ROM_LOAD32_WORD( "mr94041-03.14", 0x0400000, 0x200000, CRC(d858b6de) SHA1(a06cf529c9508c8c8508894e2e004373edd9debf) ) @@ -2118,7 +2084,7 @@ ROM_START( hayaosi2 ) ROM_LOAD32_BYTE( "mb93138a.29", 0x000001, 0x80000, CRC(e6fe3d0d) SHA1(9a0caab82b160991b4f2ac993e7e4b4c5d3bb15e) ) ROM_LOAD32_BYTE( "mb93138a.31", 0x000000, 0x80000, CRC(d944bf8c) SHA1(ce93b5d2ebe886b38dc42b1e554b17dc951a51b4) ) - ROM_REGION( 0x900000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x900000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr93038.04", 0x000000, 0x200000, CRC(ab5edb11) SHA1(b7742aefbce9efc512c3526714b6f20a6c03af60) ) ROM_LOAD32_WORD( "mr93038.05", 0x000002, 0x200000, CRC(274522f1) SHA1(717435d6bf1b2a2220a2f0a53b070bb81cc2ed2b) ) ROM_LOAD32_WORD( "mr93038.06", 0x400000, 0x200000, CRC(f9961ebf) SHA1(e91b160cb5a76e3f6044cc71681dadf2fbff7e8b) ) @@ -2220,7 +2186,7 @@ ROM_START( hayaosi3 ) ROM_LOAD32_BYTE( "mb93138_29_ver1.5.29", 0x000001, 0x80000, CRC(da891976) SHA1(27e8c395e92ca01b47bffdf766bc95a6c2150815) ) ROM_LOAD32_BYTE( "mb93138_31_ver1.5.31", 0x000000, 0x80000, CRC(2d17bb06) SHA1(623b603c4002734427c882424a1e0dc889cf7e02) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x1000000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr94027.01", 0x000000, 0x200000, CRC(c72e5c6e) SHA1(b98cd656c48c775953d00b5d8bafd4ffde76d8df) ) ROM_LOAD32_WORD( "mr94027.02", 0x000002, 0x200000, CRC(59976568) SHA1(a280c352d612913834c76b8e23d86c937fd21281) ) ROM_LOAD32_WORD( "mr94027.03", 0x400000, 0x200000, CRC(3ff68f4f) SHA1(1e367b92560c32c87e27fc0e99be3bdb5eb0510b) ) @@ -2257,7 +2223,7 @@ ROM_START( hayaosi3a ) ROM_LOAD32_BYTE( "mb93138_29_ver1.2.29", 0x000001, 0x80000, CRC(8999b41b) SHA1(95b94112105bfa2b708bad44bbbdc33616ad2182) ) ROM_LOAD32_BYTE( "mb93138_31_ver1.2.31", 0x000000, 0x80000, CRC(f5d4ef54) SHA1(ed208cb6ed171acac312cb282b2fabc8af70610e) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x1000000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr94027.01", 0x000000, 0x200000, CRC(c72e5c6e) SHA1(b98cd656c48c775953d00b5d8bafd4ffde76d8df) ) ROM_LOAD32_WORD( "mr94027.02", 0x000002, 0x200000, CRC(59976568) SHA1(a280c352d612913834c76b8e23d86c937fd21281) ) ROM_LOAD32_WORD( "mr94027.03", 0x400000, 0x200000, CRC(3ff68f4f) SHA1(1e367b92560c32c87e27fc0e99be3bdb5eb0510b) ) @@ -2294,7 +2260,7 @@ ROM_START( kirarast ) ROM_LOAD32_BYTE( "mr95025.28", 0x000001, 0x80000, CRC(6df8c384) SHA1(3ad01d3d51cfc1f48029c16ee1cc74fc59d7603c) ) ROM_LOAD32_BYTE( "mr95025.29", 0x000000, 0x80000, CRC(3b6e681b) SHA1(148fa10631db53a4ad1dcdfb60b4f0654e077396) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x1000000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr95025.01", 0x000000, 0x200000, CRC(02279069) SHA1(fb3ce00701271d0163f72e4f2e56faa9f16d8fd0) ) ROM_LOAD32_WORD( "mr95025.02", 0x000002, 0x200000, CRC(885161d4) SHA1(1bc82de0b2759758d437db3ef9f0f7805f759b59) ) ROM_LOAD32_WORD( "mr95025.03", 0x400000, 0x200000, CRC(1ae06df9) SHA1(e1493a386fd8c54c88afab43d13d73869ae467ee) ) @@ -2332,7 +2298,7 @@ ROM_START( akiss ) ROM_LOAD32_BYTE( "mb93166_ver1.0-28.28", 0x000001, 0x80000, CRC(20565478) SHA1(d532ab55be287f45d8d81317bb844c675eb1292c) ) ROM_LOAD32_BYTE( "mb93166_ver1.0-29.29", 0x000000, 0x80000, CRC(ff454f0d) SHA1(db81aaaf4160eb62badbe08fc01543463470ac97) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x1000000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mb95008-01.13", 0x000000, 0x200000, CRC(1be66420) SHA1(9fc85e6108f230418e012ad05586010235139039) ) ROM_LOAD32_WORD( "mb95008-02.1", 0x000002, 0x200000, CRC(1cc4808e) SHA1(70a19d66b4f187320c67760bc453b6afb7d66f9a) ) ROM_LOAD32_WORD( "mb95008-03.14", 0x400000, 0x200000, CRC(4045f0dc) SHA1(5ba9786618ecad9410dbdf3664f9dda848a754f7) ) @@ -2369,7 +2335,7 @@ ROM_START( p47aces ) ROM_LOAD32_BYTE( "p47-28.28", 0x000001, 0x80000, CRC(4742a5f7) SHA1(cd297aa150082c545647c9a755cf2cdbdc98c988) ) /* Need to verify - might be: P-47 ACES 3/31 ROM 28 Ver1.1 */ ROM_LOAD32_BYTE( "p47-29.29", 0x000000, 0x80000, CRC(86e17d8b) SHA1(73004f243c6dfb86ce4cc61475dc7caaf452750e) ) /* Need to verify - might be: P-47 ACES 3/31 ROM 29 Ver1.1 */ - ROM_REGION( 0xe00000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0xe00000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr94020-02.1", 0x000002, 0x200000, CRC(28732d3c) SHA1(15b2687bcad31793fc7d6a9dc3eccb7ad9b5f659) ) ROM_LOAD32_WORD( "mr94020-01.13", 0x000000, 0x200000, CRC(a6ccf999) SHA1(5d32fb6f6987ede6c125bec9581da4695ad64dff) ) ROM_LOAD32_WORD( "mr94020-04.2", 0x400002, 0x200000, CRC(128db576) SHA1(f6561f54f6b95842a5f14d29682449bf0d837a85) ) @@ -2408,7 +2374,7 @@ ROM_START( tetrisp ) ROM_LOAD32_BYTE( "mb93166_ver1.0-28.28", 0x000001, 0x80000, CRC(87522e16) SHA1(4f0d8abec046884d89c559e3a4a5ac9e0e47a0dc) ) ROM_LOAD32_BYTE( "mb93166_ver1.0-29.29", 0x000000, 0x80000, CRC(43a61941) SHA1(a097c88c45d8486eb6ffdd13904b6eb2a3fa45b9) ) - ROM_REGION( 0x400000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x400000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr95024-01.01", 0x000002, 0x200000, CRC(cb0e92b9) SHA1(179cc9e2d819d7f6238e924184e8a383d172aa72) ) ROM_LOAD32_WORD( "mr95024-02.13", 0x000000, 0x200000, CRC(4a825990) SHA1(f99ba9f88f5582259ba0e50480451d4e9d1d03b7) ) @@ -2439,7 +2405,7 @@ ROM_START( tp2m32 ) ROM_LOAD32_BYTE( "mp2_28.ver1.0.28", 0x000001, 0x80000, CRC(041aac23) SHA1(3f7863ffa897978493e98445fe020dccbe521752) ) /* labeled M P2 28 Ver1.0 - game name in Kanji between M and P2 */ ROM_LOAD32_BYTE( "mp2_29.ver1.0.29", 0x000000, 0x80000, CRC(4e83b2ca) SHA1(2766793f050a6952f4f53a763686f95bd7544f3f) ) /* labeled M P2 29 Ver1.0 - game name in Kanji between M and P2 */ - ROM_REGION( 0x800000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x800000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr96019-01.13", 0x000000, 0x400000, CRC(06f7dc64) SHA1(722c51b707b9854c0293afdff18b27ec7cae6719) ) ROM_LOAD32_WORD( "mr96019-02.1", 0x000002, 0x400000, CRC(3e613bed) SHA1(038b5e43fa3d69654107c8093126eeb2e8fa4ddc) ) @@ -2471,7 +2437,7 @@ ROM_START( bnstars ) /* ver 1.1 */ ROM_LOAD32_BYTE( "vsjanshi_28_ver1.1.28", 0x000001, 0x80000, CRC(d075cfb6) SHA1(f70741e9f536d5c7604126d36c7aa8ed8f25c329) ) ROM_LOAD32_BYTE( "vsjanshi_29_ver1.1.29", 0x000000, 0x80000, CRC(bc395b50) SHA1(84d7cc492a11a5a9402e929f0bd138ad63e3d079) ) - ROM_REGION( 0x1000000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x1000000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr96004-01.13", 0x000000, 0x200000, CRC(3366d104) SHA1(2de0cabe2ead777b5b02cade7f2003ef7f90b75b) ) ROM_LOAD32_WORD( "mr96004-02.1", 0x000002, 0x200000, CRC(ad556664) SHA1(4b36f8d8d9efa37cf515af41d14433e7eafa27a2) ) ROM_LOAD32_WORD( "mr96004-03.14", 0x400000, 0x200000, CRC(b399e2b1) SHA1(9b6a00a219db8d66dcf592160b7b5f7a86b8f0c9) ) @@ -2545,7 +2511,7 @@ ROM_START( wpksocv2 ) ROM_LOAD32_BYTE( "pk_soccer_v2_rom_29_ver._1.1.29", 0x000001, 0x80000, CRC(22acd835) SHA1(0fa96a6dfde737d541842f85dc257776044e15b5) ) ROM_LOAD32_BYTE( "pk_soccer_v2_rom_31_ver._1.1.31", 0x000000, 0x80000, CRC(f25e50f5) SHA1(b58722f11a8b94ef053caf531ac94a959350288a) ) - ROM_REGION( 0xc00000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0xc00000, "sprite", 0 ) /* sprites */ ROM_LOAD32_WORD( "mr95033-01.13", 0x000000, 0x200000, CRC(1f76ed57) SHA1(af9076b4b4c26b362825d892f46d2c04b4bb9d07) ) ROM_LOAD32_WORD( "mr95033-02.1", 0x000002, 0x200000, CRC(5b119910) SHA1(aff44e355227dd159e388ab85a5b6d48644ff421) ) ROM_LOAD32_WORD( "mr95033-03.14", 0x400000, 0x200000, CRC(8b6099ed) SHA1(c514cec1491aed00a5714c0b8d17c96e87ba50aa) ) @@ -2584,7 +2550,7 @@ void ms32_state::configure_banks() void ms32_state::init_ms32_common() { - m_nvram_8 = std::make_unique(0x2000); + m_nvram_8 = std::make_unique(0x2000); configure_banks(); } @@ -2633,7 +2599,7 @@ void ms32_state::init_suchie2() void ms32_state::init_f1superb() { #if 0 // we shouldn't need this hack, something else is wrong, and the x offsets are never copied either, v70 problems?? - uint32_t *pROM = (uint32_t *)memregion("maincpu")->base(); + u32 *pROM = (u32 *)memregion("maincpu")->base(); pROM[0x19d04/4]=0x167a021a; // bne->br : sprite Y offset table is always copied to RAM #endif init_ss92046_01(); diff --git a/src/mame/drivers/tetrisp2.cpp b/src/mame/drivers/tetrisp2.cpp index 2abc705b065..be4ccfe5765 100644 --- a/src/mame/drivers/tetrisp2.cpp +++ b/src/mame/drivers/tetrisp2.cpp @@ -126,7 +126,7 @@ READ16_MEMBER(tetrisp2_state::rockn_adpcmbank_r) WRITE16_MEMBER(tetrisp2_state::rockn_adpcmbank_w) { - uint8_t *SNDROM = memregion("ymz")->base(); + u8 *SNDROM = memregion("ymz")->base(); int bank; m_rockn_adpcmbank = data; @@ -143,7 +143,7 @@ WRITE16_MEMBER(tetrisp2_state::rockn_adpcmbank_w) WRITE16_MEMBER(tetrisp2_state::rockn2_adpcmbank_w) { - uint8_t *SNDROM = memregion("ymz")->base(); + u8 *SNDROM = memregion("ymz")->base(); int bank; char banktable[9][3]= @@ -189,7 +189,7 @@ WRITE16_MEMBER(tetrisp2_state::nndmseal_sound_bank_w) { if (ACCESSING_BITS_0_7) { - uint8_t *rom = memregion("okisource")->base(); + u8 *rom = memregion("okisource")->base(); if (data & 0x04) { @@ -1573,69 +1573,18 @@ static const gfx_layout layout_16x16x8 = }; -/* sprites are contained in 256x256 "tiles" */ -static const uint32_t sprite_xoffset[256] = -{ - STEP8(8*8*8*0, 8), STEP8(8*8*8*1, 8), STEP8(8*8*8*2, 8), STEP8(8*8*8*3, 8), - STEP8(8*8*8*4, 8), STEP8(8*8*8*5, 8), STEP8(8*8*8*6, 8), STEP8(8*8*8*7, 8), - STEP8(8*8*8*8, 8), STEP8(8*8*8*9, 8), STEP8(8*8*8*10, 8), STEP8(8*8*8*11, 8), - STEP8(8*8*8*12, 8), STEP8(8*8*8*13, 8), STEP8(8*8*8*14, 8), STEP8(8*8*8*15, 8), - STEP8(8*8*8*16, 8), STEP8(8*8*8*17, 8), STEP8(8*8*8*18, 8), STEP8(8*8*8*19, 8), - STEP8(8*8*8*20, 8), STEP8(8*8*8*21, 8), STEP8(8*8*8*22, 8), STEP8(8*8*8*23, 8), - STEP8(8*8*8*24, 8), STEP8(8*8*8*25, 8), STEP8(8*8*8*26, 8), STEP8(8*8*8*27, 8), - STEP8(8*8*8*28, 8), STEP8(8*8*8*29, 8), STEP8(8*8*8*30, 8), STEP8(8*8*8*31, 8) -}; -static const uint32_t sprite_yoffset[256] = -{ - STEP8(8*8*8*0, 8*8), STEP8(8*8*8*32, 8*8), STEP8(8*8*8*64, 8*8), STEP8(8*8*8*96, 8*8), - STEP8(8*8*8*128,8*8), STEP8(8*8*8*160,8*8), STEP8(8*8*8*192,8*8), STEP8(8*8*8*224,8*8), - STEP8(8*8*8*256,8*8), STEP8(8*8*8*288,8*8), STEP8(8*8*8*320,8*8), STEP8(8*8*8*352,8*8), - STEP8(8*8*8*384,8*8), STEP8(8*8*8*416,8*8), STEP8(8*8*8*448,8*8), STEP8(8*8*8*480,8*8), - STEP8(8*8*8*512,8*8), STEP8(8*8*8*544,8*8), STEP8(8*8*8*576,8*8), STEP8(8*8*8*608,8*8), - STEP8(8*8*8*640,8*8), STEP8(8*8*8*672,8*8), STEP8(8*8*8*704,8*8), STEP8(8*8*8*736,8*8), - STEP8(8*8*8*768,8*8), STEP8(8*8*8*800,8*8), STEP8(8*8*8*832,8*8), STEP8(8*8*8*864,8*8), - STEP8(8*8*8*896,8*8), STEP8(8*8*8*928,8*8), STEP8(8*8*8*960,8*8), STEP8(8*8*8*992,8*8) -}; -static const gfx_layout spritelayout = -{ - 256, 256, - RGN_FRAC(1,1), - 8, - { STEP8(0,1) }, - EXTENDED_XOFFS, - EXTENDED_YOFFS, - 256*256*8, - sprite_xoffset, - sprite_yoffset -}; - - static GFXDECODE_START( gfx_tetrisp2 ) - GFXDECODE_ENTRY( "gfx1", 0, spritelayout, 0x0000, 0x10 ) // [0] Sprites GFXDECODE_ENTRY( "gfx2", 0, layout_16x16x8, 0x1000, 0x10 ) // [1] Background GFXDECODE_ENTRY( "gfx3", 0, layout_16x16x8, 0x2000, 0x10 ) // [2] Rotation GFXDECODE_ENTRY( "gfx4", 0, layout_8x8x8, 0x6000, 0x10 ) // [3] Foreground GFXDECODE_END static GFXDECODE_START( gfx_rocknms_sub ) - GFXDECODE_ENTRY( "gfx5", 0, spritelayout, 0x0000, 0x10 ) // [0] Sprites GFXDECODE_ENTRY( "gfx6", 0, layout_16x16x8, 0x1000, 0x10 ) // [1] Background GFXDECODE_ENTRY( "gfx7", 0, layout_16x16x8, 0x2000, 0x10 ) // [2] Rotation GFXDECODE_ENTRY( "gfx8", 0, layout_8x8x8, 0x6000, 0x10 ) // [3] Foreground GFXDECODE_END -static GFXDECODE_START( gfx_vj_lscreen ) - GFXDECODE_ENTRY( "sprites_left", 0, spritelayout, 0x0000, 0x80 ) // [0] Sprites (left screen, vertical in stepping stage) -GFXDECODE_END - -static GFXDECODE_START( gfx_vj_mscreen ) - GFXDECODE_ENTRY( "sprites_mid", 0, spritelayout, 0x0000, 0x80 ) // [0] Sprites (mid screen, horizontal) -GFXDECODE_END - -static GFXDECODE_START( gfx_vj_rscreen ) - GFXDECODE_ENTRY( "sprites_right", 0, spritelayout, 0x0000, 0x80 ) // [0] Sprites (right screens, vertical in stepping stage) -GFXDECODE_END - /*************************************************************************** @@ -1728,7 +1677,7 @@ void stepstag_state::init_stepstag() void tetrisp2_state::tetrisp2(machine_config &config) { /* basic machine hardware */ - M68000(config, m_maincpu, 12000000); + M68000(config, m_maincpu, 12_MHz_XTAL); // 12MHz m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::tetrisp2_map); m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold)); @@ -1748,13 +1697,18 @@ void tetrisp2_state::tetrisp2(machine_config &config) GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2); PALETTE(config, m_palette).set_entries(0x8000); + JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, XTAL(48'000'000)); // 48MHz for video? + m_sprite->set_palette(m_palette); + m_sprite->set_color_base(0); + m_sprite->set_color_entries(16); + MCFG_VIDEO_START_OVERRIDE(tetrisp2_state,tetrisp2) /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - ymz280b_device &ymz(YMZ280B(config, "ymz", 16934400)); + ymz280b_device &ymz(YMZ280B(config, "ymz", 16.9344_MHz_XTAL)); // 16.9344MHz ymz.add_route(0, "lspeaker", 1.0); ymz.add_route(1, "rspeaker", 1.0); } @@ -1763,7 +1717,7 @@ void tetrisp2_state::tetrisp2(machine_config &config) void tetrisp2_state::nndmseal(machine_config &config) { /* basic machine hardware */ - M68000(config, m_maincpu, XTAL(12'000'000)); + M68000(config, m_maincpu, XTAL(12'000'000)); // 12MHz m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::nndmseal_map); m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold)); @@ -1783,19 +1737,24 @@ void tetrisp2_state::nndmseal(machine_config &config) GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2); PALETTE(config, m_palette).set_entries(0x8000); + JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, 42954500); // OSC1(42.9545MHz) for video? + m_sprite->set_palette(m_palette); + m_sprite->set_color_base(0); + m_sprite->set_color_entries(16); + MCFG_VIDEO_START_OVERRIDE(tetrisp2_state,nndmseal) // bg layer offset /* sound hardware */ SPEAKER(config, "mono").front_center(); - OKIM6295(config, "oki", XTAL(2'000'000), okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); + OKIM6295(config, "oki", XTAL(2'000'000), okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // 2MHz } void tetrisp2_state::rockn(machine_config &config) { /* basic machine hardware */ - M68000(config, m_maincpu, 12000000); + M68000(config, m_maincpu, XTAL(12'000'000)); // 12MHz m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::rockn1_map); m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold)); @@ -1815,13 +1774,18 @@ void tetrisp2_state::rockn(machine_config &config) GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2); PALETTE(config, m_palette).set_entries(0x8000); + JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, XTAL(48'000'000)); // 48MHz for video? + m_sprite->set_palette(m_palette); + m_sprite->set_color_base(0); + m_sprite->set_color_entries(16); + MCFG_VIDEO_START_OVERRIDE(tetrisp2_state,rockntread) /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - ymz280b_device &ymz(YMZ280B(config, "ymz", 16934400)); + ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(16'934'400))); // 16.9344MHz ymz.add_route(0, "lspeaker", 1.0); ymz.add_route(1, "rspeaker", 1.0); } @@ -1830,7 +1794,7 @@ void tetrisp2_state::rockn(machine_config &config) void tetrisp2_state::rockn2(machine_config &config) { /* basic machine hardware */ - M68000(config, m_maincpu, 12000000); + M68000(config, m_maincpu, XTAL(12'000'000)); // 12MHz m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::rockn2_map); m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold)); @@ -1850,13 +1814,18 @@ void tetrisp2_state::rockn2(machine_config &config) GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2); PALETTE(config, m_palette).set_entries(0x8000); + JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, XTAL(48'000'000)); // 48MHz for video? + m_sprite->set_palette(m_palette); + m_sprite->set_color_base(0); + m_sprite->set_color_entries(16); + MCFG_VIDEO_START_OVERRIDE(tetrisp2_state,rockntread) /* sound hardware */ SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - ymz280b_device &ymz(YMZ280B(config, "ymz", 16934400)); + ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(16'934'400))); // 16.9344MHz ymz.add_route(0, "lspeaker", 1.0); ymz.add_route(1, "rspeaker", 1.0); } @@ -1865,11 +1834,11 @@ void tetrisp2_state::rockn2(machine_config &config) void tetrisp2_state::rocknms(machine_config &config) { /* basic machine hardware */ - M68000(config, m_maincpu, 12000000); + M68000(config, m_maincpu, XTAL(12'000'000)); // 12MHz m_maincpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::rocknms_main_map); m_maincpu->set_vblank_int("lscreen", FUNC(tetrisp2_state::irq2_line_hold)); - M68000(config, m_subcpu, 12000000); + M68000(config, m_subcpu, XTAL(12'000'000)); // 12MHz m_subcpu->set_addrmap(AS_PROGRAM, &tetrisp2_state::rocknms_sub_map); m_subcpu->set_vblank_int("lscreen", FUNC(tetrisp2_state::irq2_line_hold)); @@ -1885,6 +1854,16 @@ void tetrisp2_state::rocknms(machine_config &config) GFXDECODE(config, m_sub_gfxdecode, m_sub_palette, gfx_rocknms_sub); PALETTE(config, m_sub_palette).set_entries(0x8000); + JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, XTAL(48'000'000)); // 48MHz for video? + m_sprite->set_palette(m_palette); + m_sprite->set_color_base(0); + m_sprite->set_color_entries(16); + + JALECO_MEGASYSTEM32_SPRITE(config, m_rocknms_sub_sprite, XTAL(48'000'000)); // 48MHz for video? + m_rocknms_sub_sprite->set_palette(m_sub_palette); + m_rocknms_sub_sprite->set_color_base(0); + m_rocknms_sub_sprite->set_color_entries(16); + config.set_default_layout(layout_rocknms); screen_device &lscreen(SCREEN(config, "lscreen", SCREEN_TYPE_RASTER)); @@ -1909,7 +1888,7 @@ void tetrisp2_state::rocknms(machine_config &config) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); - ymz280b_device &ymz(YMZ280B(config, "ymz", 16934400)); + ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(16'934'400))); // 16.9344MHz ymz.add_route(0, "lspeaker", 1.0); ymz.add_route(1, "rspeaker", 1.0); } @@ -1917,7 +1896,7 @@ void tetrisp2_state::rocknms(machine_config &config) void stepstag_state::stepstag(machine_config &config) { - M68000(config, m_maincpu, 12000000); + M68000(config, m_maincpu, XTAL(12'000'000)); // 12MHz? m_maincpu->set_addrmap(AS_PROGRAM, &stepstag_state::stepstag_map); m_maincpu->set_vblank_int("mscreen", FUNC(tetrisp2_state::irq2_line_hold)); // lev 4 triggered by system timer @@ -1962,15 +1941,33 @@ void stepstag_state::stepstag(machine_config &config) GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2); PALETTE(config, m_palette).set_entries(0x8000); - GFXDECODE(config, m_vj_gfxdecode_l, m_vj_palette_l, gfx_vj_lscreen); PALETTE(config, m_vj_palette_l).set_entries(0x8000); - - GFXDECODE(config, m_vj_gfxdecode_m, m_vj_palette_m, gfx_vj_mscreen); PALETTE(config, m_vj_palette_m).set_entries(0x8000); - - GFXDECODE(config, m_vj_gfxdecode_r, m_vj_palette_r, gfx_vj_rscreen); PALETTE(config, m_vj_palette_r).set_entries(0x8000); + JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, 48000000); // unknown + m_sprite->set_palette(m_palette); + m_sprite->set_color_base(0); + m_sprite->set_color_entries(16); + + // (left screen, vertical in stepping stage) + JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_l, 48000000); // unknown + m_vj_sprite_l->set_palette(m_vj_palette_l); + m_vj_sprite_l->set_color_base(0); + m_vj_sprite_l->set_color_entries(0x80); + + // (mid screen, horizontal) + JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_m, 48000000); // unknown + m_vj_sprite_m->set_palette(m_vj_palette_m); + m_vj_sprite_m->set_color_base(0); + m_vj_sprite_m->set_color_entries(0x80); + + // (right screens, vertical in stepping stage) + JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_r, 48000000); // unknown + m_vj_sprite_r->set_palette(m_vj_palette_r); + m_vj_sprite_r->set_color_base(0); + m_vj_sprite_r->set_color_entries(0x80); + config.set_default_layout(layout_stepstag); // sound hardware @@ -1979,14 +1976,14 @@ void stepstag_state::stepstag(machine_config &config) GENERIC_LATCH_16(config, m_soundlatch); - ymz280b_device &ymz(YMZ280B(config, "ymz", 16934400)); + ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(16'934'400))); // 16.9344MHz ymz.add_route(0, "lspeaker", 1.0); ymz.add_route(1, "rspeaker", 1.0); } void stepstag_state::vjdash(machine_config &config) // 4 Screens { - M68000(config, m_maincpu, 12000000); + M68000(config, m_maincpu, XTAL(12'000'000)); // 12MHz? m_maincpu->set_addrmap(AS_PROGRAM, &stepstag_state::vjdash_map); m_maincpu->set_vblank_int("screen", FUNC(tetrisp2_state::irq2_line_hold)); // lev 4 triggered by system timer @@ -2036,15 +2033,33 @@ void stepstag_state::vjdash(machine_config &config) // 4 Screens GFXDECODE(config, m_gfxdecode, m_palette, gfx_tetrisp2); PALETTE(config, m_palette).set_entries(0x8000); - GFXDECODE(config, m_vj_gfxdecode_l, m_vj_palette_l, gfx_vj_lscreen); PALETTE(config, m_vj_palette_l).set_entries(0x8000); - - GFXDECODE(config, m_vj_gfxdecode_m, m_vj_palette_m, gfx_vj_mscreen); PALETTE(config, m_vj_palette_m).set_entries(0x8000); - - GFXDECODE(config, m_vj_gfxdecode_r, m_vj_palette_r, gfx_vj_rscreen); PALETTE(config, m_vj_palette_r).set_entries(0x8000); + JALECO_MEGASYSTEM32_SPRITE(config, m_sprite, 48000000); // unknown + m_sprite->set_palette(m_palette); + m_sprite->set_color_base(0); + m_sprite->set_color_entries(16); + + // (left screen, vertical in stepping stage) + JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_l, 48000000); // unknown + m_vj_sprite_l->set_palette(m_vj_palette_l); + m_vj_sprite_l->set_color_base(0); + m_vj_sprite_l->set_color_entries(0x80); + + // (mid screen, horizontal) + JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_m, 48000000); // unknown + m_vj_sprite_m->set_palette(m_vj_palette_m); + m_vj_sprite_m->set_color_base(0); + m_vj_sprite_m->set_color_entries(0x80); + + // (right screens, vertical in stepping stage) + JALECO_MEGASYSTEM32_SPRITE(config, m_vj_sprite_r, 48000000); // unknown + m_vj_sprite_r->set_palette(m_vj_palette_r); + m_vj_sprite_r->set_color_base(0); + m_vj_sprite_r->set_color_entries(0x80); + config.set_default_layout(layout_vjdash); // sound hardware @@ -2053,7 +2068,7 @@ void stepstag_state::vjdash(machine_config &config) // 4 Screens GENERIC_LATCH_16(config, m_soundlatch); - ymz280b_device &ymz(YMZ280B(config, "ymz", 16934400)); + ymz280b_device &ymz(YMZ280B(config, "ymz", XTAL(16'934'400))); // 16.9344MHz ymz.add_route(0, "lspeaker", 1.0); ymz.add_route(1, "rspeaker", 1.0); } @@ -2115,7 +2130,7 @@ ROM_START( tetrisp2 ) /* Version 2.8 */ ROM_LOAD16_BYTE( "tet2_4_ver2.8.ic59", 0x000000, 0x080000, CRC(e67f9c51) SHA1(d8b2937699d648267b163c7c3f591426877f3701) ) ROM_LOAD16_BYTE( "tet2_1_ver2.8.ic65", 0x000001, 0x080000, CRC(5020a4ed) SHA1(9c0f02fe3700761771ac026a2e375144e86e5eb7) ) - ROM_REGION( 0x800000, "gfx1", 0 ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x800000, "sprite", 0 ) /* 8x8x8 (Sprites) */ ROM_LOAD32_WORD( "96019-01.9", 0x000000, 0x400000, CRC(06f7dc64) SHA1(722c51b707b9854c0293afdff18b27ec7cae6719) ) ROM_LOAD32_WORD( "96019-02.8", 0x000002, 0x400000, CRC(3e613bed) SHA1(038b5e43fa3d69654107c8093126eeb2e8fa4ddc) ) @@ -2142,7 +2157,7 @@ ROM_START( tetrisp2a ) /* Version 2.7 */ ROM_LOAD16_BYTE( "tet2_4_ver2.7.ic59", 0x000000, 0x080000, CRC(3070bfde) SHA1(ba4f69961411fb7d64bcdf83763322e8ff097a59) ) ROM_LOAD16_BYTE( "tet2_1_ver2.7.ic65", 0x000001, 0x080000, CRC(fe3eb1d2) SHA1(7ab27de254a0701a5ba8879456db794e871e6d69) ) - ROM_REGION( 0x800000, "gfx1", 0 ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x800000, "sprite", 0 ) /* 8x8x8 (Sprites) */ ROM_LOAD32_WORD( "96019-01.9", 0x000000, 0x400000, CRC(06f7dc64) SHA1(722c51b707b9854c0293afdff18b27ec7cae6719) ) ROM_LOAD32_WORD( "96019-02.8", 0x000002, 0x400000, CRC(3e613bed) SHA1(038b5e43fa3d69654107c8093126eeb2e8fa4ddc) ) @@ -2169,7 +2184,7 @@ ROM_START( tetrisp2j ) /* Version 2.2 */ ROM_LOAD16_BYTE( "tet2_4_ver2.2.ic59", 0x000000, 0x080000, CRC(5bfa32c8) SHA1(55fb2872695fcfbad13f5c0723302e72da69e44a) ) ROM_LOAD16_BYTE( "tet2_1_ver2.2.ic65", 0x000001, 0x080000, CRC(919116d0) SHA1(3e1c0fd4c9175b2900a4717fbb9e8b591c5f534d) ) - ROM_REGION( 0x800000, "gfx1", 0 ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x800000, "sprite", 0 ) /* 8x8x8 (Sprites) */ ROM_LOAD32_WORD( "96019-01.9", 0x000000, 0x400000, CRC(06f7dc64) SHA1(722c51b707b9854c0293afdff18b27ec7cae6719) ) ROM_LOAD32_WORD( "96019-02.8", 0x000002, 0x400000, CRC(3e613bed) SHA1(038b5e43fa3d69654107c8093126eeb2e8fa4ddc) ) @@ -2192,7 +2207,7 @@ ROM_START( tetrisp2ja ) /* Version 2.1 */ ROM_LOAD16_BYTE( "tet2_ic4_ver2.1.ic59", 0x000000, 0x080000, CRC(5bfa32c8) SHA1(55fb2872695fcfbad13f5c0723302e72da69e44a) ) ROM_LOAD16_BYTE( "tet2_ic1_ver2.1.ic65", 0x000001, 0x080000, CRC(5b5f8377) SHA1(75e17d628a1fd6da5616eea3e1e137f000824f14) ) - ROM_REGION( 0x800000, "gfx1", 0 ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x800000, "sprite", 0 ) /* 8x8x8 (Sprites) */ ROM_LOAD32_WORD( "96019-01.9", 0x000000, 0x400000, CRC(06f7dc64) SHA1(722c51b707b9854c0293afdff18b27ec7cae6719) ) ROM_LOAD32_WORD( "96019-02.8", 0x000002, 0x400000, CRC(3e613bed) SHA1(038b5e43fa3d69654107c8093126eeb2e8fa4ddc) ) @@ -2271,7 +2286,7 @@ ROM_START( nndmseal ) ROM_LOAD16_BYTE( "1.1", 0x00000, 0x40000, CRC(45acea25) SHA1(f2f2e78be261c3d8c0145a639bc3771f0588401d) ) // 1xxxxxxxxxxxxxxxxx = 0xFF ROM_LOAD16_BYTE( "3.3", 0x00001, 0x40000, CRC(0754d96a) SHA1(1da44994e8bcfd8832755e298c0125b38cfdd16e) ) // 1xxxxxxxxxxxxxxxxx = 0xFF - ROM_REGION( 0x100000, "gfx1", ROMREGION_ERASE ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x100000, "sprite", ROMREGION_ERASE ) /* 8x8x8 (Sprites) */ /* This game doesn't use sprites, but the region needs to be a valid size for at least one sprite 'page' for the init to work. */ ROM_REGION( 0x400000, "gfx2", 0 ) // 16x16x8 (Background) @@ -2331,7 +2346,7 @@ ROM_START( nndmseala ) ROM_LOAD16_BYTE( "1.ic1", 0x00000, 0x40000, CRC(4eab8565) SHA1(07cdf00b60e19339188cbcd9d8e96a683b114f3e) ) ROM_LOAD16_BYTE( "3.ic3", 0x00001, 0x40000, CRC(054ba50f) SHA1(11e3c5a6199955d6501ee72a5af62d17440fc306) ) - ROM_REGION( 0x100000, "gfx1", ROMREGION_ERASE ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x100000, "sprite", ROMREGION_ERASE ) /* 8x8x8 (Sprites) */ /* This game doesn't use sprites, but the region needs to be a valid size for at least one sprite 'page' for the init to work. */ ROM_REGION( 0x200000, "gfx2", 0 ) // 16x16x8 (Background) @@ -2423,7 +2438,7 @@ ROM_START( rockn ) ROM_LOAD16_BYTE( "rock_n_1_vj-98344_1.bin", 0x000001, 0x80000, CRC(4cf79e58) SHA1(f50e596d43c9ab2072ae0476169eee2a8512fd8d) ) ROM_LOAD16_BYTE( "rock_n_1_vj-98344_4.bin", 0x000000, 0x80000, CRC(caa33f79) SHA1(8ccff67091dac5ad871cae6cdb31e1fc37c1a4c2) ) - ROM_REGION( 0x400000, "gfx1", 0 ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x400000, "sprite", 0 ) /* 8x8x8 (Sprites) */ ROM_LOAD32_WORD( "rock_n_1_vj-98344_8.bin", 0x000002, 0x200000, CRC(fa3f6f9c) SHA1(586dcc690a1a4aa7c97932ad496382def6a074a4) ) ROM_LOAD32_WORD( "rock_n_1_vj-98344_9.bin", 0x000000, 0x200000, CRC(3d12a688) SHA1(356b2ea81d960838b604c5a17cc77e79fb0e40ce) ) @@ -2461,7 +2476,7 @@ ROM_START( rockna ) ROM_LOAD16_BYTE( "rock_n_1_vj-98344_1", 0x000001, 0x80000, CRC(6078fa48) SHA1(e98c1a1abf026f2d5b5035ccbc9d412a08ca1f02) ) ROM_LOAD16_BYTE( "rock_n_1_vj-98344_4", 0x000000, 0x80000, CRC(c8310bd0) SHA1(1efee954cc94b668b7d9f28a099b8d1c83d3093f) ) - ROM_REGION( 0x400000, "gfx1", 0 ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x400000, "sprite", 0 ) /* 8x8x8 (Sprites) */ ROM_LOAD32_WORD( "rock_n_1_vj-98344_8.bin", 0x000002, 0x200000, CRC(fa3f6f9c) SHA1(586dcc690a1a4aa7c97932ad496382def6a074a4) ) ROM_LOAD32_WORD( "rock_n_1_vj-98344_9.bin", 0x000000, 0x200000, CRC(3d12a688) SHA1(356b2ea81d960838b604c5a17cc77e79fb0e40ce) ) @@ -2498,7 +2513,7 @@ ROM_START( rockn2 ) ROM_LOAD16_BYTE( "rock_n_2_vj-98344_1_v1.0", 0x000001, 0x80000, CRC(854b5a45) SHA1(91496bc511fef1d552d2bd00b82d2470eae94528) ) ROM_LOAD16_BYTE( "rock_n_2_vj-98344_4_v1.0", 0x000000, 0x80000, CRC(4665bbd2) SHA1(3562c67b81a32d178a8bcb872e676bf7284855d7) ) - ROM_REGION( 0x400000, "gfx1", 0 ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x400000, "sprite", 0 ) /* 8x8x8 (Sprites) */ ROM_LOAD32_WORD( "rock_n_2_vj-98344_8_v1.0", 0x000002, 0x200000, CRC(673ce2c2) SHA1(6c0a13de386b02a7f3a86e8128374938ede2525c) ) ROM_LOAD32_WORD( "rock_n_2_vj-98344_9_v1.0", 0x000000, 0x200000, CRC(9d3968cf) SHA1(11c96e7685ab8c1b416396238ec5c12e7819385f) ) @@ -2576,7 +2591,7 @@ ROM_START( rockn3 ) ROM_LOAD16_BYTE( "rock_n_3_vj-98344_1_v1.0", 0x000001, 0x80000, CRC(abc6ab4a) SHA1(2f1983b95cd9e42d709edac5613b1f0b450df4ba) ) /* IC65 (alt PCB number 1) */ ROM_LOAD16_BYTE( "rock_n_3_vj-98344_4_v1.0", 0x000000, 0x80000, CRC(3ecba46e) SHA1(64ff5b7932a8d8dc01c649b9dcc1d55cf1e43387) ) /* IC59 (alt PCB number 4) */ - ROM_REGION( 0x400000, "gfx1", 0 ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x400000, "sprite", 0 ) /* 8x8x8 (Sprites) */ ROM_LOAD32_WORD( "rock_n_3_vj-98344_8_v1.0", 0x000002, 0x200000, CRC(468bf696) SHA1(d58e399ff876ab0f4ef52aaa85d86d72db307b6a) ) /* IC32 (alt PCB number 8) */ ROM_LOAD32_WORD( "rock_n_3_vj-98344_9_v1.0", 0x000000, 0x200000, CRC(8a61fc18) SHA1(4e895a2014e711d044ed5d8bff8a91766f14b307) ) /* IC33 (alt PCB number 9) */ @@ -2623,7 +2638,7 @@ ROM_START( rockn4 ) /* Prototype */ ROM_LOAD16_BYTE( "rock_n_4_vj-98344_1.bin", 0x000001, 0x80000, CRC(c666caea) SHA1(57018de40d71fe214a6b5cc33c8ad5e88622d010) ) ROM_LOAD16_BYTE( "rock_n_4_vj-98344_4.bin", 0x000000, 0x80000, CRC(cc94e557) SHA1(d38abed04239d9eecf1b1be7a9f765a1b7aa0d8d) ) - ROM_REGION( 0x400000, "gfx1", 0 ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x400000, "sprite", 0 ) /* 8x8x8 (Sprites) */ ROM_LOAD32_WORD( "rock_n_4_vj-98344_8.bin", 0x000002, 0x200000, CRC(5eeae537) SHA1(6bb8c658a2985c3919f0590a0147eead995c01c9) ) ROM_LOAD32_WORD( "rock_n_4_vj-98344_9.bin", 0x000000, 0x200000, CRC(3fedddc9) SHA1(4bd8f402ecf8e6255326927e825179fa6d300e73) ) @@ -2659,7 +2674,7 @@ ROM_START( rocknms ) ROM_LOAD16_BYTE( "slav_prg1", 0x000001, 0x80000, CRC(769e2245) SHA1(5e6b5456fb213da887be4ef3739685360f6fdae5) ) ROM_LOAD16_BYTE( "slav_prg0", 0x000000, 0x80000, CRC(55b8df65) SHA1(7744e7a75904174843fc6e3d54324839c6cf104d) ) - ROM_REGION( 0x0800000, "gfx1", 0 ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x0800000, "sprite", 0 ) /* 8x8x8 (Sprites) */ ROM_LOAD32_WORD( "mast_spr1", 0x000002, 0x400000, CRC(520152dc) SHA1(619a55352c0dab914f6188d66272a24495b5d1d4) ) ROM_LOAD32_WORD( "mast_spr0", 0x000000, 0x400000, CRC(1caad02a) SHA1(00c3fc849d1f633874fee30f7d0caf0c62735c50) ) @@ -2672,7 +2687,7 @@ ROM_START( rocknms ) ROM_REGION( 0x080000, "gfx4", 0 ) /* 8x8x8 (Foreground) */ ROM_LOAD( "mast_front", 0x000000, 0x080000, CRC(a4717579) SHA1(cf28c0f19713ebf9f8fd5d55d654c1cd2e8cd73d) ) - ROM_REGION( 0x800000, "gfx5", 0 ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x800000, "sub_sprite", 0 ) /* 8x8x8 (Sprites) */ ROM_LOAD32_WORD( "slav_spr1", 0x000002, 0x400000, CRC(3f8124b0) SHA1(c9ab89f559551d2298d28e107b2d44d312e53216) ) ROM_LOAD32_WORD( "slav_spr0", 0x000000, 0x400000, CRC(48a7f5b1) SHA1(4724856bde3cf975efc3be407b60693a69a39365) ) @@ -2730,22 +2745,22 @@ ROM_START( vjdash ) ROM_FILL( 0x100, 1, 0x60 ) ROM_FILL( 0x101, 1, 0xfe ) - ROM_REGION( 0x0c00000, "sprites_left", ROMREGION_ERASE ) // left screen sprites + ROM_REGION( 0x0c00000, "sprite_l", ROMREGION_ERASE ) // left screen sprites ROM_LOAD( "vjdash-01", 0x000000, 0x400000, NO_DUMP ) ROM_LOAD( "vjdash-02", 0x400000, 0x400000, NO_DUMP ) - ROM_REGION( 0x1800000, "sprites_mid", ROMREGION_ERASE ) // middle screen sprites + ROM_REGION( 0x1800000, "sprite_m", ROMREGION_ERASE ) // middle screen sprites ROM_LOAD( "vjdash-03", 0x000000, 0x400000, NO_DUMP ) ROM_LOAD( "vjdash-04", 0x400000, 0x400000, NO_DUMP ) - ROM_REGION( 0x0c00000, "sprites_right", ROMREGION_ERASE ) // right screen sprites + ROM_REGION( 0x0c00000, "sprite_r", ROMREGION_ERASE ) // right screen sprites ROM_LOAD( "vjdash-01", 0x000000, 0x400000, NO_DUMP ) ROM_LOAD( "vjdash-02", 0x400000, 0x400000, NO_DUMP ) ROM_REGION( 0x080000, "gfx4", 0 ) /* 8x8x8 (Foreground) */ ROM_LOAD( "vjdash_ver1.0.ic27", 0x000000, 0x080000, CRC(f3cff858) SHA1(9277e5fb3494f7afb7f3911792d1c68b2b1b147e) ) - ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x400000, "sprite", ROMREGION_ERASE ) /* 8x8x8 (Sprites) */ ROM_REGION( 0x400000, "gfx2", 0 ) /* 16x16x8 (Background) */ ROM_LOAD16_WORD( "mr98053-03.ic14", 0x000000, 0x200000, CRC(0bd32084) SHA1(2fcac3019ebedc54b83b08f527aa968ce6d48617) ) @@ -2783,19 +2798,19 @@ ROM_START( stepstag ) ROM_LOAD16_BYTE( "vj98348ver11.11", 0x00000, 0x80000, CRC(29b7f848) SHA1(c4d89e5c9be622b2d9038c359a5f65ce0dd461b0) ) ROM_LOAD16_BYTE( "vj98348ver11.14", 0x00001, 0x80000, CRC(e3314c6c) SHA1(61b0e9f9d0126d9f475304866a03cfa21701d9aa) ) - ROM_REGION( 0x1000000, "sprites_left", 0 ) // left screen sprites (vertical) + ROM_REGION( 0x1000000, "sprite_l", 0 ) // left screen sprites (vertical) ROM_LOAD( "mr99001-01", 0x000000, 0x400000, CRC(aa92cebf) SHA1(2ccc0d2ef9bc92c27f0a625819154bbcf9cfde0c) ) // VERTICAL ROM_LOAD( "mr99001-02", 0x400000, 0x400000, CRC(12c65d86) SHA1(7fe5853fa3ba086f8da15702b126eb13c6ea30a9) ) // VERTICAL ROM_LOAD( "s.s.s._vj-98348_3_pr99021-01", 0x800000, 0x400000, CRC(e0fbc6f1) SHA1(7ca4507702f3f81bb9de3f9b5d270d379e439633) ) // VERTICAL - ROM_REGION( 0x1800000, "sprites_mid", 0 ) // middle screen sprites (horizontal) + ROM_REGION( 0x1800000, "sprite_m", 0 ) // middle screen sprites (horizontal) ROM_LOAD( "mr99001-03", 0x0000000, 0x400000, CRC(40fee0df) SHA1(94c3567e82f8039b3169bf4dcb1fcd9e39c6eb27) ) // HORIZONTAL TRUSTED ROM_LOAD( "mr99001-04", 0x0400000, 0x400000, CRC(d6837981) SHA1(56709d73304f0b186c70844ae96f73400b541609) ) // HORIZONTAL TRUSTED ROM_LOAD( "mr99001-05", 0x0800000, 0x400000, CRC(3958473b) SHA1(12279a587263290945744b22aafb80460eea77f7) ) // HORIZONTAL TRUSTED ROM_LOAD( "mr99001-06", 0x0c00000, 0x400000, CRC(cfa27c93) SHA1(a0837877736e8e898f3acc64bc87ee0cc4d9f243) ) // HORIZONTAL ROM_LOAD( "s.s.s._vj-98348_19_pr99021-02", 0x1000000, 0x400000, CRC(2d98da1a) SHA1(b09375fa1b4b2e0794632d6e237459009f40310d) ) // HORIZONTAL TRUSTED - ROM_REGION( 0x1000000, "sprites_right", 0 ) // right screen sprites (vertical) + ROM_REGION( 0x1000000, "sprite_r", 0 ) // right screen sprites (vertical) ROM_LOAD( "mr99001-01", 0x000000, 0x400000, CRC(aa92cebf) SHA1(2ccc0d2ef9bc92c27f0a625819154bbcf9cfde0c) ) // VERTICAL ROM_LOAD( "mr99001-02", 0x400000, 0x400000, CRC(12c65d86) SHA1(7fe5853fa3ba086f8da15702b126eb13c6ea30a9) ) // VERTICAL // rom _26_ seems a bad dump of rom _3_, overwrite it: @@ -2805,7 +2820,7 @@ ROM_START( stepstag ) ROM_REGION( 0x400000, "gfx4", 0 ) // foreground tiles ROM_LOAD( "vjdash_ver1.0.ic27", 0x000000, 0x080000, BAD_DUMP CRC(f3cff858) SHA1(9277e5fb3494f7afb7f3911792d1c68b2b1b147e) ) - ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x400000, "sprite", ROMREGION_ERASE ) /* 8x8x8 (Sprites) */ ROM_REGION( 0x400000, "gfx2", ROMREGION_ERASE ) /* 16x16x8 (Background) */ ROM_LOAD16_WORD( "stepstag_scroll", 0x000000, 0x400000, NO_DUMP ) @@ -2840,19 +2855,19 @@ ROM_START( step3 ) 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) ) - ROM_REGION( 0x1800000, "sprites_left", 0 ) // left screen sprites (vertical) + ROM_REGION( 0x1800000, "sprite_l", 0 ) // left screen sprites (vertical) ROM_LOAD( "mr9930-01.ic2", 0x0000000, 0x400000, CRC(9e3e054e) SHA1(06a4fa76cb83dbe9d565d5ccd0a5ecc5067887c9) ) // sprites VERTICAL ROM_LOAD( "mr9930-02.ic3", 0x0400000, 0x400000, CRC(b23c29f4) SHA1(a7b10a3a9af43db319baf8633bb3728120960923) ) // 8x8 VERTICAL ROM_LOAD( "mr9930-03.ic4", 0x0800000, 0x400000, CRC(9a5d070f) SHA1(b4668b4f299033140a2c56499cc2712ba111cb57) ) // 8x8 VERTICAL ROM_LOAD( "vj98348_step3_4_v1.1", 0x0c00000, 0x400000, CRC(dec612df) SHA1(acb86bb90c1cc61c7db3e022c69a5ff0611ffbae) ) // 8x8 HORIZONTAL - ROM_REGION( 0x1800000, "sprites_mid", 0 ) // middle screen sprites (horizontal) + ROM_REGION( 0x1800000, "sprite_m", 0 ) // middle screen sprites (horizontal) ROM_LOAD( "mr99030-04.ic17", 0x000000, 0x400000, CRC(3eac3591) SHA1(3b294e94af23fd92fdf51d2c9c43f60d2ebd1688) ) // 8x8 HORIZONTAL ROM_LOAD( "mr99030-05.ic18", 0x400000, 0x400000, CRC(dea7b8d6) SHA1(d7d98675eb3998a8057929f90aa340c1e5f6a617) ) // 8x8 HORIZONTAL ROM_LOAD( "mr99030-06.ic19", 0x800000, 0x400000, CRC(71489d79) SHA1(0398a354c2588e3974cb76a331e46165db6af06d) ) // 8x8 HORIZONTAL ROM_LOAD( "vj98348_step3_18_v1.1", 0x0c00000, 0x400000, CRC(bc92f0a0) SHA1(49c08de7a898a27972d4209709ddf447c5dca36a) ) // 8x8 VERTICAL - ROM_REGION( 0x1800000, "sprites_right", 0 ) // right screen sprites (vertical) + ROM_REGION( 0x1800000, "sprite_r", 0 ) // right screen sprites (vertical) ROM_LOAD( "mr9930-01.ic30", 0x0000000, 0x400000, CRC(9e3e054e) SHA1(06a4fa76cb83dbe9d565d5ccd0a5ecc5067887c9) ) // sprites? VERTICAL ROM_LOAD( "mr9930-02.ic29", 0x0400000, 0x400000, CRC(b23c29f4) SHA1(a7b10a3a9af43db319baf8633bb3728120960923) ) // 8x8 VERTICAL ROM_LOAD( "mr9930-03.ic28", 0x0800000, 0x400000, CRC(9a5d070f) SHA1(b4668b4f299033140a2c56499cc2712ba111cb57) ) // 8x8 VERTICAL @@ -2861,7 +2876,7 @@ ROM_START( step3 ) ROM_REGION( 0x400000, "gfx4", 0 ) // foreground tiles ROM_LOAD( "vjdash_ver1.0.ic27", 0x000000, 0x080000, BAD_DUMP CRC(f3cff858) SHA1(9277e5fb3494f7afb7f3911792d1c68b2b1b147e) ) - ROM_REGION( 0x400000, "gfx1", ROMREGION_ERASE ) /* 8x8x8 (Sprites) */ + ROM_REGION( 0x400000, "sprite", ROMREGION_ERASE ) /* 8x8x8 (Sprites) */ ROM_REGION( 0x400000, "gfx2", ROMREGION_ERASE ) /* 16x16x8 (Background) */ diff --git a/src/mame/includes/ms32.h b/src/mame/includes/ms32.h index 2e49fc23eba..3ba318b575c 100644 --- a/src/mame/includes/ms32.h +++ b/src/mame/includes/ms32.h @@ -7,6 +7,7 @@ #include "machine/gen_latch.h" #include "machine/timer.h" +#include "video/ms32_sprite.h" #include "emupal.h" #include "screen.h" #include "tilemap.h" @@ -20,6 +21,7 @@ public: m_gfxdecode(*this, "gfxdecode"), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), + m_sprite(*this, "sprite"), m_soundlatch(*this, "soundlatch"), m_screen(*this, "screen"), m_mainram(*this, "mainram"), @@ -74,39 +76,40 @@ protected: required_device m_maincpu; required_device m_audiocpu; + required_device m_sprite; optional_device m_soundlatch; private: - optional_device m_screen; - optional_shared_ptr m_mainram; - optional_shared_ptr m_roz_ctrl; - optional_shared_ptr m_tx_scroll; - optional_shared_ptr m_bg_scroll; - optional_shared_ptr m_mahjong_input_select; - optional_shared_ptr m_priram; - optional_shared_ptr m_palram; - optional_shared_ptr m_rozram; - optional_shared_ptr m_lineram; - optional_shared_ptr m_sprram; - optional_shared_ptr m_txram; - optional_shared_ptr m_bgram; - optional_shared_ptr m_f1superb_extraram; + optional_shared_ptr m_mainram; + optional_shared_ptr m_roz_ctrl; + optional_shared_ptr m_tx_scroll; + optional_shared_ptr m_bg_scroll; + optional_shared_ptr m_mahjong_input_select; + optional_shared_ptr m_priram; + optional_shared_ptr m_palram; + optional_shared_ptr m_rozram; + optional_shared_ptr m_lineram; + optional_shared_ptr m_sprram; + optional_shared_ptr m_txram; + optional_shared_ptr m_bgram; + optional_shared_ptr m_f1superb_extraram; optional_memory_bank_array<2> m_z80bank; - std::unique_ptr m_nvram_8; - uint32_t m_to_main; - uint16_t m_irqreq; + std::unique_ptr m_nvram_8; + std::unique_ptr m_sprram_buffer; + u32 m_to_main; + u16 m_irqreq; tilemap_t *m_tx_tilemap; tilemap_t *m_roz_tilemap; tilemap_t *m_bg_tilemap; tilemap_t *m_bg_tilemap_alt; - uint32_t m_tilemaplayoutcontrol; + u32 m_tilemaplayoutcontrol; tilemap_t* m_extra_tilemap; bitmap_ind16 m_temp_bitmap_tilemaps; bitmap_ind16 m_temp_bitmap_sprites; bitmap_ind8 m_temp_bitmap_sprites_pri; - uint32_t m_brt[4]; + u32 m_brt[4]; int m_brt_r; int m_brt_g; int m_brt_b; @@ -144,11 +147,12 @@ private: virtual void machine_reset() override; virtual void video_start() override; DECLARE_VIDEO_START(f1superb); - uint32_t screen_update_ms32(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + u32 screen_update_ms32(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + DECLARE_WRITE_LINE_MEMBER(screen_vblank_ms32); void irq_init(); void irq_raise(int level); void update_color(int color); - void draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &bitmap_pri, const rectangle &cliprect, uint16_t *sprram_top, size_t sprram_size, int gfxnum, int reverseorder); + void draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &bitmap_pri, const rectangle &cliprect, u16 *sprram_top, size_t sprram_size, int reverseorder); void draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect,int priority); void f1superb_map(address_map &map); void ms32_map(address_map &map); diff --git a/src/mame/includes/tetrisp2.h b/src/mame/includes/tetrisp2.h index 93bf1af326a..c69db37bad7 100644 --- a/src/mame/includes/tetrisp2.h +++ b/src/mame/includes/tetrisp2.h @@ -2,6 +2,7 @@ // copyright-holders:Luca Elia #include "machine/gen_latch.h" +#include "video/ms32_sprite.h" #include "emupal.h" #include "tilemap.h" @@ -12,6 +13,8 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_subcpu(*this, "sub"), + m_sprite(*this, "sprite"), + m_rocknms_sub_sprite(*this, "sub_sprite"), m_spriteram(*this, "spriteram"), m_spriteram2(*this, "spriteram2"), m_vram_fg(*this, "vram_fg"), @@ -97,10 +100,10 @@ protected: DECLARE_VIDEO_START(nndmseal); DECLARE_VIDEO_START(rockntread); DECLARE_VIDEO_START(rocknms); - uint32_t screen_update_tetrisp2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_rockntread(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_rocknms_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - uint32_t screen_update_rocknms_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + u32 screen_update_tetrisp2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update_rockntread(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update_rocknms_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + u32 screen_update_rocknms_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); TIMER_CALLBACK_MEMBER(rockn_timer_level4_callback); TIMER_CALLBACK_MEMBER(rockn_timer_sub_level4_callback); TIMER_CALLBACK_MEMBER(rockn_timer_level1_callback); @@ -119,45 +122,48 @@ protected: required_device m_maincpu; optional_device m_subcpu; - required_shared_ptr m_spriteram; - optional_shared_ptr m_spriteram2; - - uint16_t m_systemregs[0x10]; - required_shared_ptr m_vram_fg; - required_shared_ptr m_vram_bg; - required_shared_ptr m_vram_rot; - required_shared_ptr m_nvram; - required_shared_ptr m_scroll_fg; - required_shared_ptr m_scroll_bg; - required_shared_ptr m_rotregs; - std::unique_ptr m_priority; - optional_shared_ptr m_rocknms_sub_priority; - optional_shared_ptr m_rocknms_sub_vram_rot; - optional_shared_ptr m_rocknms_sub_vram_fg; - optional_shared_ptr m_rocknms_sub_vram_bg; - optional_shared_ptr m_rocknms_sub_scroll_fg; - optional_shared_ptr m_rocknms_sub_scroll_bg; - optional_shared_ptr m_rocknms_sub_rotregs; + required_device m_sprite; + optional_device m_rocknms_sub_sprite; + + required_shared_ptr m_spriteram; + optional_shared_ptr m_spriteram2; + + u16 m_systemregs[0x10]; + required_shared_ptr m_vram_fg; + required_shared_ptr m_vram_bg; + required_shared_ptr m_vram_rot; + required_shared_ptr m_nvram; + required_shared_ptr m_scroll_fg; + required_shared_ptr m_scroll_bg; + required_shared_ptr m_rotregs; + std::unique_ptr m_priority; + optional_shared_ptr m_rocknms_sub_priority; + optional_shared_ptr m_rocknms_sub_vram_rot; + optional_shared_ptr m_rocknms_sub_vram_fg; + optional_shared_ptr m_rocknms_sub_vram_bg; + optional_shared_ptr m_rocknms_sub_scroll_fg; + optional_shared_ptr m_rocknms_sub_scroll_bg; + optional_shared_ptr m_rocknms_sub_rotregs; required_device m_gfxdecode; optional_device m_sub_gfxdecode; required_device m_palette; optional_device m_sub_palette; - required_shared_ptr m_paletteram; - optional_shared_ptr m_sub_paletteram; + required_shared_ptr m_paletteram; + optional_shared_ptr m_sub_paletteram; output_finder<45> m_leds; - uint16_t m_rocknms_sub_systemregs[0x10]; - uint16_t m_rockn_protectdata; - uint16_t m_rockn_adpcmbank; - uint16_t m_rockn_soundvolume; + u16 m_rocknms_sub_systemregs[0x10]; + u16 m_rockn_protectdata; + u16 m_rockn_adpcmbank; + u16 m_rockn_soundvolume; emu_timer *m_rockn_timer_l4; emu_timer *m_rockn_timer_sub_l4; emu_timer *m_rockn_timer_l1; emu_timer *m_rockn_timer_sub_l1; int m_bank_lo; int m_bank_hi; - uint16_t m_rocknms_main2sub; - uint16_t m_rocknms_sub2main; + u16 m_rocknms_main2sub; + u16 m_rocknms_sub2main; int m_flipscreen_old; tilemap_t *m_tilemap_bg; tilemap_t *m_tilemap_fg; @@ -172,11 +178,11 @@ class stepstag_state : public tetrisp2_state public: stepstag_state(const machine_config &mconfig, device_type type, const char *tag) : tetrisp2_state(mconfig, type, tag), + m_vj_sprite_l(*this, "sprite_l"), + m_vj_sprite_m(*this, "sprite_m"), + m_vj_sprite_r(*this, "sprite_r"), m_spriteram1(*this, "spriteram1"), m_spriteram3(*this, "spriteram3"), - m_vj_gfxdecode_l(*this, "gfxdecode_l"), - m_vj_gfxdecode_m(*this, "gfxdecode_m"), - m_vj_gfxdecode_r(*this, "gfxdecode_r"), m_vj_palette_l(*this, "lpalette"), m_vj_palette_m(*this, "mpalette"), m_vj_palette_r(*this, "rpalette"), @@ -195,7 +201,7 @@ public: private: DECLARE_READ16_MEMBER(stepstag_coins_r); - uint16_t vj_upload_idx; + u16 vj_upload_idx; bool vj_upload_fini; DECLARE_WRITE16_MEMBER(stepstag_b00000_w); DECLARE_WRITE16_MEMBER(stepstag_b20000_w); @@ -211,27 +217,27 @@ private: DECLARE_WRITE16_MEMBER( stepstag_palette_mid_w ); DECLARE_WRITE16_MEMBER( stepstag_palette_right_w ); - 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); + u32 screen_update_stepstag_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + u32 screen_update_stepstag_mid(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + u32 screen_update_stepstag_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update_stepstag_main(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); // inline int mypal(int x); void stepstag_map(address_map &map); void stepstag_sub_map(address_map &map); void vjdash_map(address_map &map); - required_shared_ptr m_spriteram1; - required_shared_ptr m_spriteram3; - optional_device m_vj_gfxdecode_l; - optional_device m_vj_gfxdecode_m; - optional_device m_vj_gfxdecode_r; + optional_device m_vj_sprite_l; + optional_device m_vj_sprite_m; + optional_device m_vj_sprite_r; + required_shared_ptr m_spriteram1; + required_shared_ptr m_spriteram3; optional_device m_vj_palette_l; optional_device m_vj_palette_m; optional_device m_vj_palette_r; - optional_shared_ptr m_vj_paletteram_l; - optional_shared_ptr m_vj_paletteram_m; - optional_shared_ptr m_vj_paletteram_r; + optional_shared_ptr m_vj_paletteram_l; + optional_shared_ptr m_vj_paletteram_m; + optional_shared_ptr m_vj_paletteram_r; required_device m_soundlatch; - void convert_yuv422_to_rgb888(palette_device *paldev, uint16_t *palram,uint32_t offset); + void convert_yuv422_to_rgb888(palette_device *paldev, u16 *palram,u32 offset); }; diff --git a/src/mame/video/ms32.cpp b/src/mame/video/ms32.cpp index 5daac7b8a41..8ec947954e1 100644 --- a/src/mame/video/ms32.cpp +++ b/src/mame/video/ms32.cpp @@ -29,7 +29,7 @@ TILE_GET_INFO_MEMBER(ms32_state::get_ms32_tx_tile_info) tileno = m_txram[tile_index *2] & 0xffff; colour = m_txram[tile_index *2+1] & 0x000f; - SET_TILE_INFO_MEMBER(3,tileno,colour,0); + SET_TILE_INFO_MEMBER(2,tileno,colour,0); } TILE_GET_INFO_MEMBER(ms32_state::get_ms32_roz_tile_info) @@ -39,7 +39,7 @@ TILE_GET_INFO_MEMBER(ms32_state::get_ms32_roz_tile_info) tileno = m_rozram[tile_index *2] & 0xffff; colour = m_rozram[tile_index *2+1] & 0x000f; - SET_TILE_INFO_MEMBER(1,tileno,colour,0); + SET_TILE_INFO_MEMBER(0,tileno,colour,0); } TILE_GET_INFO_MEMBER(ms32_state::get_ms32_bg_tile_info) @@ -49,7 +49,7 @@ TILE_GET_INFO_MEMBER(ms32_state::get_ms32_bg_tile_info) tileno = m_bgram[tile_index *2] & 0xffff; colour = m_bgram[tile_index *2+1] & 0x000f; - SET_TILE_INFO_MEMBER(2,tileno,colour,0); + SET_TILE_INFO_MEMBER(1,tileno,colour,0); } TILE_GET_INFO_MEMBER(ms32_state::get_ms32_extra_tile_info) @@ -59,7 +59,7 @@ TILE_GET_INFO_MEMBER(ms32_state::get_ms32_extra_tile_info) tileno = m_f1superb_extraram[tile_index *2] & 0xffff; colour = m_f1superb_extraram[tile_index *2+1] & 0x000f; - SET_TILE_INFO_MEMBER(4,tileno,colour+0x50,0); + SET_TILE_INFO_MEMBER(3,tileno,colour+0x50,0); } @@ -71,6 +71,8 @@ void ms32_state::video_start() m_bg_tilemap_alt = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(ms32_state::get_ms32_bg_tile_info)), TILEMAP_SCAN_ROWS, 16,16, 256, 16); // alt layout, controller by register? m_roz_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(ms32_state::get_ms32_roz_tile_info)), TILEMAP_SCAN_ROWS, 16,16, 128,128); + size_t size = m_sprram.bytes() / 4; + m_sprram_buffer = make_unique_clear(size); /* set up tile layers */ m_screen->register_screen_bitmap(m_temp_bitmap_tilemaps); @@ -100,6 +102,7 @@ void ms32_state::video_start() // tp2m32 doesn't set the brightness registers so we need sensible defaults m_brt[0] = m_brt[1] = 0xffff; + save_pointer(NAME(m_sprram_buffer), size); save_item(NAME(m_irqreq)); save_item(NAME(m_temp_bitmap_tilemaps)); save_item(NAME(m_temp_bitmap_sprites)); @@ -198,17 +201,10 @@ WRITE32_MEMBER(ms32_state::ms32_gfxctrl_w) /* SPRITES based on tetrisp2 for now, readd priority bits later */ -void ms32_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &bitmap_pri, const rectangle &cliprect, uint16_t *sprram_top, size_t sprram_size, int gfxnum, int reverseorder) +void ms32_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &bitmap_pri, const rectangle &cliprect, u16 *sprram_top, size_t sprram_size, int reverseorder) { - int tx, ty, sx, sy, flipx, flipy; - int xsize, ysize; - int code, attr, color, size; - int pri; - int xzoom, yzoom; - gfx_element *gfx = m_gfxdecode->gfx(gfxnum); - - uint16_t *source = sprram_top; - uint16_t *finish = sprram_top + (sprram_size - 0x10) / 2; + u16 *source = sprram_top; + u16 *finish = sprram_top + (sprram_size - 0x10) / 2; if (reverseorder == 1) { @@ -218,52 +214,29 @@ void ms32_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &bitmap_pri, con for (;reverseorder ? (source>=finish) : (source> 0) & 0xff; - ty = (code >> 8) & 0xff; - - code = (color & 0x0fff); - color = (color >> 12) & 0xf; - size = source[ 3 ]; - - xsize = ((size >> 0) & 0xff) + 1; - ysize = ((size >> 8) & 0xff) + 1; - - sx = (source[5] & 0x3ff) - (source[5] & 0x400); - sy = (source[4] & 0x1ff) - (source[4] & 0x200); - - xzoom = (source[ 6 ]&0xffff); - yzoom = (source[ 7 ]&0xffff); - - { - if (!yzoom || !xzoom) - continue; - - yzoom = 0x1000000/yzoom; - xzoom = 0x1000000/xzoom; - } - - - gfx->set_source_clip(tx, xsize, ty, ysize); - - { - // passes the priority as the upper bits of the colour - // for post-processing in mixer instead - gfx->prio_zoom_transpen_raw(bitmap,cliprect, - code, - color<<8 | pri<<8, - flipx, flipy, - sx,sy, - xzoom, yzoom, bitmap_pri,0, 0); - } + bool disable; + u8 pri; + bool flipx, flipy; + u32 code, color; + u8 tx, ty; + u16 xsize, ysize; + s32 sx, sy; + u16 xzoom, yzoom; + + m_sprite->extract_parameters(true, false, source, disable, pri, flipx, flipy, code, color, tx, ty, xsize, ysize, sx, sy, xzoom, yzoom); + + if (disable || !xzoom || !yzoom) + continue; + + // passes the priority as the upper bits of the colour + // for post-processing in mixer instead + m_sprite->prio_zoom_transpen_raw(bitmap,cliprect, + code, + color<<8 | pri<<8, + flipx, flipy, + sx, sy, + tx, ty, xsize, ysize, + xzoom, yzoom, bitmap_pri, 0, 0); } /* end sprite loop */ } @@ -285,7 +258,7 @@ void ms32_state::draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const rec while (y <= maxy) { - uint16_t *lineaddr = m_lineram + 8 * (y & 0xff); + u16 *lineaddr = m_lineram + 8 * (y & 0xff); int start2x = (lineaddr[0x00/4] & 0xffff) | ((lineaddr[0x04/4] & 3) << 16); int start2y = (lineaddr[0x08/4] & 0xffff) | ((lineaddr[0x0c/4] & 3) << 16); @@ -350,7 +323,7 @@ void ms32_state::draw_roz(screen_device &screen, bitmap_ind16 &bitmap, const rec -uint32_t ms32_state::screen_update_ms32(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 ms32_state::screen_update_ms32(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int scrollx,scrolly; int asc_pri; @@ -395,7 +368,7 @@ uint32_t ms32_state::screen_update_ms32(screen_device &screen, bitmap_rgb32 &bit m_temp_bitmap_sprites.fill(0, cliprect); m_temp_bitmap_sprites_pri.fill(0, cliprect); - draw_sprites(m_temp_bitmap_sprites, m_temp_bitmap_sprites_pri, cliprect, m_sprram, 0x20000, 0, m_reverse_sprite_order); + draw_sprites(m_temp_bitmap_sprites, m_temp_bitmap_sprites_pri, cliprect, m_sprram_buffer.get(), 0x20000, m_reverse_sprite_order); // TODO: actually understand this (per-scanline priority and alpha-blend over every layer?) @@ -454,12 +427,12 @@ uint32_t ms32_state::screen_update_ms32(screen_device &screen, bitmap_rgb32 &bit int height = screen.height(); const pen_t *paldata = m_palette->pens(); - uint16_t* srcptr_tile; - uint8_t* srcptr_tilepri; - uint16_t* srcptr_spri; - //uint8_t* srcptr_spripri; + u16* srcptr_tile; + u8* srcptr_tilepri; + u16* srcptr_spri; + //u8* srcptr_spripri; - uint32_t* dstptr_bitmap; + u32* dstptr_bitmap; bitmap.fill(0, cliprect); @@ -472,12 +445,12 @@ uint32_t ms32_state::screen_update_ms32(screen_device &screen, bitmap_rgb32 &bit dstptr_bitmap = &bitmap.pix32(yy); for (xx=0;xx> 8); + u16 src_tile = srcptr_tile[xx]; + u8 src_tilepri = srcptr_tilepri[xx]; + u16 src_spri = srcptr_spri[xx]; + //u8 src_spripri;// = srcptr_spripri[xx]; + u16 spridat = ((src_spri&0x0fff)); + u8 spritepri = ((src_spri&0xf000) >> 8); int primask = 0; // get sprite priority value back out of bitmap/colour data (this is done in draw_sprite for standalone hw) @@ -722,6 +695,13 @@ uint32_t ms32_state::screen_update_ms32(screen_device &screen, bitmap_rgb32 &bit } - return 0; } + +WRITE_LINE_MEMBER(ms32_state::screen_vblank_ms32) +{ + if (state) + { + std::copy_n(&m_sprram[0], m_sprram.bytes() / 4, &m_sprram_buffer[0]); + } +} diff --git a/src/mame/video/ms32_sprite.cpp b/src/mame/video/ms32_sprite.cpp new file mode 100644 index 00000000000..7ad0fd84567 --- /dev/null +++ b/src/mame/video/ms32_sprite.cpp @@ -0,0 +1,1158 @@ +// license:BSD-3-Clause +// copyright-holders:Luca Elia,David Haywood,Paul Priest +/* + Jaleco Megasystem 32 sprite hardware + + TODO: + verify hardware configuration + + used by: + ms32.cpp + bnstars.cpp (Dual screen configuration) + tetrisp2.cpp (Slightly different - no zoom, etc) + + Sprite format (16 byte per each sprite): + Offset Bits Description + fedcba98 76543210 + 00 -xxxxxxx -------- Palette Select (some hardwares with YUV color format) + -------- xxxx---- Priority + -------- -----x-- Visible + -------- ------x- Flip Y + -------- -------x Flip X + 02 xxxxxxxx -------- Source Y offset (1 pixel each) + -------- xxxxxxxx Source X offset (1 pixel each) + 04 xxxx---- -------- Palette Select (most of hardwares) + ----xxxx xxxxxxxx Source Texture Select (each texture is 256 x 256 pixels) + 06 xxxxxxxx -------- Source Width - 1 (1 pixel each) + -------- xxxxxxxx Source Height - 1 (1 pixel each) + 08 ------xx xxxxxxxx Y (10 bits signed) + 0a -----xxx xxxxxxxx X (11 bits signed) + 0c xxxxxxxx xxxxxxxx Zoom X (some hardware disabled this, 0x200 = 50%, 0x100 = 100%, 0x80 = 200%)* + 0e xxxxxxxx xxxxxxxx Zoom Y (some hardware disabled this, 0x200 = 50%, 0x100 = 100%, 0x80 = 200%)* + + * : Source position add, 8.8 Fixed point +*/ + +#include "emu.h" +#include "ms32_sprite.h" +#include "drawgfxt.ipp" + +DEFINE_DEVICE_TYPE(JALECO_MEGASYSTEM32_SPRITE, ms32_sprite_device, "ms32spr", "Jaleco Megasystem 32 Sprite hardware") + +ms32_sprite_device::ms32_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, JALECO_MEGASYSTEM32_SPRITE, tag, owner, clock) + , device_gfx_interface(mconfig, *this, nullptr) + , m_color_base(0) + , m_color_entries(0x10) +{ +} + +/************************************* + * + * Graphics definitions + * + *************************************/ + +/* sprites are contained in 256x256 "tiles" */ +static const u32 sprite_xoffset[256] = +{ + STEP8(8*8*8*0, 8), STEP8(8*8*8*1, 8), STEP8(8*8*8*2, 8), STEP8(8*8*8*3, 8), + STEP8(8*8*8*4, 8), STEP8(8*8*8*5, 8), STEP8(8*8*8*6, 8), STEP8(8*8*8*7, 8), + STEP8(8*8*8*8, 8), STEP8(8*8*8*9, 8), STEP8(8*8*8*10, 8), STEP8(8*8*8*11, 8), + STEP8(8*8*8*12, 8), STEP8(8*8*8*13, 8), STEP8(8*8*8*14, 8), STEP8(8*8*8*15, 8), + STEP8(8*8*8*16, 8), STEP8(8*8*8*17, 8), STEP8(8*8*8*18, 8), STEP8(8*8*8*19, 8), + STEP8(8*8*8*20, 8), STEP8(8*8*8*21, 8), STEP8(8*8*8*22, 8), STEP8(8*8*8*23, 8), + STEP8(8*8*8*24, 8), STEP8(8*8*8*25, 8), STEP8(8*8*8*26, 8), STEP8(8*8*8*27, 8), + STEP8(8*8*8*28, 8), STEP8(8*8*8*29, 8), STEP8(8*8*8*30, 8), STEP8(8*8*8*31, 8) +}; +static const u32 sprite_yoffset[256] = +{ + STEP8(8*8*8*0, 8*8), STEP8(8*8*8*32, 8*8), STEP8(8*8*8*64, 8*8), STEP8(8*8*8*96, 8*8), + STEP8(8*8*8*128,8*8), STEP8(8*8*8*160,8*8), STEP8(8*8*8*192,8*8), STEP8(8*8*8*224,8*8), + STEP8(8*8*8*256,8*8), STEP8(8*8*8*288,8*8), STEP8(8*8*8*320,8*8), STEP8(8*8*8*352,8*8), + STEP8(8*8*8*384,8*8), STEP8(8*8*8*416,8*8), STEP8(8*8*8*448,8*8), STEP8(8*8*8*480,8*8), + STEP8(8*8*8*512,8*8), STEP8(8*8*8*544,8*8), STEP8(8*8*8*576,8*8), STEP8(8*8*8*608,8*8), + STEP8(8*8*8*640,8*8), STEP8(8*8*8*672,8*8), STEP8(8*8*8*704,8*8), STEP8(8*8*8*736,8*8), + STEP8(8*8*8*768,8*8), STEP8(8*8*8*800,8*8), STEP8(8*8*8*832,8*8), STEP8(8*8*8*864,8*8), + STEP8(8*8*8*896,8*8), STEP8(8*8*8*928,8*8), STEP8(8*8*8*960,8*8), STEP8(8*8*8*992,8*8) +}; +static const gfx_layout spritelayout = +{ + 256, 256, + RGN_FRAC(1,1), + 8, + { STEP8(0,1) }, + EXTENDED_XOFFS, + EXTENDED_YOFFS, + 256*256*8, + sprite_xoffset, + sprite_yoffset +}; + +GFXDECODE_MEMBER(ms32_sprite_device::gfxinfo) + GFXDECODE_DEVICE(DEVICE_SELF, 0, spritelayout, 0, 16) +GFXDECODE_END + +void ms32_sprite_device::device_start() +{ + // decode our graphics + decode_gfx(gfxinfo); + gfx(0)->set_colorbase(m_color_base); + gfx(0)->set_colors(m_color_entries); +} + +void ms32_sprite_device::extract_parameters(bool has_zoom, bool is_yuv, const u16 *ram, bool &disable, u8 &pri, bool &flipx, bool &flipy, u32 &code, u32 &color, u8 &tx, u8 &ty, u16 &srcwidth, u16 &srcheight, s32 &sx, s32 &sy, u16 &incx, u16 &incy) +{ + const u16 attr = ram[0]; + pri = ( attr & 0x00f0); + disable = (~attr & 0x0004); + + flipx = attr & 1; + flipy = attr & 2; + code = ram[1]; + color = ram[2]; + tx = (code >> 0) & 0xff; + ty = (code >> 8) & 0xff; + + code = (color & 0x0fff); + // encoded to first word when YUV sprites are used + if (is_yuv) + color = (attr & 0x7f00) >> 8; + else + color = (color >> 12) & 0xf; + const u16 size = ram[3]; + + srcwidth = ((size >> 0) & 0xff) + 1; + srcheight = ((size >> 8) & 0xff) + 1; + + sx = (ram[5] & 0x3ff) - (ram[5] & 0x400); + sy = (ram[4] & 0x1ff) - (ram[4] & 0x200); + + if (has_zoom) + { + incx = (ram[6] & 0xffff); + incy = (ram[7] & 0xffff); + } + else + { + incx = 0x100; + incy = 0x100; + + // hack for tetrisp2? + if (srcwidth > 0x100 - tx) + srcwidth = 0x100 - tx; + + if (srcheight > 0x100 - ty) + srcheight = 0x100 - ty; + } +} + +/*************************************************************************** + DRAWGFX IMPLEMENTATIONS +***************************************************************************/ + +/*------------------------------------------------- + opaque - render a gfx element with + no transparency +-------------------------------------------------*/ + +void ms32_sprite_device::opaque(bitmap_ind16 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight) +{ + // non-clip case + if (tx == 0 && ty == 0 && srcwidth == 0x100 && srcheight == 0x100) + gfx(0)->opaque(dest, cliprect, code, color, flipx, flipy, destx, desty); + + color = gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + code %= gfx(0)->elements(); + draw_sprite_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, [color](u16 &destp, const u8 &srcp) { PIXEL_OP_REBASE_OPAQUE(destp, srcp); }); +} + +void ms32_sprite_device::opaque(bitmap_rgb32 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight) +{ + // non-clip case + if (tx == 0 && ty == 0 && srcwidth == 0x100 && srcheight == 0x100) + gfx(0)->opaque(dest, cliprect, code, color, flipx, flipy, destx, desty); + + const pen_t *paldata = palette().pens() + gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + code %= gfx(0)->elements(); + draw_sprite_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, [paldata](u32 &destp, const u8 &srcp) { PIXEL_OP_REMAP_OPAQUE(destp, srcp); }); +} + +/*------------------------------------------------- + transpen - render a gfx element with + a single transparent pen +-------------------------------------------------*/ + +void ms32_sprite_device::transpen(bitmap_ind16 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 trans_pen) +{ + // non-clip case + if (tx == 0 && ty == 0 && srcwidth == 0x100 && srcheight == 0x100) + gfx(0)->transpen(dest, cliprect, code, color, flipx, flipy, destx, desty, trans_pen); + + // special case invalid pens to opaque + if (trans_pen > 0xff) + return opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight); + + // use pen usage to optimize + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage()) + { + // fully transparent; do nothing + u32 usage = gfx(0)->pen_usage(code); + if ((usage & ~(1 << trans_pen)) == 0) + return; + + // fully opaque; draw as such + if ((usage & (1 << trans_pen)) == 0) + return opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight); + } + + // render + color = gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + draw_sprite_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, [trans_pen, color](u16 &destp, const u8 &srcp) { PIXEL_OP_REBASE_TRANSPEN(destp, srcp); }); +} + +void ms32_sprite_device::transpen(bitmap_rgb32 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 trans_pen) +{ + // non-clip case + if (tx == 0 && ty == 0 && srcwidth == 0x100 && srcheight == 0x100) + gfx(0)->transpen(dest, cliprect, code, color, flipx, flipy, destx, desty, trans_pen); + + // special case invalid pens to opaque + if (trans_pen > 0xff) + return opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight); + + // use pen usage to optimize + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage()) + { + // fully transparent; do nothing + u32 usage = gfx(0)->pen_usage(code); + if ((usage & ~(1 << trans_pen)) == 0) + return; + + // fully opaque; draw as such + if ((usage & (1 << trans_pen)) == 0) + return opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight); + } + + // render + const pen_t *paldata = palette().pens() + gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + draw_sprite_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, [trans_pen, paldata](u32 &destp, const u8 &srcp) { PIXEL_OP_REMAP_TRANSPEN(destp, srcp); }); +} + + +/*------------------------------------------------- + transpen_raw - render a gfx element + with a single transparent pen and no color + lookups +-------------------------------------------------*/ + +void ms32_sprite_device::transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 trans_pen) +{ + // non-clip case + if (tx == 0 && ty == 0 && srcwidth == 0x100 && srcheight == 0x100) + gfx(0)->transpen_raw(dest, cliprect, code, color, flipx, flipy, destx, desty, trans_pen); + + // early out if completely transparent + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage() && (gfx(0)->pen_usage(code) & ~(1 << trans_pen)) == 0) + return; + + // render + draw_sprite_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, [trans_pen, color](u16 &destp, const u8 &srcp) { PIXEL_OP_REBASE_TRANSPEN(destp, srcp); }); +} + +void ms32_sprite_device::transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 trans_pen) +{ + // non-clip case + if (tx == 0 && ty == 0 && srcwidth == 0x100 && srcheight == 0x100) + gfx(0)->transpen_raw(dest, cliprect, code, color, flipx, flipy, destx, desty, trans_pen); + + // early out if completely transparent + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage() && (gfx(0)->pen_usage(code) & ~(1 << trans_pen)) == 0) + return; + + // render + draw_sprite_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, [trans_pen, color](u32 &destp, const u8 &srcp) { PIXEL_OP_REBASE_TRANSPEN(destp, srcp); }); +} + +/*************************************************************************** + DRAWGFXZOOM IMPLEMENTATIONS +***************************************************************************/ + +/*------------------------------------------------- + zoom_opaque - render a scaled gfx + element with no transparency +-------------------------------------------------*/ + +void ms32_sprite_device::zoom_opaque(bitmap_ind16 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 incx, u32 incy) +{ + // non-zoom case + if (incx == 0x100 && incy == 0x100) + return opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight); + + // render + color = gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + code %= gfx(0)->elements(); + draw_sprite_zoom_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, [color](u16 &destp, const u8 &srcp) { PIXEL_OP_REBASE_OPAQUE(destp, srcp); }); +} + +void ms32_sprite_device::zoom_opaque(bitmap_rgb32 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 incx, u32 incy) +{ + // non-zoom case + if (incx == 0x100 && incy == 0x100) + return opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight); + + // render + const pen_t *paldata = palette().pens() + gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + code %= gfx(0)->elements(); + draw_sprite_zoom_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, [paldata](u32 &destp, const u8 &srcp) { PIXEL_OP_REMAP_OPAQUE(destp, srcp); }); +} + + +/*------------------------------------------------- + zoom_transpen - render a scaled gfx + element with a single transparent pen +-------------------------------------------------*/ + +void ms32_sprite_device::zoom_transpen(bitmap_ind16 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 incx, u32 incy, u32 trans_pen) +{ + // non-zoom case + if (incx == 0x100 && incy == 0x100) + return transpen(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, trans_pen); + + // special case invalid pens to opaque + if (trans_pen > 0xff) + return zoom_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy); + + // use pen usage to optimize + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage()) + { + // fully transparent; do nothing + u32 usage = gfx(0)->pen_usage(code); + if ((usage & ~(1 << trans_pen)) == 0) + return; + + // fully opaque; draw as such + if ((usage & (1 << trans_pen)) == 0) + return zoom_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy); + } + + // render + color = gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + draw_sprite_zoom_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, [trans_pen, color](u16 &destp, const u8 &srcp) { PIXEL_OP_REBASE_TRANSPEN(destp, srcp); }); +} + +void ms32_sprite_device::zoom_transpen(bitmap_rgb32 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 incx, u32 incy, u32 trans_pen) +{ + // non-zoom case + if (incx == 0x100 && incy == 0x100) + return transpen(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, trans_pen); + + // special case invalid pens to opaque + if (trans_pen > 0xff) + return zoom_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy); + + // use pen usage to optimize + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage()) + { + // fully transparent; do nothing + u32 usage = gfx(0)->pen_usage(code); + if ((usage & ~(1 << trans_pen)) == 0) + return; + + // fully opaque; draw as such + if ((usage & (1 << trans_pen)) == 0) + return zoom_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy); + } + + // render + const pen_t *paldata = palette().pens() + gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + draw_sprite_zoom_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, [trans_pen, paldata](u32 &destp, const u8 &srcp) { PIXEL_OP_REMAP_TRANSPEN(destp, srcp); }); +} + + +/*------------------------------------------------- + zoom_transpen_raw - render a scaled gfx + element with a single transparent pen and no + color lookups +-------------------------------------------------*/ + +void ms32_sprite_device::zoom_transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 incx, u32 incy, u32 trans_pen) +{ + // non-zoom case + if (incx == 0x100 && incy == 0x100) + return transpen_raw(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, trans_pen); + + // early out if completely transparent + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage() && (gfx(0)->pen_usage(code) & ~(1 << trans_pen)) == 0) + return; + + // render + draw_sprite_zoom_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, [trans_pen, color](u16 &destp, const u8 &srcp) { PIXEL_OP_REBASE_TRANSPEN(destp, srcp); }); +} + +void ms32_sprite_device::zoom_transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 incx, u32 incy, u32 trans_pen) +{ + // non-zoom case + if (incx == 0x100 && incy == 0x100) + return transpen_raw(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, trans_pen); + + // early out if completely transparent + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage() && (gfx(0)->pen_usage(code) & ~(1 << trans_pen)) == 0) + return; + + // render + draw_sprite_zoom_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, [trans_pen, color](u32 &destp, const u8 &srcp) { PIXEL_OP_REBASE_TRANSPEN(destp, srcp); }); +} + +/*************************************************************************** + PDRAWGFX IMPLEMENTATIONS +***************************************************************************/ + +/*------------------------------------------------- + prio_opaque - render a gfx element with + no transparency, checking against the priority + bitmap +-------------------------------------------------*/ + +void ms32_sprite_device::prio_opaque(bitmap_ind16 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + bitmap_ind8 &priority, u32 pmask) +{ + // non-clip case + if (tx == 0 && ty == 0 && srcwidth == 0x100 && srcheight == 0x100) + gfx(0)->prio_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, priority, pmask); + + // high bit of the mask is implicitly on + pmask |= 1 << 31; + + // render + color = gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + code %= gfx(0)->elements(); + draw_sprite_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, [pmask, color](u16 &destp, u8 &pri, const u8 &srcp) { PIXEL_OP_REBASE_OPAQUE_PRIORITY(destp, pri, srcp); }); +} + +void ms32_sprite_device::prio_opaque(bitmap_rgb32 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + bitmap_ind8 &priority, u32 pmask) +{ + // non-clip case + if (tx == 0 && ty == 0 && srcwidth == 0x100 && srcheight == 0x100) + gfx(0)->prio_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, priority, pmask); + + // high bit of the mask is implicitly on + pmask |= 1 << 31; + + // render + const pen_t *paldata = palette().pens() + gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + code %= gfx(0)->elements(); + draw_sprite_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, [pmask, paldata](u32 &destp, u8 &pri, const u8 &srcp) { PIXEL_OP_REMAP_OPAQUE_PRIORITY(destp, pri, srcp); }); +} + + +/*------------------------------------------------- + prio_transpen - render a gfx element with + a single transparent pen, checking against the + priority bitmap +-------------------------------------------------*/ + +void ms32_sprite_device::prio_transpen(bitmap_ind16 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + bitmap_ind8 &priority, u32 pmask, u32 trans_pen) +{ + // non-clip case + if (tx == 0 && ty == 0 && srcwidth == 0x100 && srcheight == 0x100) + gfx(0)->prio_transpen(dest, cliprect, code, color, flipx, flipy, destx, desty, priority, pmask, trans_pen); + + // special case invalid pens to opaque + if (trans_pen > 0xff) + return prio_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, pmask); + + // use pen usage to optimize + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage()) + { + // fully transparent; do nothing + u32 usage = gfx(0)->pen_usage(code); + if ((usage & ~(1 << trans_pen)) == 0) + return; + + // fully opaque; draw as such + if ((usage & (1 << trans_pen)) == 0) + return prio_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, pmask); + } + + // high bit of the mask is implicitly on + pmask |= 1 << 31; + + // render + color = gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + draw_sprite_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, [pmask, trans_pen, color](u16 &destp, u8 &pri, const u8 &srcp) { PIXEL_OP_REBASE_TRANSPEN_PRIORITY(destp, pri, srcp); }); +} + +void ms32_sprite_device::prio_transpen(bitmap_rgb32 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + bitmap_ind8 &priority, u32 pmask, u32 trans_pen) +{ + // non-clip case + if (tx == 0 && ty == 0 && srcwidth == 0x100 && srcheight == 0x100) + gfx(0)->prio_transpen(dest, cliprect, code, color, flipx, flipy, destx, desty, priority, pmask, trans_pen); + + // special case invalid pens to opaque + if (trans_pen > 0xff) + return prio_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, pmask); + + // use pen usage to optimize + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage()) + { + // fully transparent; do nothing + u32 usage = gfx(0)->pen_usage(code); + if ((usage & ~(1 << trans_pen)) == 0) + return; + + // fully opaque; draw as such + if ((usage & (1 << trans_pen)) == 0) + return prio_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, pmask); + } + + // high bit of the mask is implicitly on + pmask |= 1 << 31; + + // render + const pen_t *paldata = palette().pens() + gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + draw_sprite_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, [pmask, trans_pen, paldata](u32 &destp, u8 &pri, const u8 &srcp) { PIXEL_OP_REMAP_TRANSPEN_PRIORITY(destp, pri, srcp); }); +} + +/*------------------------------------------------- + priotranspen_raw - render a gfx element + with a single transparent pen and no color + lookups, checking against the priority bitmap +-------------------------------------------------*/ + +void ms32_sprite_device::prio_transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + bitmap_ind8 &priority, u32 pmask, u32 trans_pen) +{ + // non-clip case + if (tx == 0 && ty == 0 && srcwidth == 0x100 && srcheight == 0x100) + gfx(0)->prio_transpen_raw(dest, cliprect, code, color, flipx, flipy, destx, desty, priority, pmask, trans_pen); + + // early out if completely transparent + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage() && (gfx(0)->pen_usage(code) & ~(1 << trans_pen)) == 0) + return; + + // high bit of the mask is implicitly on + pmask |= 1 << 31; + + // render + draw_sprite_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, [pmask, trans_pen, color](u16 &destp, u8 &pri, const u8 &srcp) { PIXEL_OP_REBASE_TRANSPEN_PRIORITY(destp, pri, srcp); }); +} + +void ms32_sprite_device::prio_transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + bitmap_ind8 &priority, u32 pmask, u32 trans_pen) +{ + // non-clip case + if (tx == 0 && ty == 0 && srcwidth == 0x100 && srcheight == 0x100) + gfx(0)->prio_transpen_raw(dest, cliprect, code, color, flipx, flipy, destx, desty, priority, pmask, trans_pen); + + // early out if completely transparent + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage() && (gfx(0)->pen_usage(code) & ~(1 << trans_pen)) == 0) + return; + + // high bit of the mask is implicitly on + pmask |= 1 << 31; + + // render + draw_sprite_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, [pmask, trans_pen, color](u32 &destp, u8 &pri, const u8 &srcp) { PIXEL_OP_REBASE_TRANSPEN_PRIORITY(destp, pri, srcp); }); +} + +/*************************************************************************** + PDRAWGFXZOOM IMPLEMENTATIONS +***************************************************************************/ + +/*------------------------------------------------- + prio_zoom_opaque - render a scaled gfx + element with no transparency, checking against + the priority bitmap +-------------------------------------------------*/ + +void ms32_sprite_device::prio_zoom_opaque(bitmap_ind16 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 incx, u32 incy, bitmap_ind8 &priority, u32 pmask) +{ + // non-zoom case + if (incx == 0x100 && incy == 0x100) + return prio_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, pmask); + + // high bit of the mask is implicitly on + pmask |= 1 << 31; + + // render + color = gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + code %= gfx(0)->elements(); + draw_sprite_zoom_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, priority, [pmask, color](u16 &destp, u8 &pri, const u8 &srcp) { PIXEL_OP_REBASE_OPAQUE_PRIORITY(destp, pri, srcp); }); +} + +void ms32_sprite_device::prio_zoom_opaque(bitmap_rgb32 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 incx, u32 incy, bitmap_ind8 &priority, u32 pmask) +{ + // non-zoom case + if (incx == 0x100 && incy == 0x100) + return prio_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, pmask); + + // high bit of the mask is implicitly on + pmask |= 1 << 31; + + // render + const pen_t *paldata = palette().pens() + gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + code %= gfx(0)->elements(); + draw_sprite_zoom_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, priority, [pmask, paldata](u32 &destp, u8 &pri, const u8 &srcp) { PIXEL_OP_REMAP_OPAQUE_PRIORITY(destp, pri, srcp); }); +} + + +/*------------------------------------------------- + prio_zoom_transpen - render a scaled gfx + element with a single transparent pen, + checking against the priority bitmap +-------------------------------------------------*/ + +void ms32_sprite_device::prio_zoom_transpen(bitmap_ind16 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 incx, u32 incy, bitmap_ind8 &priority, u32 pmask, + u32 trans_pen) +{ + // non-zoom case + if (incx == 0x100 && incy == 0x100) + return prio_transpen(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, pmask, trans_pen); + + // special case invalid pens to opaque + if (trans_pen > 0xff) + return prio_zoom_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, priority, pmask); + + // use pen usage to optimize + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage()) + { + // fully transparent; do nothing + u32 usage = gfx(0)->pen_usage(code); + if ((usage & ~(1 << trans_pen)) == 0) + return; + + // fully opaque; draw as such + if ((usage & (1 << trans_pen)) == 0) + return prio_zoom_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, priority, pmask); + } + + // high bit of the mask is implicitly on + pmask |= 1 << 31; + + // render + color = gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + draw_sprite_zoom_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, priority, [pmask, trans_pen, color](u16 &destp, u8 &pri, const u8 &srcp) { PIXEL_OP_REBASE_TRANSPEN_PRIORITY(destp, pri, srcp); }); +} + +void ms32_sprite_device::prio_zoom_transpen(bitmap_rgb32 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 incx, u32 incy, bitmap_ind8 &priority, u32 pmask, + u32 trans_pen) +{ + // non-zoom case + if (incx == 0x100 && incy == 0x100) + return prio_transpen(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, pmask, trans_pen); + + // special case invalid pens to opaque + if (trans_pen > 0xff) + return prio_zoom_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, priority, pmask); + + // use pen usage to optimize + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage()) + { + // fully transparent; do nothing + u32 usage = gfx(0)->pen_usage(code); + if ((usage & ~(1 << trans_pen)) == 0) + return; + + // fully opaque; draw as such + if ((usage & (1 << trans_pen)) == 0) + return prio_zoom_opaque(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, priority, pmask); + } + + // high bit of the mask is implicitly on + pmask |= 1 << 31; + + // render + const pen_t *paldata = palette().pens() + gfx(0)->colorbase() + gfx(0)->granularity() * (color % gfx(0)->colors()); + draw_sprite_zoom_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, priority, [pmask, trans_pen, paldata](u32 &destp, u8 &pri, const u8 &srcp) { PIXEL_OP_REMAP_TRANSPEN_PRIORITY(destp, pri, srcp); }); +} + + +/*------------------------------------------------- + prio_zoom_transpen_raw - render a scaled gfx + element with a single transparent pen and no + color lookups, checking against the priority + bitmap +-------------------------------------------------*/ + +void ms32_sprite_device::prio_zoom_transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 incx, u32 incy, bitmap_ind8 &priority, u32 pmask, + u32 trans_pen) +{ + // non-zoom case + if (incx == 0x100 && incy == 0x100) + return prio_transpen_raw(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, pmask, trans_pen); + + // early out if completely transparent + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage() && (gfx(0)->pen_usage(code) & ~(1 << trans_pen)) == 0) + return; + + // high bit of the mask is implicitly on + pmask |= 1 << 31; + + // render + draw_sprite_zoom_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, priority, [pmask, trans_pen, color](u16 &destp, u8 &pri, const u8 &srcp) { PIXEL_OP_REBASE_TRANSPEN_PRIORITY(destp, pri, srcp); }); +} + +void ms32_sprite_device::prio_zoom_transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, + u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, + u32 incx, u32 incy, bitmap_ind8 &priority, u32 pmask, + u32 trans_pen) +{ + // non-zoom case + if (incx == 0x100 && incy == 0x100) + return prio_transpen_raw(dest, cliprect, code, color, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, priority, pmask, trans_pen); + + // early out if completely transparent + code %= gfx(0)->elements(); + if (gfx(0)->has_pen_usage() && (gfx(0)->pen_usage(code) & ~(1 << trans_pen)) == 0) + return; + + // high bit of the mask is implicitly on + pmask |= 1 << 31; + + // render + draw_sprite_zoom_core(dest, cliprect, code, flipx, flipy, destx, desty, tx, ty, srcwidth, srcheight, incx, incy, priority, [pmask, trans_pen, color](u32 &destp, u8 &pri, const u8 &srcp) { PIXEL_OP_REBASE_TRANSPEN_PRIORITY(destp, pri, srcp); }); +} + +/*************************************************************************** + BASIC DRAWGFX CORE +***************************************************************************/ + +/* + Input parameters: + bitmap_t &dest - the bitmap to render to + const rectangle &cliprect - a clipping rectangle (assumed to be clipped to the size of 'dest') + gfx_element *gfx - pointer to the gfx_element to render + u32 code - index of the entry within gfx_element + int flipx - non-zero means render right-to-left instead of left-to-right + int flipy - non-zero means render bottom-to-top instead of top-to-bottom + s32 destx - the top-left X coordinate to render to + s32 desty - the top-left Y coordinate to render to + bitmap_t &priority - the priority bitmap (if and only if priority is to be applied) +*/ + + +template +inline void ms32_sprite_device::draw_sprite_core(BitmapType &dest, const rectangle &cliprect, u32 code, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, FunctionClass pixel_op) +{ + g_profiler.start(PROFILER_DRAWGFX); + do { + assert(dest.valid()); + assert(dest.cliprect().contains(cliprect)); + assert(code < elements()); + + // ignore empty/invalid cliprects + if (cliprect.empty()) + break; + + // compute final pixel in X and exit if we are entirely clipped + s32 destendx = destx + srcwidth - 1; + if (destx > cliprect.right() || destendx < cliprect.left()) + break; + + // apply left clip + u32 srcx = 0; + if (destx < cliprect.left()) + { + srcx = cliprect.left() - destx; + destx = cliprect.left(); + } + + // apply right clip + if (destendx > cliprect.right()) + destendx = cliprect.right(); + + // compute final pixel in Y and exit if we are entirely clipped + s32 destendy = desty + srcheight - 1; + if (desty > cliprect.bottom() || destendy < cliprect.top()) + break; + + // apply top clip + u32 srcy = 0; + if (desty < cliprect.top()) + { + srcy = cliprect.top() - desty; + desty = cliprect.top(); + } + + // apply bottom clip + if (destendy > cliprect.bottom()) + destendy = cliprect.bottom(); + + // apply X flipping + s32 dx = 1; + if (flipx) + { + srcx = srcwidth - 1 - srcx; + dx = -dx; + } + + // apply Y flipping + s32 dy = 1; + if (flipy) + { + srcy = srcheight - 1 - srcy; + dy = -dy; + } + + // fetch the source data + const u8 *srcdata = gfx(0)->get_data(code); + + // compute how many blocks of 4 pixels we have + u32 numblocks = (destendx + 1 - destx) / 4; + u32 leftovers = (destendx + 1 - destx) - 4 * numblocks; + + // iterate over pixels in Y + for (s32 cury = desty; cury <= destendy; cury++) + { + u32 drawy = ty + srcy; + srcy += dy; + if (drawy >= gfx(0)->height()) + continue; + + auto *destptr = &dest.pix(cury, destx); + const u8 *srcptr = srcdata + (drawy * gfx(0)->rowbytes()); + + u32 cursrcx = srcx; + // iterate over unrolled blocks of 4 + for (s32 curx = 0; curx < numblocks; curx++) + { + if (tx + cursrcx < gfx(0)->width()) { pixel_op(destptr[0], srcptr[tx + cursrcx]); } cursrcx += dx; + if (tx + cursrcx < gfx(0)->width()) { pixel_op(destptr[1], srcptr[tx + cursrcx]); } cursrcx += dx; + if (tx + cursrcx < gfx(0)->width()) { pixel_op(destptr[2], srcptr[tx + cursrcx]); } cursrcx += dx; + if (tx + cursrcx < gfx(0)->width()) { pixel_op(destptr[3], srcptr[tx + cursrcx]); } cursrcx += dx; + + destptr += 4; + } + + // iterate over leftover pixels + for (s32 curx = 0; curx < leftovers; curx++) + { + if (tx + cursrcx < gfx(0)->width()) { pixel_op(destptr[0], srcptr[tx + cursrcx]); } cursrcx += dx; + destptr++; + } + } + } while (0); + g_profiler.stop(); +} + + +template +inline void ms32_sprite_device::draw_sprite_core(BitmapType &dest, const rectangle &cliprect, u32 code, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, PriorityType &priority, FunctionClass pixel_op) +{ + g_profiler.start(PROFILER_DRAWGFX); + do { + assert(dest.valid()); + assert(priority.valid()); + assert(dest.cliprect().contains(cliprect)); + assert(code < elements()); + + // ignore empty/invalid cliprects + if (cliprect.empty()) + break; + + // compute final pixel in X and exit if we are entirely clipped + s32 destendx = destx + srcwidth - 1; + if (destx > cliprect.right() || destendx < cliprect.left()) + break; + + // apply left clip + u32 srcx = 0; + if (destx < cliprect.left()) + { + srcx = cliprect.left() - destx; + destx = cliprect.left(); + } + + // apply right clip + if (destendx > cliprect.right()) + destendx = cliprect.right(); + + // compute final pixel in Y and exit if we are entirely clipped + s32 destendy = desty + srcheight - 1; + if (desty > cliprect.bottom() || destendy < cliprect.top()) + break; + + // apply top clip + u32 srcy = 0; + if (desty < cliprect.top()) + { + srcy = cliprect.top() - desty; + desty = cliprect.top(); + } + + // apply bottom clip + if (destendy > cliprect.bottom()) + destendy = cliprect.bottom(); + + // apply X flipping + s32 dx = 1; + if (flipx) + { + srcx = srcwidth - 1 - srcx; + dx = -dx; + } + + // apply Y flipping + s32 dy = 1; + if (flipy) + { + srcy = srcheight - 1 - srcy; + dy = -dy; + } + + // fetch the source data + const u8 *srcdata = gfx(0)->get_data(code); + + // compute how many blocks of 4 pixels we have + u32 numblocks = (destendx + 1 - destx) / 4; + u32 leftovers = (destendx + 1 - destx) - 4 * numblocks; + + // iterate over pixels in Y + for (s32 cury = desty; cury <= destendy; cury++) + { + u32 drawy = ty + srcy; + srcy += dy; + if (drawy >= gfx(0)->height()) + continue; + + auto *priptr = &priority.pix(cury, destx); + auto *destptr = &dest.pix(cury, destx); + const u8 *srcptr = srcdata + (drawy * gfx(0)->rowbytes()); + + u32 cursrcx = srcx; + // iterate over unrolled blocks of 4 + for (s32 curx = 0; curx < numblocks; curx++) + { + if (tx + cursrcx < gfx(0)->width()) { pixel_op(destptr[0], priptr[0], srcptr[tx + cursrcx]); } cursrcx += dx; + if (tx + cursrcx < gfx(0)->width()) { pixel_op(destptr[1], priptr[1], srcptr[tx + cursrcx]); } cursrcx += dx; + if (tx + cursrcx < gfx(0)->width()) { pixel_op(destptr[2], priptr[2], srcptr[tx + cursrcx]); } cursrcx += dx; + if (tx + cursrcx < gfx(0)->width()) { pixel_op(destptr[3], priptr[3], srcptr[tx + cursrcx]); } cursrcx += dx; + + destptr += 4; + priptr += 4; + } + + // iterate over leftover pixels + for (s32 curx = 0; curx < leftovers; curx++) + { + if (tx + cursrcx < gfx(0)->width()) { pixel_op(destptr[0], priptr[0], srcptr[tx + cursrcx]); } cursrcx += dx; + destptr++; + priptr++; + } + } + } while (0); + g_profiler.stop(); +} +/*************************************************************************** + BASIC DRAWGFXZOOM CORE +***************************************************************************/ + +/* + Input parameters: + bitmap_t &dest - the bitmap to render to + const rectangle &cliprect - a clipping rectangle (assumed to be clipped to the size of 'dest') + gfx_element *gfx - pointer to the gfx_element to render + u32 code - index of the entry within gfx_element + int flipx - non-zero means render right-to-left instead of left-to-right + int flipy - non-zero means render bottom-to-top instead of top-to-bottom + s32 destx - the top-left X coordinate to render to + s32 desty - the top-left Y coordinate to render to + u32 scalex - the 16.16 scale factor in the X dimension + u32 scaley - the 16.16 scale factor in the Y dimension + bitmap_t &priority - the priority bitmap (if and only if priority is to be applied) +*/ + + +template +inline void ms32_sprite_device::draw_sprite_zoom_core(BitmapType &dest, const rectangle &cliprect, u32 code, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy, FunctionClass pixel_op) +{ + if (!incx || !incy) + return; + + g_profiler.start(PROFILER_DRAWGFX); + do { + assert(dest.valid()); + assert(dest.cliprect().contains(cliprect)); + + // ignore empty/invalid cliprects + if (cliprect.empty()) + break; + + s32 srcstartx = tx << 8; + s32 srcstarty = ty << 8; + s32 srcendx = srcwidth << 8; + s32 srcendy = srcheight << 8; + // apply left clip + u32 srcx = 0; + if (destx < cliprect.left()) + { + srcx = (cliprect.left() - destx) * incx; + destx = cliprect.left(); + } + if (srcx >= srcendx) + break; + + // apply top clip + u32 srcy = 0; + if (desty < cliprect.top()) + { + srcy = (cliprect.top() - desty) * incy; + desty = cliprect.top(); + } + if (srcy >= srcendy) + break; + + // fetch the source data + const u8 *srcdata = gfx(0)->get_data(code); + + // iterate over pixels in Y + for (s32 cury = desty; (cury <= cliprect.bottom()) && (srcy < srcendy); cury++, srcy += incy) + { + u32 drawy = (srcstarty + (flipy ? (srcendy - srcy - 1) : srcy)) >> 8; + if (drawy >= gfx(0)->height()) + continue; + + auto *destptr = &dest.pix(cury); + const u8 *srcptr = srcdata + drawy * gfx(0)->rowbytes(); + u32 cursrcx = srcx; + + // iterate over pixels + for (s32 curx = destx; (curx <= cliprect.right()) && (cursrcx < srcendx); curx++, cursrcx += incx) + { + u32 drawx = (srcstartx + (flipx ? (srcendx - cursrcx - 1) : cursrcx)) >> 8; + if (drawx >= gfx(0)->width()) + continue; + + pixel_op(destptr[curx], srcptr[drawx]); + } + } + } while (0); + g_profiler.stop(); +} + + +template +inline void ms32_sprite_device::draw_sprite_zoom_core(BitmapType &dest, const rectangle &cliprect, u32 code, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy, PriorityType &priority, FunctionClass pixel_op) +{ + if (!incx || !incy) + return; + + g_profiler.start(PROFILER_DRAWGFX); + do { + assert(dest.valid()); + assert(priority.valid()); + assert(dest.cliprect().contains(cliprect)); + + // ignore empty/invalid cliprects + if (cliprect.empty()) + break; + + s32 srcstartx = tx << 8; + s32 srcstarty = ty << 8; + s32 srcendx = srcwidth << 8; + s32 srcendy = srcheight << 8; + // apply left clip + u32 srcx = 0; + if (destx < cliprect.left()) + { + srcx = (cliprect.left() - destx) * incx; + destx = cliprect.left(); + } + if (srcx >= srcendx) + break; + + // apply top clip + u32 srcy = 0; + if (desty < cliprect.top()) + { + srcy = (cliprect.top() - desty) * incy; + desty = cliprect.top(); + } + if (srcy >= srcendy) + break; + + // fetch the source data + const u8 *srcdata = gfx(0)->get_data(code); + + // iterate over pixels in Y + for (s32 cury = desty; (cury <= cliprect.bottom()) && (srcy < srcendy); cury++, srcy += incy) + { + u32 drawy = (srcstarty + (flipy ? (srcendy - srcy - 1) : srcy)) >> 8; + if (drawy >= gfx(0)->height()) + continue; + + auto *priptr = &priority.pix(cury); + auto *destptr = &dest.pix(cury); + const u8 *srcptr = srcdata + drawy * gfx(0)->rowbytes(); + u32 cursrcx = srcx; + + // iterate over pixels + for (s32 curx = destx; (curx <= cliprect.right()) && (cursrcx < srcendx); curx++, cursrcx += incx) + { + u32 drawx = (srcstartx + (flipx ? (srcendx - cursrcx - 1) : cursrcx)) >> 8; + if (drawx >= gfx(0)->width()) + continue; + + pixel_op(destptr[curx], priptr[curx], srcptr[drawx]); + } + } + } while (0); + g_profiler.stop(); +} diff --git a/src/mame/video/ms32_sprite.h b/src/mame/video/ms32_sprite.h new file mode 100644 index 00000000000..cac0b6bd048 --- /dev/null +++ b/src/mame/video/ms32_sprite.h @@ -0,0 +1,90 @@ +// license:BSD-3-Clause +// copyright-holders:Luca Elia,David Haywood,Paul Priest +/* + Jaleco Megasystem 32 sprite hardware +*/ + +#ifndef MAME_VIDEO_MS32_SPRITE_H +#define MAME_VIDEO_MS32_SPRITE_H + +#pragma once + +class ms32_sprite_device : public device_t, public device_gfx_interface +{ +public: + // construction + ms32_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + // configuration + void set_color_base(u16 base) { m_color_base = base; } + void set_color_entries(u16 entries) { m_color_entries = entries; } + + void extract_parameters(bool has_zoom, bool is_yuv, const u16 *ram, bool &disable, u8 &pri, bool &flipx, bool &flipy, u32 &code, u32 &color, u8 &tx, u8 &ty, u16 &srcwidth, u16 &srcheight, s32 &sx, s32 &sy, u16 &incx, u16 &incy); + + // ----- core graphics drawing ----- + + // core drawgfx implementation + template void draw_sprite_core(BitmapType &dest, const rectangle &cliprect, u32 code, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, FunctionClass pixel_op); + + // specific drawgfx implementations for each transparency type + void opaque(bitmap_ind16 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight); + void opaque(bitmap_rgb32 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight); + void transpen(bitmap_ind16 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 trans_pen); + void transpen(bitmap_rgb32 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 trans_pen); + void transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 trans_pen); + void transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 trans_pen); + + // ----- zoomed graphics drawing ----- + + // core zoom implementation + template void draw_sprite_zoom_core(BitmapType &dest, const rectangle &cliprect, u32 code, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy, FunctionClass pixel_op); + + // specific zoom implementations for each transparency type + void zoom_opaque(bitmap_ind16 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy); + void zoom_opaque(bitmap_rgb32 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy); + void zoom_transpen(bitmap_ind16 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy, u32 trans_pen); + void zoom_transpen(bitmap_rgb32 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy, u32 trans_pen); + void zoom_transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy, u32 trans_pen); + void zoom_transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy, u32 trans_pen); + + // ----- priority masked graphics drawing ----- + + // core prio implementation + template void draw_sprite_core(BitmapType &dest, const rectangle &cliprect, u32 code, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, PriorityType &priority, FunctionClass pixel_op); + + // specific prio implementations for each transparency type + void prio_opaque(bitmap_ind16 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, bitmap_ind8 &priority, u32 pmask); + void prio_opaque(bitmap_rgb32 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, bitmap_ind8 &priority, u32 pmask); + void prio_transpen(bitmap_ind16 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, bitmap_ind8 &priority, u32 pmask, u32 trans_pen); + void prio_transpen(bitmap_rgb32 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, bitmap_ind8 &priority, u32 pmask, u32 trans_pen); + void prio_transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, bitmap_ind8 &priority, u32 pmask, u32 trans_pen); + void prio_transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, bitmap_ind8 &priority, u32 pmask, u32 trans_pen); + + // ----- priority masked zoomed graphics drawing ----- + + // core prio_zoom implementation + template void draw_sprite_zoom_core(BitmapType &dest, const rectangle &cliprect, u32 code, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy, PriorityType &priority, FunctionClass pixel_op); + + // specific prio_zoom implementations for each transparency type + void prio_zoom_opaque(bitmap_ind16 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy, bitmap_ind8 &priority, u32 pmask); + void prio_zoom_opaque(bitmap_rgb32 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy, bitmap_ind8 &priority, u32 pmask); + void prio_zoom_transpen(bitmap_ind16 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy, bitmap_ind8 &priority, u32 pmask, u32 trans_pen); + void prio_zoom_transpen(bitmap_rgb32 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy, bitmap_ind8 &priority, u32 pmask, u32 trans_pen); + void prio_zoom_transpen_raw(bitmap_ind16 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy, bitmap_ind8 &priority, u32 pmask, u32 trans_pen); + void prio_zoom_transpen_raw(bitmap_rgb32 &dest, const rectangle &cliprect, u32 code, u32 color, int flipx, int flipy, s32 destx, s32 desty, u32 tx, u32 ty, u32 srcwidth, u32 srcheight, u32 incx, u32 incy, bitmap_ind8 &priority, u32 pmask, u32 trans_pen); + +protected: + // device_t overrides + virtual void device_start() override; + +private: + // decoding info + DECLARE_GFXDECODE_MEMBER(gfxinfo); + + // configurations + u16 m_color_base, m_color_entries; +}; + +DECLARE_DEVICE_TYPE(JALECO_MEGASYSTEM32_SPRITE, ms32_sprite_device) + +#endif // MAME_VIDEO_MS32_SPRITE_H diff --git a/src/mame/video/tetrisp2.cpp b/src/mame/video/tetrisp2.cpp index 4ed9b005e0a..4a67a209021 100644 --- a/src/mame/video/tetrisp2.cpp +++ b/src/mame/video/tetrisp2.cpp @@ -114,9 +114,9 @@ WRITE16_MEMBER(tetrisp2_state::rocknms_sub_priority_w) TILE_GET_INFO_MEMBER(tetrisp2_state::get_tile_info_bg) { - uint16_t code_hi = m_vram_bg[ 2 * tile_index + 0]; - uint16_t code_lo = m_vram_bg[ 2 * tile_index + 1]; - SET_TILE_INFO_MEMBER(1, + u16 code_hi = m_vram_bg[ 2 * tile_index + 0]; + u16 code_lo = m_vram_bg[ 2 * tile_index + 1]; + SET_TILE_INFO_MEMBER(0, code_hi, code_lo & 0xf, 0); @@ -134,9 +134,9 @@ WRITE16_MEMBER(tetrisp2_state::tetrisp2_vram_bg_w) TILE_GET_INFO_MEMBER(tetrisp2_state::get_tile_info_fg) { - uint16_t code_hi = m_vram_fg[ 2 * tile_index + 0]; - uint16_t code_lo = m_vram_fg[ 2 * tile_index + 1]; - SET_TILE_INFO_MEMBER(3, + u16 code_hi = m_vram_fg[ 2 * tile_index + 0]; + u16 code_lo = m_vram_fg[ 2 * tile_index + 1]; + SET_TILE_INFO_MEMBER(2, code_hi, code_lo & 0xf, 0); @@ -151,9 +151,9 @@ WRITE16_MEMBER(tetrisp2_state::tetrisp2_vram_fg_w) TILE_GET_INFO_MEMBER(tetrisp2_state::get_tile_info_rot) { - uint16_t code_hi = m_vram_rot[ 2 * tile_index + 0]; - uint16_t code_lo = m_vram_rot[ 2 * tile_index + 1]; - SET_TILE_INFO_MEMBER(2, + u16 code_hi = m_vram_rot[ 2 * tile_index + 0]; + u16 code_lo = m_vram_rot[ 2 * tile_index + 1]; + SET_TILE_INFO_MEMBER(1, code_hi, code_lo & 0xf, 0); @@ -167,9 +167,9 @@ WRITE16_MEMBER(tetrisp2_state::tetrisp2_vram_rot_w) TILE_GET_INFO_MEMBER(tetrisp2_state::get_tile_info_rocknms_sub_bg) { - uint16_t code_hi = m_rocknms_sub_vram_bg[ 2 * tile_index + 0]; - uint16_t code_lo = m_rocknms_sub_vram_bg[ 2 * tile_index + 1]; - SET_TILE_INFO_MEMBER(1, + u16 code_hi = m_rocknms_sub_vram_bg[ 2 * tile_index + 0]; + u16 code_lo = m_rocknms_sub_vram_bg[ 2 * tile_index + 1]; + SET_TILE_INFO_MEMBER(0, code_hi, code_lo & 0xf, 0); @@ -184,9 +184,9 @@ WRITE16_MEMBER(tetrisp2_state::rocknms_sub_vram_bg_w) TILE_GET_INFO_MEMBER(tetrisp2_state::get_tile_info_rocknms_sub_fg) { - uint16_t code_hi = m_rocknms_sub_vram_fg[ 2 * tile_index + 0]; - uint16_t code_lo = m_rocknms_sub_vram_fg[ 2 * tile_index + 1]; - SET_TILE_INFO_MEMBER(3, + u16 code_hi = m_rocknms_sub_vram_fg[ 2 * tile_index + 0]; + u16 code_lo = m_rocknms_sub_vram_fg[ 2 * tile_index + 1]; + SET_TILE_INFO_MEMBER(2, code_hi, code_lo & 0xf, 0); @@ -201,9 +201,9 @@ WRITE16_MEMBER(tetrisp2_state::rocknms_sub_vram_fg_w) TILE_GET_INFO_MEMBER(tetrisp2_state::get_tile_info_rocknms_sub_rot) { - uint16_t code_hi = m_rocknms_sub_vram_rot[ 2 * tile_index + 0]; - uint16_t code_lo = m_rocknms_sub_vram_rot[ 2 * tile_index + 1]; - SET_TILE_INFO_MEMBER(2, + u16 code_hi = m_rocknms_sub_vram_rot[ 2 * tile_index + 0]; + u16 code_lo = m_rocknms_sub_vram_rot[ 2 * tile_index + 1]; + SET_TILE_INFO_MEMBER(1, code_hi, code_lo & 0xf, 0); @@ -229,7 +229,7 @@ VIDEO_START_MEMBER(tetrisp2_state,tetrisp2) m_tilemap_rot->set_transparent_pen(0); // should be smaller and mirrored like m32 I guess - m_priority = std::make_unique(0x40000); + m_priority = std::make_unique(0x40000); save_item(NAME(m_flipscreen_old)); save_pointer(NAME(m_priority), 0x40000); @@ -254,7 +254,7 @@ VIDEO_START_MEMBER(tetrisp2_state,rockntread) m_tilemap_rot->set_transparent_pen(0); // should be smaller and mirrored like m32 I guess - m_priority = std::make_unique(0x40000); + m_priority = std::make_unique(0x40000); save_item(NAME(m_flipscreen_old)); save_pointer(NAME(m_priority), 0x40000); @@ -317,64 +317,30 @@ VIDEO_START_MEMBER(tetrisp2_state,rocknms) -- it appears that sprites which should be shadows are often rendered *UNDER* the tilemaps, maybe related? */ template -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, bool is_yuv ) +static void tetrisp2_draw_sprites(_BitmapClass &bitmap, bitmap_ind8 &bitmap_pri, const rectangle &cliprect, u8* priority_ram, + u16 *sprram_top, size_t sprram_size, ms32_sprite_device *chip, int flip, bool is_yuv) { - int tx, ty, sx, sy, flipx, flipy; - int xsize, ysize; - int code, attr, color, size; - int pri; - int xzoom, yzoom; - uint32_t primask; - - uint16_t *source = sprram_top; - uint16_t *finish = sprram_top + (sprram_size - 0x10) / 2; + u16 *source = sprram_top; + u16 *finish = sprram_top + (sprram_size - 0x10) / 2; for (; sourceextract_parameters(false, is_yuv, source, disable, pri, flipx, flipy, code, color, tx, ty, xsize, ysize, sx, sy, xzoom, yzoom); + + if (disable || !xzoom || !yzoom) continue; - flipx = attr & 1; - flipy = attr & 2; - - code = source[ 1 ]; - color = source[ 2 ]; - - tx = (code >> 0) & 0xff; - ty = (code >> 8) & 0xff; - - code = (color & 0x0fff); - // encoded to first word when YUV sprites are used - if(is_yuv) - color = (attr & 0x7f00) >> 8; - else - color = (color >> 12) & 0xf; - size = source[ 3 ]; - - xsize = ((size >> 0) & 0xff) + 1; - ysize = ((size >> 8) & 0xff) + 1; - - sx = (source[5] & 0x3ff) - (source[5] & 0x400); - sy = (source[4] & 0x1ff) - (source[4] & 0x200); - - xzoom = 1 << 16; - yzoom = 1 << 16; - - if (xsize > 0x100 - tx) - xsize = 0x100 - tx; - - if (ysize > 0x100 - ty) - ysize = 0x100 - ty; - - gfx->set_source_clip(tx, xsize, ty, ysize); - { - primask = 0; + u32 primask = 0; if (priority_ram[(pri | 0x0a00 | 0x1500) / 2] & 0x38) primask |= 1 << 0; if (priority_ram[(pri | 0x0a00 | 0x1400) / 2] & 0x38) primask |= 1 << 1; if (priority_ram[(pri | 0x0a00 | 0x1100) / 2] & 0x38) primask |= 1 << 2; @@ -384,12 +350,12 @@ static void tetrisp2_draw_sprites(_BitmapClass &bitmap, bitmap_ind8 &bitmap_pri, if (priority_ram[(pri | 0x0a00 | 0x0100) / 2] & 0x38) primask |= 1 << 6; if (priority_ram[(pri | 0x0a00 | 0x0000) / 2] & 0x38) primask |= 1 << 7; - - gfx->prio_zoom_transpen(bitmap,cliprect, + chip->prio_zoom_transpen(bitmap,cliprect, code, color, flipx, flipy, sx,sy, + tx, ty, xsize, ysize, xzoom, yzoom, bitmap_pri,primask, 0); } @@ -407,7 +373,7 @@ static void tetrisp2_draw_sprites(_BitmapClass &bitmap, bitmap_ind8 &bitmap_pri, ***************************************************************************/ -uint32_t tetrisp2_state::screen_update_tetrisp2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 tetrisp2_state::screen_update_tetrisp2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { int flipscreen; int asc_pri; @@ -488,11 +454,11 @@ 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), false ); + m_spriteram, m_spriteram.bytes(), m_sprite, (m_systemregs[0x00] & 0x02), false); return 0; } -uint32_t tetrisp2_state::screen_update_rockntread(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 tetrisp2_state::screen_update_rockntread(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { int flipscreen; int asc_pri; @@ -573,14 +539,14 @@ 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), false ); + m_spriteram, m_spriteram.bytes(), m_sprite, (m_systemregs[0x00] & 0x02), false); return 0; } -uint32_t tetrisp2_state::screen_update_rocknms_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 tetrisp2_state::screen_update_rocknms_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int asc_pri; int scr_pri; @@ -635,12 +601,12 @@ 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), false ); + m_spriteram2, m_spriteram2.bytes(), m_rocknms_sub_sprite, (m_systemregs[0x00] & 0x02), false); return 0; } -uint32_t tetrisp2_state::screen_update_rocknms_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 tetrisp2_state::screen_update_rocknms_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int asc_pri; int scr_pri; @@ -696,7 +662,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), false ); + m_spriteram, m_spriteram.bytes(), m_sprite, (m_systemregs[0x00] & 0x02), false); return 0; } @@ -711,12 +677,12 @@ uint32_t tetrisp2_state::screen_update_rocknms_right(screen_device &screen, bitm // of code_hi, one of the CPUs probably reads them and writes the actual tile codes somewhere. TILE_GET_INFO_MEMBER(tetrisp2_state::stepstag_get_tile_info_fg) { - uint16_t const code_hi = m_vram_fg[ 2 * tile_index ] >> 8; - uint16_t const code_lo = m_vram_fg[ 2 * tile_index ] & 0xf; + u16 const code_hi = m_vram_fg[ 2 * tile_index ] >> 8; + u16 const code_lo = m_vram_fg[ 2 * tile_index ] & 0xf; //logerror("tile_idx[$%2x]=$%3x, palette=$%2x\n", tile_index, code_hi, code_lo);//// if (m_vram_fg[2 * tile_index + 1] != 0) logerror("VRAM ASCII Haut-Mot Non-Zero!!!\n");///////// - SET_TILE_INFO_MEMBER(3, + SET_TILE_INFO_MEMBER(2, code_hi, code_lo, 0); @@ -734,29 +700,29 @@ VIDEO_START_MEMBER(stepstag_state,stepstag) m_tilemap_rot->set_transparent_pen(0); // should be smaller and mirrored like m32 I guess - m_priority = std::make_unique(0x40000); + m_priority = std::make_unique(0x40000); } -uint32_t stepstag_state::screen_update_stepstag_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 stepstag_state::screen_update_stepstag_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap.fill(0, cliprect); screen.priority().fill(0); 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), true); + m_spriteram1, m_spriteram1.bytes(), m_vj_sprite_l, (m_systemregs[0x00] & 0x02), true); return 0; } -uint32_t stepstag_state::screen_update_stepstag_mid(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 stepstag_state::screen_update_stepstag_mid(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { bitmap.fill(0, cliprect); screen.priority().fill(0); 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), true); + m_spriteram2, m_spriteram2.bytes(), m_vj_sprite_m, (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); @@ -765,7 +731,7 @@ uint32_t stepstag_state::screen_update_stepstag_mid(screen_device &screen, bitma return 0; } -uint32_t stepstag_state::screen_update_stepstag_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 stepstag_state::screen_update_stepstag_right(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { // TODO: doesn't like pen 0? bitmap.fill(m_vj_palette_r->black_pen(), cliprect); @@ -773,12 +739,12 @@ uint32_t stepstag_state::screen_update_stepstag_right(screen_device &screen, bit 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), true); + m_spriteram3, m_spriteram3.bytes(), m_vj_sprite_r, (m_systemregs[0x00] & 0x02), true); return 0; } -uint32_t stepstag_state::screen_update_stepstag_main(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 stepstag_state::screen_update_stepstag_main(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { bool const flipscreen = bool(m_systemregs[0x00] & 0x02); @@ -846,19 +812,19 @@ 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), false); + m_spriteram, m_spriteram.bytes(), m_sprite, (m_systemregs[0x00] & 0x02), false); return 0; } // 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) +void stepstag_state::convert_yuv422_to_rgb888(palette_device *paldev, u16 *palram, u32 offset) { - 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; + u8 u = palram[offset/4*4+0] & 0xff; + u8 y1 = palram[offset/4*4+1] & 0xff; + u8 v = palram[offset/4*4+2] & 0xff; + //u8 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); @@ -870,9 +836,9 @@ void stepstag_state::convert_yuv422_to_rgb888(palette_device *paldev, uint16_t * bf = std::min(bf,255.0); bf = std::max(bf,0.0); - uint8_t r = (uint8_t)rf; - uint8_t g = (uint8_t)gf; - uint8_t b = (uint8_t)bf; + u8 r = (u8)rf; + u8 g = (u8)gf; + u8 b = (u8)bf; paldev->set_pen_color(offset/4, r, g, b); } -- cgit v1.2.3