summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame
diff options
context:
space:
mode:
author cam900 <dbtlrchl@naver.com>2020-03-30 03:10:19 +0900
committer GitHub <noreply@github.com>2020-03-29 14:10:19 -0400
commita8d543343033bf132df1ceeda3259c3d5cb17ed0 (patch)
tree885030e178f106bd419829a5f2db7b74e54caadf /src/mame
parentfa46372bbdbf66d68a4c9d7500c90ee387967b4a (diff)
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
Diffstat (limited to 'src/mame')
-rw-r--r--src/mame/drivers/psikyo.cpp83
-rw-r--r--src/mame/includes/psikyo.h23
-rw-r--r--src/mame/video/psikyo.cpp160
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<int Layer>
-WRITE32_MEMBER(psikyo_state::vram_w)
+u16 psikyo_state::vram_r(offs_t offset)
+{
+ return m_vram[Layer][offset];
+}
+
+template<int Layer>
+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<u32, 2> m_vram;
+ required_shared_ptr_array<u16, 2> m_vram;
required_shared_ptr<u32> m_vregs;
optional_shared_ptr<u32> m_bootleg_spritebuffer;
- required_memory_region m_spritelut;
+ required_region_ptr<u16> 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<sprite_t[]> 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<int Shift> DECLARE_WRITE8_MEMBER(sound_bankswitch_w);
- template<int Layer> DECLARE_WRITE32_MEMBER(vram_w);
+ template<int Layer> u16 vram_r(offs_t offset);
+ template<int Layer> void vram_w(offs_t offset, u16 data, u16 mem_mask);
template<int Layer> TILE_GET_INFO_MEMBER(get_tile_info);
+ template<int Layer> 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<int Layer>
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<int Layer>
+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<sprite_t[]>(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);