summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/tigeroad_spr.c
blob: d7e764f4d6cf962f7454d66bed7642111052a803 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*

    very simple sprite scheme, used by some Capcom games and hardware cloned from them

    bionicc.c
    tigeroad.c
    supduck.c

    it is unknown if this is handled by a custom chip, or simple logic.
    y positions are inverted in Bionic Commando, but it seems otherwise the same as
    Tiger Road

*/


#include "emu.h"
#include "tigeroad_spr.h"


const device_type TIGEROAD_SPRITE = &device_creator<tigeroad_spr_device>;

tigeroad_spr_device::tigeroad_spr_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
	: device_t(mconfig, TIGEROAD_SPRITE, "Simple Capcom (Tiger Road) Sprite", tag, owner, clock, "tigeroad_spr", __FILE__)
{
}


void tigeroad_spr_device::device_start()
{
}



void tigeroad_spr_device::device_reset()
{
}

/*
   4  words per sprite

   0  ---- ---t tttt tttt = tile number

   1  ---- ---- --cc cc-- = colour
   1  ---- ---- ---- --x- = flip x
   1  ---- ---- ---- ---y = flip y

   2  ---- ---x xxxx xxxx = x pos (signed)

   3  ---- ---y yyyy yyyy = y pos (signed)

*/


void tigeroad_spr_device::draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect, gfxdecode_device *gfxdecode, int region, UINT16* ram, UINT32 size, int flip_screen, int rev_y )
{
	UINT16 *source = &ram[size/2] - 4;
	UINT16 *finish = ram;

	while (source >= finish)
	{
		int tile_number = source[0];

		int attr = source[1];
		int sy = source[2] & 0x1ff;
		int sx = source[3] & 0x1ff;

		int flipx = attr & 0x02;
		int flipy = attr & 0x01;
		int color = (attr >> 2) & 0x0f;

		if (sx > 0x100) sx -= 0x200;
		if (sy > 0x100) sy -= 0x200;

		if (flip_screen)
		{
			sx = 240 - sx;
			sy = 240 - sy;
			flipx = !flipx;
			flipy = !flipy;
		}

		if (rev_y)
			sy = 240 - sy;


		gfxdecode->gfx(region)->transpen(bitmap,cliprect,
		tile_number,
		color,
		flipx, flipy,
		sx, sy, 15);

		source -= 4;
	}
}