From a8d543343033bf132df1ceeda3259c3d5cb17ed0 Mon Sep 17 00:00:00 2001 From: cam900 Date: Mon, 30 Mar 2020 03:10:19 +0900 Subject: psikyo.cpp : Update and Minor cleanup drawing behavior (#6456) * psikyo.cpp : Move dynamic tilemap size behavior into TILEMAP_MAPPER_MEMBER Correct notes, VRAM/Sprite LUT data type, convert drawing behavior into bitmap_rgb32 * psikyo.cpp : Reduce unnecessary gfx layout --- src/mame/drivers/psikyo.cpp | 83 ++++++++++------------- src/mame/includes/psikyo.h | 23 ++++--- src/mame/video/psikyo.cpp | 160 ++++++++++++++++++-------------------------- 3 files changed, 113 insertions(+), 153 deletions(-) diff --git a/src/mame/drivers/psikyo.cpp b/src/mame/drivers/psikyo.cpp index 07759e6b2a0..4a21b874d11 100644 --- a/src/mame/drivers/psikyo.cpp +++ b/src/mame/drivers/psikyo.cpp @@ -224,20 +224,20 @@ uint8_t psikyo_state::s1945_mcu_control_r() } template -WRITE32_MEMBER(psikyo_state::vram_w) +u16 psikyo_state::vram_r(offs_t offset) +{ + return m_vram[Layer][offset]; +} + +template +void psikyo_state::vram_w(offs_t offset, u16 data, u16 mem_mask) { COMBINE_DATA(&m_vram[Layer][offset]); - for (int size = 0; size < 4; size++) + const u32 tilemap_indexes = m_tilemap[Layer]->rows() * m_tilemap[Layer]->cols(); + while (offset < tilemap_indexes) { - if (ACCESSING_BITS_16_31) - { - m_tilemap[Layer][size]->mark_tile_dirty(offset * 2); - } - - if (ACCESSING_BITS_0_15) - { - m_tilemap[Layer][size]->mark_tile_dirty(offset * 2 + 1); - } + m_tilemap[Layer]->mark_tile_dirty(offset); + offset += 0x1000; } } @@ -255,8 +255,8 @@ void psikyo_state::psikyo_map(address_map &map) map(0x000000, 0x0fffff).rom(); // ROM (not all used) map(0x400000, 0x401fff).ram().share("spriteram"); // Sprites, buffered by two frames (list buffered + fb buffered) map(0x600000, 0x601fff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette"); // Palette - map(0x800000, 0x801fff).ram().w(FUNC(psikyo_state::vram_w<0>)).share("vram_0"); // Layer 0 - map(0x802000, 0x803fff).ram().w(FUNC(psikyo_state::vram_w<1>)).share("vram_1"); // Layer 1 + map(0x800000, 0x801fff).rw(FUNC(psikyo_state::vram_r<0>), FUNC(psikyo_state::vram_w<0>)).share("vram_0"); // Layer 0 + map(0x802000, 0x803fff).rw(FUNC(psikyo_state::vram_r<1>), FUNC(psikyo_state::vram_w<1>)).share("vram_1"); // Layer 1 map(0x804000, 0x807fff).ram().share("vregs"); // RAM + Vregs // map(0xc00000, 0xc0000b).r(FUNC(psikyo_state::input_r)); // Depends on board // map(0xc00004, 0xc0000b).w(FUNC(psikyo_state::s1945_mcu_w)); // MCU on sh404 @@ -290,8 +290,8 @@ void psikyo_state::psikyo_bootleg_map(address_map &map) map(0x400000, 0x401fff).ram().share("spriteram"); // Sprites, buffered by two frames (list buffered + fb buffered) map(0x600000, 0x601fff).ram().w(m_palette, FUNC(palette_device::write32)).share("palette"); // Palette - map(0x800000, 0x801fff).ram().w(FUNC(psikyo_state::vram_w<0>)).share("vram_0"); // Layer 0 - map(0x802000, 0x803fff).ram().w(FUNC(psikyo_state::vram_w<1>)).share("vram_1"); // Layer 1 + map(0x800000, 0x801fff).rw(FUNC(psikyo_state::vram_r<0>), FUNC(psikyo_state::vram_w<0>)).share("vram_0"); // Layer 0 + map(0x802000, 0x803fff).rw(FUNC(psikyo_state::vram_r<1>), FUNC(psikyo_state::vram_w<1>)).share("vram_1"); // Layer 1 map(0x804000, 0x807fff).ram().share("vregs"); // RAM + Vregs map(0xc00000, 0xc0000b).r(FUNC(psikyo_state::gunbird_input_r)); // input ports @@ -990,20 +990,9 @@ INPUT_PORTS_END ***************************************************************************/ -static const gfx_layout layout_16x16x4 = -{ - 16,16, - RGN_FRAC(1,1), - 4, - {STEP4(0,1)}, - {STEP16(0,4)}, - {STEP16(0,4*16)}, - 16*16*4 -}; - static GFXDECODE_START( gfx_psikyo ) - GFXDECODE_ENTRY( "gfx1", 0, layout_16x16x4, 0x000, 0x20 ) // [0] Sprites - GFXDECODE_ENTRY( "gfx2", 0, layout_16x16x4, 0x800, 0x48 ) // [1] Layer 0 + 1 + GFXDECODE_ENTRY( "gfx1", 0, gfx_16x16x4_packed_msb, 0x000, 0x20 ) // [0] Sprites + GFXDECODE_ENTRY( "gfx2", 0, gfx_16x16x4_packed_msb, 0x800, 0x48 ) // [1] Layer 0 + 1 GFXDECODE_END @@ -1053,7 +1042,6 @@ void psikyo_state::sngkace(machine_config &config) m_screen->set_visarea(0, 320-1, 0, 256-32-1); m_screen->set_screen_update(FUNC(psikyo_state::screen_update)); m_screen->screen_vblank().set(FUNC(psikyo_state::screen_vblank)); - m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_psikyo); PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x1000); @@ -1100,7 +1088,6 @@ void psikyo_state::gunbird(machine_config &config) m_screen->set_visarea(0, 320-1, 0, 256-32-1); m_screen->set_screen_update(FUNC(psikyo_state::screen_update)); m_screen->screen_vblank().set(FUNC(psikyo_state::screen_vblank)); - m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_psikyo); PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x1000); @@ -1142,7 +1129,6 @@ void psikyo_state::s1945bl(machine_config &config) /* Bootleg hardware based on m_screen->set_visarea(0, 320-1, 0, 256-32-1); m_screen->set_screen_update(FUNC(psikyo_state::screen_update_bootleg)); m_screen->screen_vblank().set(FUNC(psikyo_state::screen_vblank_bootleg)); - m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_psikyo); PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x1000); @@ -1186,7 +1172,6 @@ void psikyo_state::s1945(machine_config &config) m_screen->set_visarea(0, 320-1, 0, 256-32-1); m_screen->set_screen_update(FUNC(psikyo_state::screen_update)); m_screen->screen_vblank().set(FUNC(psikyo_state::screen_vblank)); - m_screen->set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_psikyo); PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 0x1000); @@ -1249,7 +1234,7 @@ ROM_START( samuraia ) ROM_REGION( 0x100000, "ymsnd", 0 ) /* Samples */ ROM_LOAD( "u68.bin", 0x000000, 0x100000, CRC(9a7f6c34) SHA1(c549b209bce1d2c6eeb512db198ad20c3f5fb0ea) ) - ROM_REGION( 0x040000, "spritelut", 0 ) /* Sprites LUT */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* Sprites LUT */ ROM_LOAD( "u11.bin", 0x000000, 0x040000, CRC(11a04d91) SHA1(5d146a9a39a70f2ee212ceab9a5469598432449e) ) // x1xxxxxxxxxxxxxxxx = 0xFF ROM_END @@ -1272,7 +1257,7 @@ ROM_START( sngkace ) ROM_REGION( 0x100000, "ymsnd", 0 ) /* Samples */ ROM_LOAD( "u68.bin", 0x000000, 0x100000, CRC(9a7f6c34) SHA1(c549b209bce1d2c6eeb512db198ad20c3f5fb0ea) ) - ROM_REGION( 0x040000, "spritelut", 0 ) /* Sprites LUT */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* Sprites LUT */ ROM_LOAD( "u11.bin", 0x000000, 0x040000, CRC(11a04d91) SHA1(5d146a9a39a70f2ee212ceab9a5469598432449e) ) // x1xxxxxxxxxxxxxxxx = 0xFF ROM_END @@ -1295,7 +1280,7 @@ ROM_START( sngkacea ) // the roms have a very visible "." symbol after the numbe ROM_REGION( 0x100000, "ymsnd", 0 ) /* Samples */ ROM_LOAD( "u68.bin", 0x000000, 0x100000, CRC(9a7f6c34) SHA1(c549b209bce1d2c6eeb512db198ad20c3f5fb0ea) ) - ROM_REGION( 0x040000, "spritelut", 0 ) /* Sprites LUT */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* Sprites LUT */ ROM_LOAD( "u11.bin", 0x000000, 0x040000, CRC(11a04d91) SHA1(5d146a9a39a70f2ee212ceab9a5469598432449e) ) // x1xxxxxxxxxxxxxxxx = 0xFF ROM_END @@ -1341,7 +1326,7 @@ ROM_START( gunbird ) ROM_REGION( 0x080000, "ymsnd.deltat", 0 ) /* DELTA-T Samples */ ROM_LOAD( "u64.bin", 0x000000, 0x080000, CRC(e187ed4f) SHA1(05060723d89b1d05714447a14b5f5888ff3c2306) ) - ROM_REGION( 0x040000, "spritelut", 0 ) /* Sprites LUT */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* Sprites LUT */ ROM_LOAD( "u3.bin", 0x000000, 0x040000, CRC(0905aeb2) SHA1(8cca09f7dfe3f804e77515f7b1b1bdbeb7bb3d80) ) ROM_REGION( 0x0002, "pals", 0 ) @@ -1372,7 +1357,7 @@ ROM_START( gunbirdk ) ROM_REGION( 0x080000, "ymsnd.deltat", 0 ) /* DELTA-T Samples */ ROM_LOAD( "u64.bin", 0x000000, 0x080000, CRC(e187ed4f) SHA1(05060723d89b1d05714447a14b5f5888ff3c2306) ) - ROM_REGION( 0x040000, "spritelut", 0 ) /* Sprites LUT */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* Sprites LUT */ ROM_LOAD( "u3.bin", 0x000000, 0x040000, CRC(0905aeb2) SHA1(8cca09f7dfe3f804e77515f7b1b1bdbeb7bb3d80) ) ROM_END @@ -1399,7 +1384,7 @@ ROM_START( gunbirdj ) ROM_REGION( 0x080000, "ymsnd.deltat", 0 ) /* DELTA-T Samples */ ROM_LOAD( "u64.bin", 0x000000, 0x080000, CRC(e187ed4f) SHA1(05060723d89b1d05714447a14b5f5888ff3c2306) ) - ROM_REGION( 0x040000, "spritelut", 0 ) /* Sprites LUT */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* Sprites LUT */ ROM_LOAD( "u3.bin", 0x000000, 0x040000, CRC(0905aeb2) SHA1(8cca09f7dfe3f804e77515f7b1b1bdbeb7bb3d80) ) ROM_END @@ -1427,7 +1412,7 @@ ROM_START( btlkroad ) ROM_REGION( 0x080000, "ymsnd.deltat", 0 ) /* DELTA-T Samples */ ROM_LOAD( "u64.bin", 0x000000, 0x080000, CRC(0f33049f) SHA1(ca4fd5f3906685ace1af40b75f5678231d7324e8) ) - ROM_REGION( 0x040000, "spritelut", 0 ) /* Sprites LUT */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* Sprites LUT */ ROM_LOAD( "u3.bin", 0x000000, 0x040000, CRC(30d541ed) SHA1(6f7fb5f5ecbce7c086185392de164ebb6887e780) ) ROM_REGION( 0x0400, "plds", 0 ) @@ -1459,7 +1444,7 @@ ROM_START( btlkroadk ) ROM_REGION( 0x080000, "ymsnd.deltat", 0 ) /* DELTA-T Samples */ ROM_LOAD( "u64.bin", 0x000000, 0x080000, CRC(0f33049f) SHA1(ca4fd5f3906685ace1af40b75f5678231d7324e8) ) - ROM_REGION( 0x040000, "spritelut", 0 ) /* Sprites LUT */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* Sprites LUT */ ROM_LOAD( "u3.bin", 0x000000, 0x040000, CRC(30d541ed) SHA1(6f7fb5f5ecbce7c086185392de164ebb6887e780) ) ROM_REGION( 0x0400, "plds", 0 ) @@ -1506,7 +1491,7 @@ ROM_START( s1945n ) ROM_REGION( 0x080000, "ymsnd.deltat", 0 ) /* DELTA-T Samples */ ROM_LOAD( "u64.bin", 0x000000, 0x080000, CRC(a44a4a9b) SHA1(5378256752d709daed0b5f4199deebbcffe84e10) ) - ROM_REGION( 0x040000, "spritelut", 0 ) /* */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* */ ROM_LOAD( "u1.bin", 0x000000, 0x040000, CRC(dee22654) SHA1(5df05b0029ff7b1f7f04b41da7823d2aa8034bd2) ) ROM_END @@ -1533,7 +1518,7 @@ ROM_START( s1945nj ) ROM_REGION( 0x080000, "ymsnd.deltat", 0 ) /* DELTA-T Samples */ ROM_LOAD( "u64.bin", 0x000000, 0x080000, CRC(a44a4a9b) SHA1(5378256752d709daed0b5f4199deebbcffe84e10) ) - ROM_REGION( 0x040000, "spritelut", 0 ) /* */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* */ ROM_LOAD( "u1.bin", 0x000000, 0x040000, CRC(dee22654) SHA1(5df05b0029ff7b1f7f04b41da7823d2aa8034bd2) ) ROM_END @@ -1555,7 +1540,7 @@ ROM_START( s1945bl ) /* closely based on s1945nj set, unsurprising because it's ROM_REGION( 0x100000, "oki", 0 ) /* OKI Samples */ ROM_LOAD( "rv27c040.m6", 0x000000, 0x080000, CRC(c22e5b65) SHA1(d807bd7c136d6b51f54258b44ebf3eecbd5b35fa) ) - ROM_REGION( 0x040000, "spritelut", 0 ) /* */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* */ // in 27c010-a 0x460E:01 but should 0x00. Might be bit rot or error when bootleggers copied U1 as all other graphics data matches. ROM_LOAD16_BYTE( "27c010-b", 0x000000, 0x020000, CRC(e38d5ab7) SHA1(73a708ebc305cb6297efd3296da23c87898e805e) ) // u1.bin [even] IDENTICAL ROM_LOAD16_BYTE( "27c010-a", 0x000001, 0x020000, CRC(cb8c65ec) SHA1(a55c5c5067b50a1243e7ba60fa1f9569bfed5de8) ) // u1.bin [odd] 99.999237% @@ -1662,7 +1647,7 @@ ROM_START( s1945 ) ROM_REGION( 0x400000, "ymf", 0 ) /* Samples */ ROM_LOAD( "u61.bin", 0x000000, 0x200000, CRC(a839cf47) SHA1(e179eb505c80d5bb3ccd9e228f2cf428c62b72ee) ) // 8 bit signed pcm (16KHz) - ROM_REGION( 0x040000, "spritelut", 0 ) /* */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* */ ROM_LOAD( "u1.bin", 0x000000, 0x040000, CRC(dee22654) SHA1(5df05b0029ff7b1f7f04b41da7823d2aa8034bd2) ) ROM_END @@ -1690,7 +1675,7 @@ ROM_START( s1945a ) ROM_REGION( 0x400000, "ymf", 0 ) /* Samples */ ROM_LOAD( "u61.bin", 0x000000, 0x200000, CRC(a839cf47) SHA1(e179eb505c80d5bb3ccd9e228f2cf428c62b72ee) ) // 8 bit signed pcm (16KHz) - ROM_REGION( 0x040000, "spritelut", 0 ) /* */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* */ ROM_LOAD( "u1.bin", 0x000000, 0x040000, CRC(dee22654) SHA1(5df05b0029ff7b1f7f04b41da7823d2aa8034bd2) ) ROM_END @@ -1718,7 +1703,7 @@ ROM_START( s1945j ) ROM_REGION( 0x400000, "ymf", 0 ) /* Samples */ ROM_LOAD( "u61.bin", 0x000000, 0x200000, CRC(a839cf47) SHA1(e179eb505c80d5bb3ccd9e228f2cf428c62b72ee) ) // 8 bit signed pcm (16KHz) - ROM_REGION( 0x040000, "spritelut", 0 ) /* */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* */ ROM_LOAD( "u1.bin", 0x000000, 0x040000, CRC(dee22654) SHA1(5df05b0029ff7b1f7f04b41da7823d2aa8034bd2) ) ROM_END @@ -1746,7 +1731,7 @@ ROM_START( s1945k ) /* Same MCU as the current parent set, region dip has no eff ROM_REGION( 0x400000, "ymf", 0 ) /* Samples */ ROM_LOAD( "u61.bin", 0x000000, 0x200000, CRC(a839cf47) SHA1(e179eb505c80d5bb3ccd9e228f2cf428c62b72ee) ) // 8 bit signed pcm (16KHz) - ROM_REGION( 0x040000, "spritelut", 0 ) /* */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* */ ROM_LOAD( "u1.bin", 0x000000, 0x040000, CRC(dee22654) SHA1(5df05b0029ff7b1f7f04b41da7823d2aa8034bd2) ) ROM_END @@ -1796,7 +1781,7 @@ ROM_START( tengai ) ROM_LOAD( "u61.bin", 0x000000, 0x200000, CRC(a63633c5) SHA1(89e75a40518926ebcc7d88dea86c01ba0bb496e5) ) // 8 bit signed pcm (16KHz) ROM_LOAD( "u62.bin", 0x200000, 0x200000, CRC(3ad0c357) SHA1(35f78cfa2eafa93ab96b24e336f569ee84af06b6) ) - ROM_REGION( 0x040000, "spritelut", 0 ) /* Sprites LUT */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* Sprites LUT */ ROM_LOAD( "u1.bin", 0x000000, 0x040000, CRC(681d7d55) SHA1(b0b28471440d747adbc4d22d1918f89f6ede1615) ) ROM_END @@ -1824,7 +1809,7 @@ ROM_START( tengaij ) ROM_LOAD( "u61.bin", 0x000000, 0x200000, CRC(a63633c5) SHA1(89e75a40518926ebcc7d88dea86c01ba0bb496e5) ) // 8 bit signed pcm (16KHz) ROM_LOAD( "u62.bin", 0x200000, 0x200000, CRC(3ad0c357) SHA1(35f78cfa2eafa93ab96b24e336f569ee84af06b6) ) - ROM_REGION( 0x040000, "spritelut", 0 ) /* Sprites LUT */ + ROM_REGION16_LE( 0x040000, "spritelut", 0 ) /* Sprites LUT */ ROM_LOAD( "u1.bin", 0x000000, 0x040000, CRC(681d7d55) SHA1(b0b28471440d747adbc4d22d1918f89f6ede1615) ) ROM_END diff --git a/src/mame/includes/psikyo.h b/src/mame/includes/psikyo.h index d16e50509ba..ef3fdf2a77b 100644 --- a/src/mame/includes/psikyo.h +++ b/src/mame/includes/psikyo.h @@ -24,7 +24,7 @@ class psikyo_state : public driver_device public: psikyo_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) - , m_vram(*this, "vram_%u", 0) + , m_vram(*this, "vram_%u", 0U, (u8)32) , m_vregs(*this, "vregs") , m_bootleg_spritebuffer(*this, "boot_spritebuf") , m_spritelut(*this, "spritelut") @@ -43,6 +43,8 @@ public: , m_spriteram(*this, "spriteram") { std::fill(std::begin(m_old_linescroll), std::end(m_old_linescroll), ~u32(0)); + std::fill(std::begin(m_old_tmapsize), std::end(m_old_tmapsize), ~u32(0)); + std::fill(std::begin(m_tmapsize), std::end(m_tmapsize), ~u32(0)); } void sngkace(machine_config &config); @@ -64,11 +66,11 @@ public: private: /* memory pointers */ - required_shared_ptr_array m_vram; + required_shared_ptr_array m_vram; required_shared_ptr m_vregs; optional_shared_ptr m_bootleg_spritebuffer; - required_memory_region m_spritelut; + required_region_ptr m_spritelut; optional_memory_bank m_audiobank; optional_memory_bank m_okibank; optional_ioport m_in_dsw; @@ -86,10 +88,12 @@ private: u32 primask; }; - tilemap_t *m_tilemap[2][4]; + tilemap_t *m_tilemap[2]; u8 m_tilemap_bank[2]; bool m_ka302c_banking; u32 m_old_linescroll[2]; + u32 m_old_tmapsize[2]; + u32 m_tmapsize[2]; std::unique_ptr m_spritelist; struct sprite_t *m_sprite_ptr_pre; u16 m_sprite_ctrl; @@ -120,22 +124,23 @@ private: DECLARE_READ32_MEMBER(s1945_input_r); DECLARE_WRITE8_MEMBER(s1945bl_okibank_w); template DECLARE_WRITE8_MEMBER(sound_bankswitch_w); - template DECLARE_WRITE32_MEMBER(vram_w); + template u16 vram_r(offs_t offset); + template void vram_w(offs_t offset, u16 data, u16 mem_mask); template TILE_GET_INFO_MEMBER(get_tile_info); + template TILEMAP_MAPPER_MEMBER(tile_scan); virtual void machine_start() override; virtual void machine_reset() override; DECLARE_VIDEO_START(sngkace); DECLARE_VIDEO_START(psikyo); - u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - u32 screen_update_bootleg(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + u32 screen_update_bootleg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); DECLARE_WRITE_LINE_MEMBER(screen_vblank); DECLARE_WRITE_LINE_MEMBER(screen_vblank_bootleg); void switch_bgbanks(u8 tmap, u8 bank); - void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void get_sprites(); void get_sprites_bootleg(); - u16 tilemap_width(u8 size); void s1945_mcu_init(); /* devices */ diff --git a/src/mame/video/psikyo.cpp b/src/mame/video/psikyo.cpp index 0e85f0c5249..b2e8d8dfc42 100644 --- a/src/mame/video/psikyo.cpp +++ b/src/mame/video/psikyo.cpp @@ -76,24 +76,34 @@ Offset: template TILE_GET_INFO_MEMBER(psikyo_state::get_tile_info) { - u16 code = ((u16 *)m_vram[Layer].target())[BYTE_XOR_BE(tile_index)]; + u16 code = m_vram[Layer][tile_index & 0xfff]; tileinfo.set(1, (code & 0x1fff) + 0x2000 * m_tilemap_bank[Layer], ((code >> 13) & 7) + (Layer * 0x40), 0); } +template +TILEMAP_MAPPER_MEMBER(psikyo_state::tile_scan) +{ + switch (m_tmapsize[Layer]) + { + case 0: return (col & 0x3f) | ((row & 0x3f) << 6) | ((col & 0xc0) << 6) | ((row & 0x40) << 8); + case 1: return (col & 0x7f) | ((row & 0x1f) << 7) | ((col & 0x80) << 5) | ((row & 0x60) << 8); + case 2: return (col & 0xff) | ((row & 0x0f) << 8) | ((row & 0x70) << 8); + default: return (col & 0x1f) | ((row & 0x7f) << 5) | ((col & 0xe0) << 7); + } +} + void psikyo_state::switch_bgbanks(u8 tmap, u8 bank) { if (bank != m_tilemap_bank[tmap]) { m_tilemap_bank[tmap] = bank; - for (int size = 0; size < 4; size++) - m_tilemap[tmap][size]->mark_all_dirty(); + m_tilemap[tmap]->mark_all_dirty(); } } - VIDEO_START_MEMBER(psikyo_state,psikyo) { m_spritelist = std::make_unique(0x800/2*8*8); @@ -101,18 +111,18 @@ VIDEO_START_MEMBER(psikyo_state,psikyo) /* The Hardware is Capable of Changing the Dimensions of the Tilemaps, its safer to create the various sized tilemaps now as opposed to later */ - for (int size = 0; size < 4; size++) - { - m_tilemap[0][size] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(psikyo_state::get_tile_info<0>)), TILEMAP_SCAN_ROWS, 16, 16, 0x20 << size, 0x80 >> size); - m_tilemap[1][size] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(psikyo_state::get_tile_info<1>)), TILEMAP_SCAN_ROWS, 16, 16, 0x20 << size, 0x80 >> size); + m_tilemap[0] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(psikyo_state::get_tile_info<0>)), tilemap_mapper_delegate(*this, FUNC(psikyo_state::tile_scan<0>)), 16, 16, 256, 128); + m_tilemap[1] = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(psikyo_state::get_tile_info<1>)), tilemap_mapper_delegate(*this, FUNC(psikyo_state::tile_scan<1>)), 16, 16, 256, 128); - for (int layer = 0; layer < 2; layer++) - { - m_tilemap[layer][size]->set_scroll_rows(1); - m_tilemap[layer][size]->set_scroll_cols(1); - } + for (int layer = 0; layer < 2; layer++) + { + m_tilemap[layer]->set_scroll_rows(1); + m_tilemap[layer]->set_scroll_cols(1); } + save_item(NAME(m_old_linescroll)); + save_item(NAME(m_old_tmapsize)); + save_item(NAME(m_tmapsize)); save_item(NAME(m_sprite_ctrl)); } @@ -176,8 +186,6 @@ void psikyo_state::get_sprites() m_sprite_ctrl = m_spriteram->buffer()[0x1ffe / 4] & 0xffff; static const int pri[] = { 0, 0xfc, 0xff, 0xff }; const u16 *spritelist = (u16 *)(m_spriteram->buffer() + 0x1800 / 4); - const u8 *TILES = m_spritelut->base(); // Sprites LUT - u32 const TILES_LEN = m_spritelut->bytes(); u16 const width = m_screen->width(); u16 const height = m_screen->height(); @@ -248,10 +256,8 @@ void psikyo_state::get_sprites() { for (int dx = xstart; dx != xend; dx += xinc) { - u32 const addr = (code * 2) & (TILES_LEN - 1); - m_sprite_ptr_pre->gfx = 0; - m_sprite_ptr_pre->code = TILES[addr+1] * 256 + TILES[addr]; + m_sprite_ptr_pre->code = m_spritelut[code & m_spritelut.mask()]; m_sprite_ptr_pre->color = attr >> 8; m_sprite_ptr_pre->flipx = flipx; m_sprite_ptr_pre->flipy = flipy; @@ -287,8 +293,6 @@ void psikyo_state::get_sprites_bootleg() m_sprite_ctrl = m_spriteram->buffer()[0x1ffe / 4] & 0xffff; static const int pri[] = { 0, 0xfc, 0xff, 0xff }; const u16 *spritelist = (u16 *)(m_spriteram->buffer() + 0x1800 / 4); - const u8 *TILES = m_spritelut->base(); // Sprites LUT - u32 const TILES_LEN = m_spritelut->bytes(); u16 const width = m_screen->width(); u16 const height = m_screen->height(); @@ -341,7 +345,6 @@ void psikyo_state::get_sprites_bootleg() zoomx = 32 - zoomx; zoomy = 32 - zoomy; - if (flip_screen()) { x = width - x - (nx * zoomx) / 2; @@ -360,10 +363,8 @@ void psikyo_state::get_sprites_bootleg() { for (int dx = xstart; dx != xend; dx += xinc) { - u32 const addr = (code * 2) & (TILES_LEN-1); - m_sprite_ptr_pre->gfx = 0; - m_sprite_ptr_pre->code = TILES[addr+1] * 256 + TILES[addr]; + m_sprite_ptr_pre->code = m_spritelut[code & m_spritelut.mask()]; m_sprite_ptr_pre->color = attr >> 8; m_sprite_ptr_pre->flipx = flipx; m_sprite_ptr_pre->flipy = flipy; @@ -388,7 +389,7 @@ void psikyo_state::get_sprites_bootleg() } } -void psikyo_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +void psikyo_state::draw_sprites(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { struct sprite_t *sprite_ptr = m_sprite_ptr_pre; u32 transmask = 0; @@ -427,23 +428,14 @@ void psikyo_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, con ***************************************************************************/ -u16 psikyo_state::tilemap_width(u8 size) -{ - return (0x80 * 16) >> size; -} - -u32 psikyo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 psikyo_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - u16 bgpen = 0; + u32 bgpen = 0; int i, layers_ctrl = -1; - u32 tmsize[2]; - u32 scrollx[2]{ m_vregs[0x406 / 4], m_vregs[0x40e / 4] }, scrolly[2]{ m_vregs[0x402 / 4], m_vregs[0x40a / 4] }; u32 layer_ctrl[2]{ m_vregs[0x412 / 4], m_vregs[0x416 / 4] }; - tilemap_t *tmptilemap[2]; - flip_screen_set(~m_in_dsw->read() & 0x00010000); // hardwired to a DSW bit /* Layers enable (not quite right) */ @@ -456,7 +448,7 @@ u32 psikyo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, con 6- 7: tilemap size 8 : per-line rowscroll 9 : per-tile rowscroll - 10 : tilebank (btlkroad/gunbird/s1945jn only) + 10 : tilebank (btlkroad/gunbird/s1945n only) 11-15: ? */ /* @@ -483,37 +475,31 @@ u32 psikyo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, con switch_bgbanks(layer, (layer_ctrl[layer] & 0x400) >> 10); } - switch ((layer_ctrl[layer] & 0x00c0) >> 6) + u32 new_size = ((layer_ctrl[layer] & 0x00c0) >> 6); + if (m_old_tmapsize[layer] != new_size) { - case 0: tmsize[layer] = 1; break; - case 1: tmsize[layer] = 2; break; - case 2: tmsize[layer] = 3; break; - default: tmsize[layer] = 0; break; + m_tmapsize[layer] = new_size; + m_tilemap[layer]->mark_mapping_dirty(); } - tmptilemap[layer] = m_tilemap[layer][tmsize[layer]]; - - tmptilemap[layer]->enable(~layer_ctrl[layer] & 1); + m_tilemap[layer]->enable(~layer_ctrl[layer] & 1); /* Layers scrolling */ - tmptilemap[layer]->set_scrolly(0, scrolly[layer]); + m_tilemap[layer]->set_scrolly(0, scrolly[layer]); if (layer_ctrl[layer] & 0x0300) /* per-line rowscroll */ { int tile_rowscroll = (layer_ctrl[layer] & 0x0200) >> 7; /* per-tile rowscroll */ assert(tile_rowscroll == 0 || tile_rowscroll == 4); if (m_old_linescroll[layer] != (layer_ctrl[layer] & 0x0300)) { - for (int i = 0; i < 4; i++) - { - m_tilemap[layer][i]->set_scroll_rows(tilemap_width(i)); - } + m_tilemap[layer]->set_scroll_rows(0x800); m_old_linescroll[layer] = (layer_ctrl[layer] & 0x0300); } for (i = 0; i < 256; i++) /* 256 screen lines */ { int x0 = ((u16 *)m_vregs.target())[BYTE_XOR_BE((layer * 0x200)/2 + (i >> tile_rowscroll))]; - tmptilemap[layer]->set_scrollx( - (i + scrolly[layer]) % (tilemap_width(tmsize[layer])), + m_tilemap[layer]->set_scrollx( + (i + scrolly[layer]) & 0x7ff, scrollx[layer] + x0 ); } } @@ -521,22 +507,19 @@ u32 psikyo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, con { if (m_old_linescroll[layer] != (layer_ctrl[layer] & 0x0300)) { - for (int i = 0; i < 4; i++) - { - m_tilemap[layer][i]->set_scroll_rows(1); - } + m_tilemap[layer]->set_scroll_rows(1); m_old_linescroll[layer] = (layer_ctrl[layer] & 0x0300); } - tmptilemap[layer]->set_scrollx(0, scrollx[layer]); + m_tilemap[layer]->set_scrollx(0, scrollx[layer]); } - tmptilemap[layer]->set_transparent_pen((layer_ctrl[layer] & 8 ? 0 : 15)); + m_tilemap[layer]->set_transparent_pen((layer_ctrl[layer] & 8 ? 0 : 15)); } // TODO : is this correct? if (layers_ctrl & 1) - bgpen = ((layer_ctrl[0] & 8) ? 0x800 : 0x80f); + bgpen = m_palette->pen(((layer_ctrl[0] & 8) ? 0x800 : 0x80f)); else if (layers_ctrl & 2) - bgpen = ((layer_ctrl[1] & 8) ? 0xc00 : 0xc0f); + bgpen = m_palette->pen(((layer_ctrl[1] & 8) ? 0xc00 : 0xc0f)); else bgpen = m_palette->black_pen(); // TODO @@ -545,10 +528,10 @@ u32 psikyo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, con screen.priority().fill(0, cliprect); if (layers_ctrl & 1) - tmptilemap[0]->draw(screen, bitmap, cliprect, layer_ctrl[0] & 2 ? TILEMAP_DRAW_OPAQUE : 0, 1); + m_tilemap[0]->draw(screen, bitmap, cliprect, layer_ctrl[0] & 2 ? TILEMAP_DRAW_OPAQUE : 0, 1); if (layers_ctrl & 2) - tmptilemap[1]->draw(screen, bitmap, cliprect, layer_ctrl[1] & 2 ? TILEMAP_DRAW_OPAQUE : 0, 2); + m_tilemap[1]->draw(screen, bitmap, cliprect, layer_ctrl[1] & 2 ? TILEMAP_DRAW_OPAQUE : 0, 2); if (layers_ctrl & 4) draw_sprites(screen, bitmap, cliprect); @@ -564,18 +547,14 @@ u32 psikyo_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, con */ -u32 psikyo_state::screen_update_bootleg(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +u32 psikyo_state::screen_update_bootleg(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - u16 bgpen = 0; + u32 bgpen = 0; int i, layers_ctrl = -1; - u32 tmsize[2]; - u32 scrollx[2]{ m_vregs[0x406 / 4], m_vregs[0x40e / 4] }, scrolly[2]{ m_vregs[0x402 / 4], m_vregs[0x40a / 4] }; u32 layer_ctrl[2]{ m_vregs[0x412 / 4], m_vregs[0x416 / 4] }; - tilemap_t *tmptilemap[2]; - flip_screen_set(~m_in_dsw->read() & 0x00010000); // hardwired to a DSW bit /* Layers enable (not quite right) */ @@ -588,7 +567,7 @@ u32 psikyo_state::screen_update_bootleg(screen_device &screen, bitmap_ind16 &bit 6- 7: tilemap size 8 : per-line rowscroll 9 : per-tile rowscroll - 10 : tilebank (btlkroad/gunbird/s1945jn only) + 10 : tilebank (btlkroad/gunbird/s1945n only) 11-15: ? */ /* @@ -615,20 +594,17 @@ u32 psikyo_state::screen_update_bootleg(screen_device &screen, bitmap_ind16 &bit switch_bgbanks(layer, (layer_ctrl[layer] & 0x400) >> 10); } - switch ((layer_ctrl[layer] & 0x00c0) >> 6) + u32 new_size = ((layer_ctrl[layer] & 0x00c0) >> 6); + if (m_old_tmapsize[layer] != new_size) { - case 0: tmsize[layer] = 1; break; - case 1: tmsize[layer] = 2; break; - case 2: tmsize[layer] = 3; break; - default: tmsize[layer] = 0; break; + m_tmapsize[layer] = new_size; + m_tilemap[layer]->mark_mapping_dirty(); } - tmptilemap[layer] = m_tilemap[layer][tmsize[layer]]; - - tmptilemap[layer]->enable(~layer_ctrl[layer] & 1); + m_tilemap[layer]->enable(~layer_ctrl[layer] & 1); /* Layers scrolling */ - tmptilemap[layer]->set_scrolly(0, scrolly[layer]); + m_tilemap[layer]->set_scrolly(0, scrolly[layer]); if (layer_ctrl[layer] & 0x0300) /* per-line rowscroll */ { @@ -636,40 +612,34 @@ u32 psikyo_state::screen_update_bootleg(screen_device &screen, bitmap_ind16 &bit assert(tile_rowscroll == 0 || tile_rowscroll == 4); if (m_old_linescroll[layer] != (layer_ctrl[layer] & 0x0300)) { - for (int i = 0; i < 4; i++) - { - m_tilemap[layer][i]->set_scroll_rows(tilemap_width(i)); - } + m_tilemap[layer]->set_scroll_rows(0x800); m_old_linescroll[layer] = (layer_ctrl[layer] & 0x0300); } for (i = 0; i < 256; i++) /* 256 screen lines */ { int x0 = ((u16 *)m_vregs.target())[BYTE_XOR_BE((layer * 0x200)/2 + (i >> tile_rowscroll))]; - tmptilemap[layer]->set_scrollx( - (i + scrolly[layer]) % (tilemap_width(tmsize[layer])), - scrollx[layer] + x0 ); + m_tilemap[layer]->set_scrollx( + (i + scrolly[layer]) & 0x7ff, + scrollx[layer] + x0); } } else { if (m_old_linescroll[layer] != (layer_ctrl[layer] & 0x0300)) { - for (int i = 0; i < 4; i++) - { - m_tilemap[layer][i]->set_scroll_rows(1); - } + m_tilemap[layer]->set_scroll_rows(1); m_old_linescroll[layer] = (layer_ctrl[layer] & 0x0300); } - tmptilemap[layer]->set_scrollx(0, scrollx[layer]); + m_tilemap[layer]->set_scrollx(0, scrollx[layer]); } - tmptilemap[layer]->set_transparent_pen((layer_ctrl[layer] & 8 ? 0 : 15)); + m_tilemap[layer]->set_transparent_pen((layer_ctrl[layer] & 8 ? 0 : 15)); } // TODO : is this correct? if (layers_ctrl & 1) - bgpen = ((layer_ctrl[0] & 8) ? 0x800 : 0x80f); + bgpen = m_palette->pen(((layer_ctrl[0] & 8) ? 0x800 : 0x80f)); else if (layers_ctrl & 2) - bgpen = ((layer_ctrl[1] & 8) ? 0xc00 : 0xc0f); + bgpen = m_palette->pen(((layer_ctrl[1] & 8) ? 0xc00 : 0xc0f)); else bgpen = m_palette->black_pen(); // TODO @@ -678,10 +648,10 @@ u32 psikyo_state::screen_update_bootleg(screen_device &screen, bitmap_ind16 &bit screen.priority().fill(0, cliprect); if (layers_ctrl & 1) - tmptilemap[0]->draw(screen, bitmap, cliprect, layer_ctrl[0] & 2 ? TILEMAP_DRAW_OPAQUE : 0, 1); + m_tilemap[0]->draw(screen, bitmap, cliprect, layer_ctrl[0] & 2 ? TILEMAP_DRAW_OPAQUE : 0, 1); if (layers_ctrl & 2) - tmptilemap[1]->draw(screen, bitmap, cliprect, layer_ctrl[1] & 2 ? TILEMAP_DRAW_OPAQUE : 0, 2); + m_tilemap[1]->draw(screen, bitmap, cliprect, layer_ctrl[1] & 2 ? TILEMAP_DRAW_OPAQUE : 0, 2); if (layers_ctrl & 4) draw_sprites(screen, bitmap, cliprect); -- cgit v1.2.3