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
95
96
|
// license:BSD-3-Clause
// copyright-holders:David Haywood
/*
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"
DEFINE_DEVICE_TYPE(TIGEROAD_SPRITE, tigeroad_spr_device, "tigeroad_spr", "Simple Capcom (Tiger Road) Sprite")
tigeroad_spr_device::tigeroad_spr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, TIGEROAD_SPRITE, tag, owner, clock)
{
}
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_t* ram, uint32_t size, int flip_screen, int rev_y )
{
uint16_t *source = &ram[size/2] - 4;
uint16_t *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;
}
}
|