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
97
98
99
100
101
|
/***************************************************************************
Tumblepop Video emulation - Bryan McPhail, mish@tendril.co.uk
*********************************************************************
Uses Data East custom chip 55 for backgrounds, custom chip 52 for sprites.
See Dark Seal & Caveman Ninja drivers for info on these chips.
Tumblepop is one of few games to take advantage of the playfields ability
to switch between 8*8 tiles and 16*16 tiles.
***************************************************************************/
#include "driver.h"
#include "deprecat.h"
#include "deco16ic.h"
static void draw_sprites(running_machine *machine, mame_bitmap *bitmap,const rectangle *cliprect)
{
int offs;
for (offs = 0;offs < 0x400;offs += 4)
{
int x,y,sprite,colour,multi,fx,fy,inc,flash,mult;
sprite = spriteram16[offs+1];
if (!sprite) continue;
y = spriteram16[offs];
flash=y&0x1000;
if (flash && (cpu_getcurrentframe() & 1)) continue;
x = spriteram16[offs+2];
colour = (x >>9) & 0x1f;
fx = y & 0x2000;
fy = y & 0x4000;
multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */
x = x & 0x01ff;
y = y & 0x01ff;
if (x >= 320) x -= 512;
if (y >= 256) y -= 512;
y = 240 - y;
x = 304 - x;
if (x>320) continue;
sprite &= ~multi;
if (fy)
inc = -1;
else
{
sprite += multi;
inc = 1;
}
if (flip_screen)
{
y=240-y;
x=304-x;
if (fx) fx=0; else fx=1;
if (fy) fy=0; else fy=1;
mult=16;
}
else mult=-16;
while (multi >= 0)
{
drawgfx(bitmap,machine->gfx[2],
sprite - multi * inc,
colour,
fx,fy,
x,y + mult * multi,
cliprect,TRANSPARENCY_PEN,0);
multi--;
}
}
}
VIDEO_START(tumblep)
{
deco16_1_video_init();
}
VIDEO_UPDATE(tumblep)
{
flip_screen_set( deco16_pf12_control[0]&0x80 );
deco16_pf12_update(deco16_pf1_rowscroll,deco16_pf2_rowscroll);
fillbitmap(bitmap,machine->pens[256],cliprect); /* not verified */
deco16_tilemap_2_draw(bitmap,cliprect,TILEMAP_DRAW_OPAQUE,0);
deco16_tilemap_1_draw(bitmap,cliprect,0,0);
draw_sprites(machine,bitmap,cliprect);
return 0;
}
|