1 /***************************************************************************
2
3 Goal '92 video hardware
4
5 ***************************************************************************/
6
7 #include "driver.h"
8 #include "vidhrdw/generic.h"
9
10 data16_t *goal92_back_data,*goal92_fore_data,*goal92_textram,*goal92_scrollram16;
11
12 static struct tilemap *background_layer,*foreground_layer,*text_layer;
13
14 static data16_t fg_bank = 0;
15
READ16_HANDLER(goal92_fg_bank_r)16 READ16_HANDLER( goal92_fg_bank_r )
17 {
18 return fg_bank;
19 }
20
WRITE16_HANDLER(goal92_fg_bank_w)21 WRITE16_HANDLER( goal92_fg_bank_w )
22 {
23 COMBINE_DATA(&fg_bank);
24
25 if(ACCESSING_LSB)
26 {
27 tilemap_mark_all_tiles_dirty(foreground_layer);
28 }
29 }
30
WRITE16_HANDLER(goal92_text_w)31 WRITE16_HANDLER( goal92_text_w )
32 {
33 int oldword = goal92_textram[offset];
34 COMBINE_DATA(&goal92_textram[offset]);
35 if (oldword != goal92_textram[offset])
36 tilemap_mark_tile_dirty(text_layer,offset);
37 }
38
WRITE16_HANDLER(goal92_background_w)39 WRITE16_HANDLER( goal92_background_w )
40 {
41 int oldword = goal92_back_data[offset];
42 COMBINE_DATA(&goal92_back_data[offset]);
43 if (oldword != goal92_back_data[offset])
44 tilemap_mark_tile_dirty(background_layer,offset);
45 }
46
WRITE16_HANDLER(goal92_foreground_w)47 WRITE16_HANDLER( goal92_foreground_w )
48 {
49 int oldword = goal92_fore_data[offset];
50 COMBINE_DATA(&goal92_fore_data[offset]);
51 if (oldword != goal92_fore_data[offset])
52 tilemap_mark_tile_dirty(foreground_layer,offset);
53 }
54
get_text_tile_info(int tile_index)55 static void get_text_tile_info(int tile_index)
56 {
57 int tile = goal92_textram[tile_index];
58 int color=(tile>>12)&0xf;
59
60 tile &= 0xfff;
61
62 tile |= 0xc000;
63
64 SET_TILE_INFO(1,tile,color,0)
65 }
66
get_back_tile_info(int tile_index)67 static void get_back_tile_info(int tile_index)
68 {
69 int tile=goal92_back_data[tile_index];
70 int color=(tile>>12)&0xf;
71
72 tile &= 0xfff;
73
74 SET_TILE_INFO(2,tile,color,0)
75 }
76
get_fore_tile_info(int tile_index)77 static void get_fore_tile_info(int tile_index)
78 {
79 int tile=goal92_fore_data[tile_index];
80 int color=(tile>>12)&0xf;
81 int region;
82
83 tile &= 0xfff;
84
85 if(fg_bank & 0xff)
86 {
87 region = 3;
88 tile |= 0x1000;
89 }
90 else
91 {
92 region = 4;
93 tile |= 0x2000;
94 }
95
96 SET_TILE_INFO(region,tile,color,0)
97 }
98
draw_sprites(struct mame_bitmap * bitmap,const struct rectangle * cliprect,int pri)99 static void draw_sprites(struct mame_bitmap *bitmap,const struct rectangle *cliprect,int pri)
100 {
101 int offs,fx,fy,x,y,color,sprite;
102
103 for (offs = 3;offs <= 0x400-5;offs += 4)
104 {
105 UINT16 data = spriteram16[offs+2];
106
107 y = spriteram16[offs+0];
108
109 if (y & 0x8000)
110 break;
111
112 if (!(data & 0x8000))
113 continue;
114
115 sprite = spriteram16[offs+1];
116
117 if ((sprite>>14)!=pri)
118 continue;
119
120 x = spriteram16[offs+3];
121
122 sprite &= 0x1fff;
123
124 x &= 0x1ff;
125 y &= 0x1ff;
126
127 color = (data & 0x3f) + 0x40;
128 fx = (data & 0x4000) >> 14;
129 fy = 0;
130
131 x -= 320/4-16-1;
132
133 y = 256-(y+7);
134
135 drawgfx(bitmap,Machine->gfx[0],
136 sprite,
137 color,fx,fy,x,y,
138 cliprect,TRANSPARENCY_PEN,15);
139 }
140 }
141
142
VIDEO_START(goal92)143 VIDEO_START( goal92 )
144 {
145 background_layer = tilemap_create(get_back_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
146 foreground_layer = tilemap_create(get_fore_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,32,32);
147 text_layer = tilemap_create(get_text_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT, 8,8,64,32);
148
149 if (!background_layer || !foreground_layer || !text_layer)
150 return 1;
151
152 tilemap_set_transparent_pen(background_layer,15);
153 tilemap_set_transparent_pen(foreground_layer,15);
154 tilemap_set_transparent_pen(text_layer,15);
155
156 return 0;
157 }
158
VIDEO_UPDATE(goal92)159 VIDEO_UPDATE( goal92 )
160 {
161 tilemap_set_scrollx( background_layer, 0, goal92_scrollram16[0] + 60);
162 tilemap_set_scrolly( background_layer, 0, goal92_scrollram16[1] + 8);
163
164 if(fg_bank & 0xff)
165 {
166 tilemap_set_scrollx( foreground_layer, 0, goal92_scrollram16[0] + 60);
167 tilemap_set_scrolly( foreground_layer, 0, goal92_scrollram16[1] + 8);
168 }
169 else
170 {
171 tilemap_set_scrollx( foreground_layer, 0, goal92_scrollram16[2] + 60);
172 tilemap_set_scrolly( foreground_layer, 0, goal92_scrollram16[3] + 8);
173 }
174
175 fillbitmap(bitmap,get_black_pen(),cliprect);
176
177 tilemap_draw(bitmap,cliprect,background_layer,0,0);
178 draw_sprites(bitmap,cliprect,2);
179
180 if(!(fg_bank & 0xff))
181 draw_sprites(bitmap,cliprect,1);
182
183 tilemap_draw(bitmap,cliprect,foreground_layer,0,0);
184
185 if(fg_bank & 0xff)
186 draw_sprites(bitmap,cliprect,1);
187
188 draw_sprites(bitmap,cliprect,0);
189 draw_sprites(bitmap,cliprect,3);
190 tilemap_draw(bitmap,cliprect,text_layer,0,0);
191 }
192