1 
2 
3 /***************************************************************************
4 	Video Hardware description for Taito Gladiator
5 
6 ***************************************************************************/
7 #include "driver.h"
8 #include "vidhrdw/generic.h"
9 
10 static int video_attributes;
11 static int base_scroll;
12 static int background_scroll;
13 static int sprite_bank;
14 
15 unsigned char *gladiatr_scroll;
16 unsigned char *gladiator_text;
17 
18 
update_color(int offset)19 static void update_color(int offset)
20 {
21 	int r,g,b;
22 
23 
24 	r = (paletteram[offset] >> 0) & 0x0f;
25 	g = (paletteram[offset] >> 4) & 0x0f;
26 	b = (paletteram_2[offset] >> 0) & 0x0f;
27 
28 	r = (r << 1) + ((paletteram_2[offset] >> 4) & 0x01);
29 	g = (g << 1) + ((paletteram_2[offset] >> 5) & 0x01);
30 	b = (b << 1) + ((paletteram_2[offset] >> 6) & 0x01);
31 
32 	r = (r << 3) | (r >> 2);
33 	g = (g << 3) | (g >> 2);
34 	b = (b << 3) | (b >> 2);
35 
36 	palette_change_color(offset,r,g,b);
37 
38 	/* the text layer might use the other 512 entries in the palette RAM */
39 	/* (which are all set to 0x07ff = white). I don't know, so I just set */
40 	/* it to white. */
41 	palette_change_color(512,0x00,0x00,0x00);
42 	palette_change_color(513,0xff,0xff,0xff);
43 }
44 
WRITE_HANDLER(gladiatr_paletteram_rg_w)45 WRITE_HANDLER( gladiatr_paletteram_rg_w )
46 {
47 	paletteram[offset] = data;
48 	update_color(offset);
49 }
50 
WRITE_HANDLER(gladiatr_paletteram_b_w)51 WRITE_HANDLER( gladiatr_paletteram_b_w )
52 {
53 	paletteram_2[offset] = data;
54 	update_color(offset);
55 }
56 
57 
58 WRITE_HANDLER( gladiatr_spritebank_w );
WRITE_HANDLER(gladiatr_spritebank_w)59 WRITE_HANDLER( gladiatr_spritebank_w ){
60 	sprite_bank = (data)?4:2;
61 }
62 
63 READ_HANDLER( gladiatr_video_registers_r );
READ_HANDLER(gladiatr_video_registers_r)64 READ_HANDLER( gladiatr_video_registers_r ){
65 	switch( offset ){
66 		case 0x080: return video_attributes;
67 		case 0x100: return base_scroll;
68 		case 0x300: return background_scroll;
69 	}
70 	return 0;
71 }
72 
73 WRITE_HANDLER( gladiatr_video_registers_w );
WRITE_HANDLER(gladiatr_video_registers_w)74 WRITE_HANDLER( gladiatr_video_registers_w ){
75 	switch( offset ){
76 		case 0x000: break;
77 		case 0x080: video_attributes = data; break;
78 		case 0x100: base_scroll = data; break;
79 		case 0x200: break;
80 		case 0x300: background_scroll = data; break;
81 	}
82 }
83 
84 
85 int gladiatr_vh_start(void);
gladiatr_vh_start(void)86 int gladiatr_vh_start(void){
87 	sprite_bank = 2;
88 
89 	dirtybuffer = (unsigned char*)malloc(64*32);
90 	if( dirtybuffer ){
91 		tmpbitmap = bitmap_alloc(512,256);
92 		if( tmpbitmap ){
93 			memset(dirtybuffer,1,64*32);
94 			return 0;
95 		}
96 		free( dirtybuffer );
97 	}
98 	return 1; /* error */
99 }
100 
101 void gladiatr_vh_stop(void);
gladiatr_vh_stop(void)102 void gladiatr_vh_stop(void){
103 	bitmap_free(tmpbitmap);
104 	free(dirtybuffer);
105 }
106 
107 
108 static void render_background( struct osd_bitmap *bitmap );
render_background(struct osd_bitmap * bitmap)109 static void render_background( struct osd_bitmap *bitmap ){
110 	int i;
111 	static int tile_bank_select = 0;
112 
113 	int scrollx = - background_scroll;
114 
115 	if( base_scroll < 0xd0 ){
116 		scrollx += 256-(0xd0)-64-32;
117 
118 		if( video_attributes&0x04 ){
119 			scrollx += 256;
120 		}
121 	}
122 	else {
123 		if( video_attributes&0x04 ){
124 			scrollx += base_scroll;
125 		}
126 		else {
127 			scrollx += 256-(0xd0)-64-32;
128 		}
129 	}
130 
131 	{
132 		int old_bank_select = tile_bank_select;
133 		if( video_attributes & 0x10 ){
134 			tile_bank_select = 256*8;
135 		}
136 		else {
137 			tile_bank_select = 0;
138 		}
139 		if( old_bank_select != tile_bank_select )
140 			memset(dirtybuffer,1,64*32);
141 	}
142 
143 	for( i=0; i<64*32; i++ ){
144 		if( dirtybuffer[i] ){
145 			int sx = (i%64)*8;
146 			int sy = (i/64)*8;
147 
148 			int attributes = colorram[i];
149 			int color = 0x1F - (attributes>>3);
150 			int tile_number = videoram[i] + 256*(attributes&0x7) + tile_bank_select;
151 
152 			drawgfx(tmpbitmap,Machine->gfx[1+(tile_number/512)],
153 				tile_number%512,
154 				color,
155 				0,0, /* no flip */
156 				sx,sy,
157 				0, /* no need to clip */
158 				TRANSPARENCY_NONE,0);
159 
160 			dirtybuffer[i] = 0;
161 		}
162 	}
163 
164 	copyscrollbitmap(bitmap,tmpbitmap,
165 		1,&scrollx,
166 		0,0,
167 		&Machine->visible_area,TRANSPARENCY_NONE,0);
168 }
169 
170 static void render_text( struct osd_bitmap *bitmap );
render_text(struct osd_bitmap * bitmap)171 static void render_text( struct osd_bitmap *bitmap ){
172 	const struct rectangle *clip = &Machine->visible_area;
173 	const struct GfxElement *gfx = Machine->gfx[0];
174 
175 	int tile_bank_offset = (video_attributes&3)*256;
176 
177 	unsigned char *source = gladiator_text;
178 
179 	int sx,sy;
180 
181 	int dx;
182 
183 	if( base_scroll < 0xd0 ){ /* panning text */
184 		dx = 256-(0xd0)-64-32- background_scroll;
185 		if( video_attributes&0x04 ){ dx += 256; }
186 	}
187 	else { /* fixed text */
188 		dx = 0;
189 		if( (video_attributes&0x08)==0 ) source += 32; /* page 2 */
190 	}
191 
192 	for( sy=0; sy<256; sy+=8 ){
193 		for( sx=0; sx<256; sx+=8 ){
194 			drawgfx( bitmap,gfx,
195 				tile_bank_offset + *source++,
196 				0, /* color */
197 				0,0, /* no flip */
198 				sx+dx,sy,
199 				clip,TRANSPARENCY_PEN,0);
200 		}
201 		source += 32; /* skip to next row */
202 	}
203 }
204 
205 static void draw_sprite( struct osd_bitmap *bitmap, int tile_number, int color, int sx, int sy, int xflip, int yflip, int big );
draw_sprite(struct osd_bitmap * bitmap,int tile_number,int color,int sx,int sy,int xflip,int yflip,int big)206 static void draw_sprite( struct osd_bitmap *bitmap, int tile_number, int color, int sx, int sy, int xflip, int yflip, int big ){
207 	const struct rectangle *clip = &Machine->visible_area;
208 
209 	static int tile_offset[4][4] = {
210 		{0x0,0x1,0x4,0x5},
211 		{0x2,0x3,0x6,0x7},
212 		{0x8,0x9,0xC,0xD},
213 		{0xA,0xB,0xE,0xF}
214 	};
215 
216 	int x,y;
217 
218 	int size = big?4:2;
219 
220 	for( y=0; y<size; y++ ){
221 		for( x=0; x<size; x++ ){
222 			int ex = xflip?(size-1-x):x;
223 			int ey = yflip?(size-1-y):y;
224 
225 			int t = tile_offset[ey][ex] + tile_number;
226 
227 			drawgfx(bitmap,Machine->gfx[1+8+((t/512)%12)],
228 				t%512,
229 
230 				color,
231 				xflip,yflip,
232 				sx+x*8,sy+y*8,
233 				clip,TRANSPARENCY_PEN,0);
234 		}
235 	}
236 }
237 
238 static void render_sprites(struct osd_bitmap *bitmap);
render_sprites(struct osd_bitmap * bitmap)239 static void render_sprites(struct osd_bitmap *bitmap){
240 	unsigned char *source = spriteram;
241 	unsigned char *finish = source+0x400;
242 
243 	do{
244 		int attributes = source[0x800];
245 		int big = attributes&0x10;
246 		int bank = (attributes&0x1) + ((attributes&2)?sprite_bank:0);
247 		int tile_number = (source[0]+256*bank)*4;
248 		int sx = source[0x400+1] + 256*(source[0x801]&1);
249 		int sy = 240-source[0x400] - (big?16:0);
250 		int xflip = attributes&0x04;
251 		int yflip = attributes&0x08;
252 		int color = 0x20 + (source[1]&0x1F);
253 
254 		if( (video_attributes & 0x04) && (base_scroll < 0xd0) )
255 			sx += 256-64+8-0xD0-64+8;
256 		else
257 			sx += base_scroll-0xD0-64+8;
258 
259 		draw_sprite( bitmap, tile_number, color, sx,sy, xflip,yflip, big );
260 
261 		source+=2;
262 	}while( source<finish );
263 }
264 
265 
266 
gladiatr_vh_screenrefresh(struct osd_bitmap * bitmap,int full_refresh)267 void gladiatr_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
268 {
269 	if (video_attributes & 0x20)	/* screen refresh enable? */
270 	{
271 		if (palette_recalc())
272 			memset(dirtybuffer,1,64*32);
273 
274 		render_background( bitmap );
275 		render_sprites( bitmap );
276 		render_text( bitmap );
277 	}
278 }
279