drawgfx.h: Long-overdue documentation about how to use priority-masked

drawing (aka pdrawgfx); add some useful constants. [Alex Jackson]

(nw)
prehisle.c: Fix issues introduced by pdrawgfx conversion; use
required_region_ptr instead of runtime tag lookup; give gfx regions
more meaningful names; remove superfluous "prehisle"'s and "16"'s
from member names (it's been many years since you could accidentally
plug a handler of the wrong width into an address map and not have
the core catch you at compile time)
This commit is contained in:
Alex W. Jackson 2014-11-16 04:19:09 -05:00
parent 03e9f7234e
commit d803e96ac8
4 changed files with 191 additions and 82 deletions

View File

@ -7,6 +7,109 @@
Copyright Nicola Salmoria and the MAME Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************
How to use priority-masked drawing (formerly pdrawgfx):
There are two different standard ways to use the priority bitmap
and the priority-masked draw methods, depending on how many layers
of interest (tilemap or other layers that individual sprites can
be either "behind" or "in front of") your driver has.
In the more common scheme, which you can use when the number of
layers of interest is four or fewer, the priority bitmap contains
a bitmask indicating which layers are opaque at each location.
To use this scheme, draw your tilemap layers this way, in order
from back to front:
screen.priority().fill(0, cliprect);
m_tilemap1->draw(screen, bitmap, cliprect, tmap1flags, 1);
m_tilemap2->draw(screen, bitmap, cliprect, tmap2flags, 2);
m_tilemap3->draw(screen, bitmap, cliprect, tmap3flags, 4);
m_tilemap4->draw(screen, bitmap, cliprect, tmap4flags, 8);
Now, when drawing your sprites, the pmask parameter for each
sprite should be the bitwise OR of all the GFX_PMASK_n constants
corresponding to layers that the sprite should be masked by.
For example, to draw a sprite that appears over tilemap1, but
under opaque pixels of tilemap2, tilemap3, and tilemap4:
UINT32 pmask = GFX_PMASK_2 | GFX_PMASK_4 | GFX_PMASK_8;
gfx->prio_transpen(bitmap, cliprect,
code, color,
flipx, flipy,
sx, sy,
screen.priority(),
pmask,
trans_pen);
This scheme does not require priority to be transitive: it is
perfectly possible for a sprite to be "under" tilemap1 but "over"
tilemap4, even though tilemap1 itself is "under" tilemap4.
If you have more than four layers, you need to use a different
scheme, in which the priority bitmap contains the index of the
topmost opaque layer rather than a bitmask of all the opaque
layers. To use this scheme, draw your tilemaps this way, again
in order from back to front:
screen.priority().fill(0, cliprect);
m_tilemap1->draw(screen, bitmap, cliprect, tmap1flags, 1, 0);
m_tilemap2->draw(screen, bitmap, cliprect, tmap2flags, 2, 0);
m_tilemap3->draw(screen, bitmap, cliprect, tmap3flags, 3, 0);
m_tilemap4->draw(screen, bitmap, cliprect, tmap4flags, 4, 0);
m_tilemap5->draw(screen, bitmap, cliprect, tmap5flags, 5, 0);
m_tilemap6->draw(screen, bitmap, cliprect, tmap6flags, 6, 0);
m_tilemap7->draw(screen, bitmap, cliprect, tmap7flags, 7, 0);
m_tilemap8->draw(screen, bitmap, cliprect, tmap8flags, 8, 0);
Notice the additional 0 parameter to tilemap_t::draw(). This
parameter causes the new layer's priority code to replace that of
the underlying layer instead of being ORed with it (the parameter
is a mask to be ANDed with the previous contents of the priority
bitmap before the new code is ORed with it)
You need to use a different pmask for your sprites with this
scheme than with the previous scheme. The pmask should be set to
((~1) << n), where n is the index of the highest priority layer
that the sprite should *not* be masked by. For example, to draw
a sprite over the first four tilemaps but under the higher
numbered ones:
UINT32 pmask = (~1) << 4;
gfx->prio_transpen(bitmap, cliprect,
code, color,
flipx, flipy,
sx, sy,
screen.priority(),
pmask,
trans_pen);
Unlike the other scheme, this one does require priority to be
transitive, because the priority bitmap only contains information
about the topmost opaque pixel.
These examples have used a different tilemap for each layer, but
the layers could just as easily be different tile categories or
pen layers from the same tilemap.
If you have a layer that is behind all sprites, draw it with
priority 0, and if you have a layer that is in front of all
sprites, just draw it after the sprites. The bitmask scheme
can handle up to 6 layers if you count "behind all sprites" and
"in front of all sprites".
An important thing to remember when using priority-masked drawing
is that the sprites are drawn from front to back. Sprite pixels
will not be drawn over already-drawn sprite pixels, even if the
previously-drawn pixel was masked by a background layer.
This reflects the fact that in most hardware, sprite-to-sprite
priority is unrelated to sprite-to-background priority. Your
sprites need to be pre-sorted by their sprite-to-sprite priority
(whether that be a field in the sprite attributes or simply their
order in sprite RAM) before drawing.
*********************************************************************/
#pragma once
@ -30,6 +133,13 @@ enum
DRAWMODE_SHADOW
};
enum
{
GFX_PMASK_1 = 0xaaaa,
GFX_PMASK_2 = 0xcccc,
GFX_PMASK_4 = 0xf0f0,
GFX_PMASK_8 = 0xff00
};
/***************************************************************************

View File

@ -16,7 +16,7 @@
/******************************************************************************/
WRITE16_MEMBER(prehisle_state::prehisle_sound16_w)
WRITE16_MEMBER(prehisle_state::soundcmd_w)
{
soundlatch_byte_w(space, 0, data & 0xff);
m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
@ -27,13 +27,13 @@ WRITE16_MEMBER(prehisle_state::prehisle_sound16_w)
static ADDRESS_MAP_START( prehisle_map, AS_PROGRAM, 16, prehisle_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x070000, 0x073fff) AM_RAM
AM_RANGE(0x090000, 0x0907ff) AM_RAM_WRITE(prehisle_fg_videoram16_w) AM_SHARE("videoram")
AM_RANGE(0x090000, 0x0907ff) AM_RAM_WRITE(tx_vram_w) AM_SHARE("tx_vram")
AM_RANGE(0x0a0000, 0x0a07ff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0x0b0000, 0x0b3fff) AM_RAM_WRITE(prehisle_bg_videoram16_w) AM_SHARE("bg_videoram16")
AM_RANGE(0x0b0000, 0x0b3fff) AM_RAM_WRITE(fg_vram_w) AM_SHARE("fg_vram")
AM_RANGE(0x0d0000, 0x0d07ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
AM_RANGE(0x0e0000, 0x0e00ff) AM_READ(prehisle_control16_r)
AM_RANGE(0x0f0070, 0x0ff071) AM_WRITE(prehisle_sound16_w)
AM_RANGE(0x0f0000, 0x0ff0ff) AM_WRITE(prehisle_control16_w)
AM_RANGE(0x0e0000, 0x0e00ff) AM_READ(control_r)
AM_RANGE(0x0f0070, 0x0ff071) AM_WRITE(soundcmd_w)
AM_RANGE(0x0f0000, 0x0ff0ff) AM_WRITE(control_w)
ADDRESS_MAP_END
/******************************************************************************/
@ -182,10 +182,10 @@ static const gfx_layout spritelayout =
};
static GFXDECODE_START( prehisle )
GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 16 )
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 768, 16 )
GFXDECODE_ENTRY( "gfx3", 0, tilelayout, 512, 16 )
GFXDECODE_ENTRY( "gfx4", 0, spritelayout, 256, 16 )
GFXDECODE_ENTRY( "chars", 0, charlayout, 0, 16 )
GFXDECODE_ENTRY( "bgtiles", 0, tilelayout, 768, 16 )
GFXDECODE_ENTRY( "fgtiles", 0, tilelayout, 512, 16 )
GFXDECODE_ENTRY( "sprites", 0, spritelayout, 256, 16 )
GFXDECODE_END
/******************************************************************************/
@ -243,20 +243,20 @@ ROM_START( prehisle )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
ROM_LOAD( "gt1.1", 0x000000, 0x10000, CRC(80a4c093) SHA1(abe59e43259eb80b504bd5541f58cd0e5eb998ab) )
ROM_REGION( 0x008000, "gfx1", 0 )
ROM_REGION( 0x008000, "chars", 0 )
ROM_LOAD( "gt15.b15", 0x000000, 0x08000, CRC(ac652412) SHA1(916c04c3a8a7bfb961313ab73c0a27d7f5e48de1) )
ROM_REGION( 0x040000, "gfx2", 0 )
ROM_REGION( 0x040000, "bgtiles", 0 )
ROM_LOAD( "pi8914.b14", 0x000000, 0x40000, CRC(207d6187) SHA1(505dfd1424b894e7b898f91b89f021ddde433c48) )
ROM_REGION( 0x040000, "gfx3", 0 )
ROM_REGION( 0x040000, "fgtiles", 0 )
ROM_LOAD( "pi8916.h16", 0x000000, 0x40000, CRC(7cffe0f6) SHA1(aba08617964fc425418b098be5167021768bd47c) )
ROM_REGION( 0x0a0000, "gfx4", 0 )
ROM_REGION( 0x0a0000, "sprites", 0 )
ROM_LOAD( "pi8910.k14", 0x000000, 0x80000, CRC(5a101b0b) SHA1(9645ab1f8d058cf2c6c42ccb4ce92a9b5db10c51) )
ROM_LOAD( "gt5.5", 0x080000, 0x20000, CRC(3d3ab273) SHA1(b5706ada9eb2c22fcc0ac8ede2d2ee02ee853191) )
ROM_REGION( 0x10000, "gfx5", 0 ) /* background tilemaps */
ROM_REGION( 0x10000, "bgtilemap", 0 ) /* background tilemaps */
ROM_LOAD( "gt11.11", 0x000000, 0x10000, CRC(b4f0fcf0) SHA1(b81cc0b6e3e6f5616789bb3e77807dc0ef718a38) )
ROM_REGION( 0x20000, "upd", 0 ) /* ADPCM samples */
@ -271,20 +271,20 @@ ROM_START( prehisleu )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
ROM_LOAD( "gt1.1", 0x000000, 0x10000, CRC(80a4c093) SHA1(abe59e43259eb80b504bd5541f58cd0e5eb998ab) )
ROM_REGION( 0x008000, "gfx1", 0 )
ROM_REGION( 0x008000, "chars", 0 )
ROM_LOAD( "gt15.b15", 0x000000, 0x08000, CRC(ac652412) SHA1(916c04c3a8a7bfb961313ab73c0a27d7f5e48de1) )
ROM_REGION( 0x040000, "gfx2", 0 )
ROM_REGION( 0x040000, "bgtiles", 0 )
ROM_LOAD( "pi8914.b14", 0x000000, 0x40000, CRC(207d6187) SHA1(505dfd1424b894e7b898f91b89f021ddde433c48) )
ROM_REGION( 0x040000, "gfx3", 0 )
ROM_REGION( 0x040000, "fgtiles", 0 )
ROM_LOAD( "pi8916.h16", 0x000000, 0x40000, CRC(7cffe0f6) SHA1(aba08617964fc425418b098be5167021768bd47c) )
ROM_REGION( 0x0a0000, "gfx4", 0 )
ROM_REGION( 0x0a0000, "sprites", 0 )
ROM_LOAD( "pi8910.k14", 0x000000, 0x80000, CRC(5a101b0b) SHA1(9645ab1f8d058cf2c6c42ccb4ce92a9b5db10c51) )
ROM_LOAD( "gt5.5", 0x080000, 0x20000, CRC(3d3ab273) SHA1(b5706ada9eb2c22fcc0ac8ede2d2ee02ee853191) )
ROM_REGION( 0x10000, "gfx5", 0 ) /* background tilemaps */
ROM_REGION( 0x10000, "bgtilemap", 0 ) /* background tilemaps */
ROM_LOAD( "gt11.11", 0x000000, 0x10000, CRC(b4f0fcf0) SHA1(b81cc0b6e3e6f5616789bb3e77807dc0ef718a38) )
ROM_REGION( 0x20000, "upd", 0 ) /* ADPCM samples */
@ -299,20 +299,20 @@ ROM_START( prehislek )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
ROM_LOAD( "gt1.1", 0x000000, 0x10000, CRC(80a4c093) SHA1(abe59e43259eb80b504bd5541f58cd0e5eb998ab) )
ROM_REGION( 0x008000, "gfx1", 0 )
ROM_REGION( 0x008000, "chars", 0 )
ROM_LOAD( "gt15.b15", 0x000000, 0x08000, BAD_DUMP CRC(ac652412) SHA1(916c04c3a8a7bfb961313ab73c0a27d7f5e48de1) ) // not dumped, missing korean text
ROM_REGION( 0x040000, "gfx2", 0 )
ROM_REGION( 0x040000, "bgtiles", 0 )
ROM_LOAD( "pi8914.b14", 0x000000, 0x40000, CRC(207d6187) SHA1(505dfd1424b894e7b898f91b89f021ddde433c48) )
ROM_REGION( 0x040000, "gfx3", 0 )
ROM_REGION( 0x040000, "fgtiles", 0 )
ROM_LOAD( "pi8916.h16", 0x000000, 0x40000, CRC(7cffe0f6) SHA1(aba08617964fc425418b098be5167021768bd47c) )
ROM_REGION( 0x0a0000, "gfx4", 0 )
ROM_REGION( 0x0a0000, "sprites", 0 )
ROM_LOAD( "pi8910.k14", 0x000000, 0x80000, CRC(5a101b0b) SHA1(9645ab1f8d058cf2c6c42ccb4ce92a9b5db10c51) )
ROM_LOAD( "gt5.5", 0x080000, 0x20000, CRC(3d3ab273) SHA1(b5706ada9eb2c22fcc0ac8ede2d2ee02ee853191) )
ROM_REGION( 0x10000, "gfx5", 0 ) /* background tilemaps */
ROM_REGION( 0x10000, "bgtilemap", 0 ) /* background tilemaps */
ROM_LOAD( "gt11.11", 0x000000, 0x10000, CRC(b4f0fcf0) SHA1(b81cc0b6e3e6f5616789bb3e77807dc0ef718a38) )
ROM_REGION( 0x20000, "upd", 0 ) /* ADPCM samples */
@ -327,20 +327,20 @@ ROM_START( gensitou )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Sound CPU */
ROM_LOAD( "gt1.1", 0x000000, 0x10000, CRC(80a4c093) SHA1(abe59e43259eb80b504bd5541f58cd0e5eb998ab) )
ROM_REGION( 0x008000, "gfx1", 0 )
ROM_REGION( 0x008000, "chars", 0 )
ROM_LOAD( "gt15.b15", 0x000000, 0x08000, CRC(ac652412) SHA1(916c04c3a8a7bfb961313ab73c0a27d7f5e48de1) )
ROM_REGION( 0x040000, "gfx2", 0 )
ROM_REGION( 0x040000, "bgtiles", 0 )
ROM_LOAD( "pi8914.b14", 0x000000, 0x40000, CRC(207d6187) SHA1(505dfd1424b894e7b898f91b89f021ddde433c48) )
ROM_REGION( 0x040000, "gfx3", 0 )
ROM_REGION( 0x040000, "fgtiles", 0 )
ROM_LOAD( "pi8916.h16", 0x000000, 0x40000, CRC(7cffe0f6) SHA1(aba08617964fc425418b098be5167021768bd47c) )
ROM_REGION( 0x0a0000, "gfx4", 0 )
ROM_REGION( 0x0a0000, "sprites", 0 )
ROM_LOAD( "pi8910.k14", 0x000000, 0x80000, CRC(5a101b0b) SHA1(9645ab1f8d058cf2c6c42ccb4ce92a9b5db10c51) )
ROM_LOAD( "gt5.5", 0x080000, 0x20000, CRC(3d3ab273) SHA1(b5706ada9eb2c22fcc0ac8ede2d2ee02ee853191) )
ROM_REGION( 0x10000, "gfx5", 0 ) /* background tilemaps */
ROM_REGION( 0x10000, "bgtilemap", 0 ) /* background tilemaps */
ROM_LOAD( "gt11.11", 0x000000, 0x10000, CRC(b4f0fcf0) SHA1(b81cc0b6e3e6f5616789bb3e77807dc0ef718a38) )
ROM_REGION( 0x20000, "upd", 0 ) /* ADPCM samples */

View File

@ -5,9 +5,10 @@ class prehisle_state : public driver_device
public:
prehisle_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
m_tx_vram(*this, "tx_vram"),
m_spriteram(*this, "spriteram"),
m_bg_videoram16(*this, "bg_videoram16"),
m_fg_vram(*this, "fg_vram"),
m_tilemap_rom(*this, "bgtilemap"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_upd7759(*this, "upd"),
@ -15,25 +16,26 @@ public:
m_palette(*this, "palette") { }
required_shared_ptr<UINT16> m_videoram;
required_shared_ptr<UINT16> m_tx_vram;
required_shared_ptr<UINT16> m_spriteram;
required_shared_ptr<UINT16> m_bg_videoram16;
required_shared_ptr<UINT16> m_fg_vram;
required_region_ptr<UINT8> m_tilemap_rom;
UINT16 m_invert_controls;
tilemap_t *m_bg2_tilemap;
tilemap_t *m_bg_tilemap;
tilemap_t *m_fg_tilemap;
tilemap_t *m_tx_tilemap;
DECLARE_WRITE16_MEMBER(prehisle_sound16_w);
DECLARE_WRITE16_MEMBER(prehisle_bg_videoram16_w);
DECLARE_WRITE16_MEMBER(prehisle_fg_videoram16_w);
DECLARE_READ16_MEMBER(prehisle_control16_r);
DECLARE_WRITE16_MEMBER(prehisle_control16_w);
DECLARE_WRITE16_MEMBER(soundcmd_w);
DECLARE_WRITE16_MEMBER(fg_vram_w);
DECLARE_WRITE16_MEMBER(tx_vram_w);
DECLARE_READ16_MEMBER(control_r);
DECLARE_WRITE16_MEMBER(control_w);
DECLARE_WRITE8_MEMBER(D7759_write_port_0_w);
DECLARE_WRITE8_MEMBER(D7759_upd_reset_w);
TILE_GET_INFO_MEMBER(get_bg2_tile_info);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
virtual void video_start();
UINT32 screen_update_prehisle(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);

View File

@ -10,19 +10,19 @@
#include "includes/prehisle.h"
WRITE16_MEMBER(prehisle_state::prehisle_bg_videoram16_w)
WRITE16_MEMBER(prehisle_state::fg_vram_w)
{
COMBINE_DATA(&m_bg_videoram16[offset]);
m_bg_tilemap->mark_tile_dirty(offset);
}
WRITE16_MEMBER(prehisle_state::prehisle_fg_videoram16_w)
{
COMBINE_DATA(&m_videoram[offset]);
COMBINE_DATA(&m_fg_vram[offset]);
m_fg_tilemap->mark_tile_dirty(offset);
}
READ16_MEMBER(prehisle_state::prehisle_control16_r)
WRITE16_MEMBER(prehisle_state::tx_vram_w)
{
COMBINE_DATA(&m_tx_vram[offset]);
m_tx_tilemap->mark_tile_dirty(offset);
}
READ16_MEMBER(prehisle_state::control_r)
{
switch (offset)
{
@ -35,7 +35,7 @@ READ16_MEMBER(prehisle_state::prehisle_control16_r)
}
}
WRITE16_MEMBER(prehisle_state::prehisle_control16_w)
WRITE16_MEMBER(prehisle_state::control_w)
{
int scroll = 0;
@ -43,10 +43,10 @@ WRITE16_MEMBER(prehisle_state::prehisle_control16_w)
switch (offset)
{
case 0x00: m_bg_tilemap->set_scrolly(0, scroll); break;
case 0x08: m_bg_tilemap->set_scrollx(0, scroll); break;
case 0x10: m_bg2_tilemap->set_scrolly(0, scroll); break;
case 0x18: m_bg2_tilemap->set_scrollx(0, scroll); break;
case 0x00: m_fg_tilemap->set_scrolly(0, scroll); break;
case 0x08: m_fg_tilemap->set_scrollx(0, scroll); break;
case 0x10: m_bg_tilemap->set_scrolly(0, scroll); break;
case 0x18: m_bg_tilemap->set_scrollx(0, scroll); break;
case 0x23: m_invert_controls = data ? 0x00ff : 0x0000; break;
case 0x28: coin_counter_w(machine(), 0, data & 1); break;
case 0x29: coin_counter_w(machine(), 1, data & 1); break;
@ -60,13 +60,11 @@ WRITE16_MEMBER(prehisle_state::prehisle_control16_w)
0 .....xxx gfx code high bits
1 xxxxxxxx gfx code low bits
*/
TILE_GET_INFO_MEMBER(prehisle_state::get_bg2_tile_info)
TILE_GET_INFO_MEMBER(prehisle_state::get_bg_tile_info)
{
UINT8 const *const tilerom = memregion("gfx5")->base();
int const offs = tile_index * 2;
int const attr = tilerom[offs + 1] + (tilerom[offs] << 8);
int const code = (attr & 0x7ff) | 0x800;
int const attr = m_tilemap_rom[offs + 1] + (m_tilemap_rom[offs] << 8);
int const code = attr & 0x7ff;
int const color = attr >> 12;
int const flags = (attr & 0x800) ? TILE_FLIPX : 0;
@ -78,9 +76,9 @@ TILE_GET_INFO_MEMBER(prehisle_state::get_bg2_tile_info)
0 ....x... ........ flip y
0 .....xxx xxxxxxxx gfx code
*/
TILE_GET_INFO_MEMBER(prehisle_state::get_bg_tile_info)
TILE_GET_INFO_MEMBER(prehisle_state::get_fg_tile_info)
{
int const attr = m_bg_videoram16[tile_index];
int const attr = m_fg_vram[tile_index];
int const code = attr & 0x7ff;
int const color = attr >> 12;
int const flags = (attr & 0x800) ? TILE_FLIPY : 0;
@ -92,9 +90,9 @@ TILE_GET_INFO_MEMBER(prehisle_state::get_bg_tile_info)
0 xxxx.... ........ color
0 ....xxxx xxxxxxxx gfx code
*/
TILE_GET_INFO_MEMBER(prehisle_state::get_fg_tile_info)
TILE_GET_INFO_MEMBER(prehisle_state::get_tx_tile_info)
{
int const attr = m_videoram[tile_index];
int const attr = m_tx_vram[tile_index];
int const code = attr & 0xfff;
int const color = attr >> 12;
@ -104,30 +102,30 @@ TILE_GET_INFO_MEMBER(prehisle_state::get_fg_tile_info)
void prehisle_state::video_start()
{
// ROM-based background layer
m_bg2_tilemap = &machine().tilemap().create(
m_gfxdecode,
tilemap_get_info_delegate(FUNC(prehisle_state::get_bg2_tile_info), this),
TILEMAP_SCAN_COLS, // scan order
16, 16, // tile size
1024, 32); // tilemap size
// RAM-based background layer (overlays most sprites)
m_bg_tilemap = &machine().tilemap().create(
m_gfxdecode,
tilemap_get_info_delegate(FUNC(prehisle_state::get_bg_tile_info), this),
TILEMAP_SCAN_COLS, // scan order
16, 16, // tile size
256, 32); // tilemap size
m_bg_tilemap->set_transparent_pen(15);
1024, 32); // tilemap size
// text layer
// RAM-based foreground layer (overlays most sprites)
m_fg_tilemap = &machine().tilemap().create(
m_gfxdecode,
tilemap_get_info_delegate(FUNC(prehisle_state::get_fg_tile_info), this),
TILEMAP_SCAN_COLS, // scan order
16, 16, // tile size
256, 32); // tilemap size
m_fg_tilemap->set_transparent_pen(15);
// text layer
m_tx_tilemap = &machine().tilemap().create(
m_gfxdecode,
tilemap_get_info_delegate(FUNC(prehisle_state::get_tx_tile_info), this),
TILEMAP_SCAN_ROWS, // scan order
8, 8, // tile size
32, 32); // tilemap size
m_fg_tilemap->set_transparent_pen(15);
m_tx_tilemap->set_transparent_pen(15);
/* register for saving */
save_item(NAME(m_invert_controls));
@ -147,12 +145,12 @@ void prehisle_state::draw_sprites(screen_device &screen, bitmap_ind16 &bitmap, c
{
UINT16 const *const spriteram16 = m_spriteram;
for (int offs = 0; offs < 1024; offs += 4)
for (int offs = 1024 - 4; offs >= 0; offs -= 4)
{
int const attr = spriteram16[offs + 2];
int const code = attr & 0x1fff;
int const color = spriteram16[offs + 3] >> 12;
int const priority = (color < 0x4) ? 0x04 : 0x06;
int const priority = (color < 0x4) ? 0 : GFX_PMASK_1; // correct?
bool flipx = attr & 0x4000;
bool flipy = attr & 0x8000;
int sx = spriteram16[offs + 1] & 0x1ff;
@ -184,10 +182,9 @@ UINT32 prehisle_state::screen_update_prehisle(screen_device &screen, bitmap_ind1
{
screen.priority().fill(0, cliprect);
m_bg2_tilemap->draw(screen, bitmap, cliprect, 0, 0);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 1);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 2);
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 1);
draw_sprites(screen, bitmap, cliprect);
m_tx_tilemap->draw(screen, bitmap, cliprect, 0);
return 0;
}