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