1 /***************************************************************************
2
3 Super Burger Time Video emulation - Bryan McPhail, mish@tendril.co.uk
4
5 *********************************************************************
6
7 Uses Data East custom chip 55 for backgrounds, custom chip 52 for sprites.
8
9 See Dark Seal & Caveman Ninja drivers for info on these chips.
10
11 End sequence uses rowscroll '98 c0' on pf1 (jmp to 1d61a)
12
13 ***************************************************************************/
14
15 #include "driver.h"
16 #include "vidhrdw/generic.h"
17
18 data16_t *supbtime_pf2_data,*supbtime_pf1_data,*supbtime_pf1_row;
19 static data16_t supbtime_control_0[8];
20 static struct tilemap *pf1_tilemap,*pf2_tilemap;
21 static int flipscreen;
22
23 /******************************************************************************/
24
supbtime_drawsprites(struct mame_bitmap * bitmap,const struct rectangle * cliprect)25 static void supbtime_drawsprites(struct mame_bitmap *bitmap,const struct rectangle *cliprect)
26 {
27 int offs;
28
29 for (offs = 0;offs < 0x400;offs += 4)
30 {
31 int x,y,sprite,colour,multi,fx,fy,inc,flash,mult;
32
33 sprite = spriteram16[offs+1] & 0x3fff;
34 if (!sprite) continue;
35
36 y = spriteram16[offs];
37 flash=y&0x1000;
38 if (flash && (cpu_getcurrentframe() & 1)) continue;
39
40 x = spriteram16[offs+2];
41 colour = (x >>9) & 0x1f;
42
43 fx = y & 0x2000;
44 fy = y & 0x4000;
45 multi = (1 << ((y & 0x0600) >> 9)) - 1; /* 1x, 2x, 4x, 8x height */
46
47 x = x & 0x01ff;
48 y = y & 0x01ff;
49 if (x >= 320) x -= 512;
50 if (y >= 256) y -= 512;
51 y = 240 - y;
52 x = 304 - x;
53
54 if (x>320) continue;
55
56 sprite &= ~multi;
57 if (fy)
58 inc = -1;
59 else
60 {
61 sprite += multi;
62 inc = 1;
63 }
64
65 if (flipscreen)
66 {
67 y=240-y;
68 x=304-x;
69 if (fx) fx=0; else fx=1;
70 if (fy) fy=0; else fy=1;
71 mult=16;
72 }
73 else mult=-16;
74
75 while (multi >= 0)
76 {
77 drawgfx(bitmap,Machine->gfx[2],
78 sprite - multi * inc,
79 colour,
80 fx,fy,
81 x,y + mult * multi,
82 cliprect,TRANSPARENCY_PEN,0);
83
84 multi--;
85 }
86 }
87 }
88
89 /******************************************************************************/
90
WRITE16_HANDLER(supbtime_pf2_data_w)91 WRITE16_HANDLER( supbtime_pf2_data_w )
92 {
93 data16_t oldword=supbtime_pf2_data[offset];
94 COMBINE_DATA(&supbtime_pf2_data[offset]);
95 if (oldword!=supbtime_pf2_data[offset])
96 tilemap_mark_tile_dirty(pf2_tilemap,offset);
97 }
98
WRITE16_HANDLER(supbtime_pf1_data_w)99 WRITE16_HANDLER( supbtime_pf1_data_w )
100 {
101 data16_t oldword=supbtime_pf1_data[offset];
102 COMBINE_DATA(&supbtime_pf1_data[offset]);
103 if (oldword!=supbtime_pf1_data[offset])
104 tilemap_mark_tile_dirty(pf1_tilemap,offset);
105 }
106
WRITE16_HANDLER(supbtime_control_0_w)107 WRITE16_HANDLER( supbtime_control_0_w )
108 {
109 COMBINE_DATA(&supbtime_control_0[offset]);
110 }
111
112 /******************************************************************************/
113
supbtime_scan(UINT32 col,UINT32 row,UINT32 num_cols,UINT32 num_rows)114 static UINT32 supbtime_scan(UINT32 col,UINT32 row,UINT32 num_cols,UINT32 num_rows)
115 {
116 /* logical (col,row) -> memory offset */
117 return (col & 0x1f) + ((row & 0x1f) << 5) + ((col & 0x20) << 5);
118 }
119
get_bg_tile_info(int tile_index)120 static void get_bg_tile_info(int tile_index)
121 {
122 int tile,color;
123
124 tile=supbtime_pf2_data[tile_index];
125 color=tile >> 12;
126 tile=tile&0xfff;
127
128 SET_TILE_INFO(
129 1,
130 tile,
131 color,
132 0)
133 }
134
get_fg_tile_info(int tile_index)135 static void get_fg_tile_info(int tile_index)
136 {
137 int tile=supbtime_pf1_data[tile_index];
138 int color=tile >> 12;
139
140 tile=tile&0xfff;
141 SET_TILE_INFO(
142 0,
143 tile,
144 color,
145 0)
146 }
147
VIDEO_START(supbtime)148 VIDEO_START( supbtime )
149 {
150 pf1_tilemap = tilemap_create(get_fg_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT, 8, 8,64,64);
151 pf2_tilemap = tilemap_create(get_bg_tile_info,supbtime_scan, TILEMAP_TRANSPARENT,16,16,64,32);
152
153 if (!pf1_tilemap || !pf2_tilemap)
154 return 1;
155
156 tilemap_set_transparent_pen(pf1_tilemap,0);
157 tilemap_set_transparent_pen(pf2_tilemap,0);
158
159 return 0;
160 }
161
162 /******************************************************************************/
163
VIDEO_UPDATE(supbtime)164 VIDEO_UPDATE( supbtime )
165 {
166 flipscreen=supbtime_control_0[0]&0x80;
167 tilemap_set_flip(ALL_TILEMAPS,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
168
169 tilemap_set_scrollx( pf1_tilemap,0, supbtime_control_0[1] );
170 tilemap_set_scrolly( pf1_tilemap,0, supbtime_control_0[2] );
171 tilemap_set_scrollx( pf2_tilemap,0, supbtime_control_0[3] );
172 tilemap_set_scrolly( pf2_tilemap,0, supbtime_control_0[4] );
173
174 /* 'Fake' rowscroll, used only in the end game message */
175 if (supbtime_control_0[6]==0xc0)
176 tilemap_set_scrollx( pf1_tilemap,0, supbtime_control_0[1] + supbtime_pf1_row[4] );
177
178 /* The filled bitmap is unusual for Data East, but without this the title screen
179 background colour is incorrect. This also explains why the game initialises
180 the previously unused palette ram to zero */
181 fillbitmap(bitmap,Machine->pens[768],cliprect);
182 tilemap_draw(bitmap,cliprect,pf2_tilemap,0,0);
183 supbtime_drawsprites(bitmap,cliprect);
184 tilemap_draw(bitmap,cliprect,pf1_tilemap,0,0);
185 }
186
VIDEO_UPDATE(chinatwn)187 VIDEO_UPDATE( chinatwn )
188 {
189 flipscreen=supbtime_control_0[0]&0x80;
190 tilemap_set_flip(ALL_TILEMAPS,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
191
192 tilemap_set_scrollx( pf1_tilemap,0, supbtime_control_0[1] );
193 tilemap_set_scrolly( pf1_tilemap,0, supbtime_control_0[2] );
194 if (flipscreen)
195 tilemap_set_scrollx( pf2_tilemap,0, supbtime_control_0[3]+1 );
196 else
197 tilemap_set_scrollx( pf2_tilemap,0, supbtime_control_0[3]-1 );
198 tilemap_set_scrolly( pf2_tilemap,0, supbtime_control_0[4] );
199
200 /* The filled bitmap is unusual for Data East, but without this the title screen
201 background colour is incorrect. This also explains why the game initialises
202 the previously unused palette ram to zero */
203 fillbitmap(bitmap,Machine->pens[768],cliprect);
204 tilemap_draw(bitmap,cliprect,pf2_tilemap,0,0);
205 supbtime_drawsprites(bitmap,cliprect);
206 tilemap_draw(bitmap,cliprect,pf1_tilemap,0,0);
207 }
208