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
102
103
104
105
106
107
108
109
110
111
112
113
|
/* Funny Bubble Video hardware
todo - convert to tilemap
*/
#include "emu.h"
#include "includes/funybubl.h"
WRITE8_HANDLER ( funybubl_paldatawrite )
{
funybubl_state *state = space->machine().driver_data<funybubl_state>();
int colchanged ;
UINT32 coldat;
state->m_paletteram[offset] = data;
colchanged = offset >> 2;
coldat = state->m_paletteram[colchanged * 4] | (state->m_paletteram[colchanged * 4 + 1] << 8) |
(state->m_paletteram[colchanged * 4 + 2] << 16) | (state->m_paletteram[colchanged * 4 + 3] << 24);
palette_set_color_rgb(space->machine(), colchanged, pal6bit(coldat >> 12), pal6bit(coldat >> 0), pal6bit(coldat >> 6));
}
VIDEO_START(funybubl)
{
}
static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect )
{
funybubl_state *state = machine.driver_data<funybubl_state>();
UINT8 *source = &state->m_banked_vram[0x2000 - 0x20];
UINT8 *finish = source - 0x1000;
while (source > finish)
{
int xpos, ypos, tile;
/* the sprites are in the sprite list twice
the first format (in comments) appears to be a buffer, if you use
this list you get garbage sprites in 2 player mode
the second format (used) seems correct
*/
/*
ypos = 0xff - source[1 + 0x10];
xpos = source[2 + 0x10];
tile = source[0 + 0x10] | ( (source[3 + 0x10] & 0x0f) <<8);
if (source[3 + 0x10] & 0x80) tile += 0x1000;
if (source[3 + 0x10] & 0x20) xpos += 0x100;
// bits 0x40 (not used?) and 0x10 (just set during transition period of x co-ord 0xff and 0x00) ...
xpos -= 8;
ypos -= 14;
*/
ypos = source[2];
xpos = source[3];
tile = source[0] | ( (source[1] & 0x0f) << 8);
if (source[1] & 0x80) tile += 0x1000;
if (source[1] & 0x20)
{
if (xpos < 0xe0)
xpos += 0x100;
}
// bits 0x40 and 0x10 not used?...
drawgfx_transpen(bitmap, cliprect, machine.gfx[1], tile, 0, 0, 0, xpos, ypos, 255);
source -= 0x20;
}
}
SCREEN_UPDATE(funybubl)
{
funybubl_state *state = screen->machine().driver_data<funybubl_state>();
int x, y, offs;
offs = 0;
bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine()));
/* tilemap .. convert it .. banking makes it slightly more annoying but still easy */
for (y = 0; y < 32; y++)
{
for (x = 0; x< 64; x++)
{
int data;
data = state->m_banked_vram[offs] | (state->m_banked_vram[offs + 1] << 8);
drawgfx_transpen(bitmap, cliprect, screen->machine().gfx[0], data & 0x7fff, (data & 0x8000) ? 2 : 1, 0, 0, x*8, y*8, 0);
offs += 2;
}
}
draw_sprites(screen->machine(), bitmap, cliprect);
#if 0
if ( screen->machine().input().code_pressed_once(KEYCODE_W) )
{
FILE *fp;
fp = fopen("funnybubsprites", "w+b");
if (fp)
{
fwrite(&state->m_banked_vram[0x1000], 0x1000, 1, fp);
fclose(fp);
}
}
#endif
return 0;
}
|