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