1 /***************************************************************************
2
3 vidhrdw.c
4
5 Functions to emulate the video hardware of the machine.
6
7 ***************************************************************************/
8
9 #include "driver.h"
10 #include "vidhrdw/generic.h"
11
12
13 unsigned char *zodiack_videoram2;
14
15 extern unsigned char *galaxian_attributesram;
16 extern unsigned char *galaxian_bulletsram;
17 extern size_t galaxian_bulletsram_size;
18 extern int percuss_hardware;
19
20 static int flipscreen;
21
zodiack_vh_convert_color_prom(unsigned char * palette,unsigned short * colortable,const unsigned char * color_prom)22 void zodiack_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom)
23 {
24 int i;
25 #define TOTAL_COLORS(gfxn) (Machine->gfx[gfxn]->total_colors * Machine->gfx[gfxn]->color_granularity)
26 #define COLOR(gfxn,offs) (colortable[Machine->drv->gfxdecodeinfo[gfxn].color_codes_start + offs])
27
28
29 /* first, the character/sprite palette */
30 for (i = 0;i < Machine->drv->total_colors-1; i++)
31 {
32 int bit0,bit1,bit2;
33
34 /* red component */
35 bit0 = (*color_prom >> 0) & 0x01;
36 bit1 = (*color_prom >> 1) & 0x01;
37 bit2 = (*color_prom >> 2) & 0x01;
38 *(palette++) = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
39 /* green component */
40 bit0 = (*color_prom >> 3) & 0x01;
41 bit1 = (*color_prom >> 4) & 0x01;
42 bit2 = (*color_prom >> 5) & 0x01;
43 *(palette++) = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
44 /* blue component */
45 bit0 = 0;
46 bit1 = (*color_prom >> 6) & 0x01;
47 bit2 = (*color_prom >> 7) & 0x01;
48 *(palette++) = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
49
50 color_prom++;
51 }
52
53 /* white for bullets */
54 *(palette++) = 0xff;
55 *(palette++) = 0xff;
56 *(palette++) = 0xff;
57
58
59 for (i = 0;i < TOTAL_COLORS(0);i+=2)
60 {
61 COLOR(0,i ) = (32 + (i / 2));
62 COLOR(0,i+1) = (40 + (i / 2));
63 }
64
65 for (i = 0;i < TOTAL_COLORS(3);i++)
66 {
67 if ((i & 3) == 0) COLOR(3,i) = 0;
68 }
69
70 /* bullet */
71 COLOR(2, 0) = 0;
72 COLOR(2, 1) = 48;
73 }
74
75
WRITE_HANDLER(zodiac_flipscreen_w)76 WRITE_HANDLER( zodiac_flipscreen_w )
77 {
78 if (flipscreen != (!data))
79 {
80 flipscreen = !data;
81
82 memset(dirtybuffer, 1, videoram_size);
83 }
84 }
85
86
WRITE_HANDLER(zodiac_control_w)87 WRITE_HANDLER( zodiac_control_w )
88 {
89 /* Bit 0-1 - coin counters */
90 coin_counter_w(0, data & 0x02);
91 coin_counter_w(1, data & 0x01);
92
93 /* Bit 2 - ???? */
94 }
95
96 /***************************************************************************
97
98 Draw the game screen in the given osd_bitmap.
99 Do NOT call osd_update_display() from this function, it will be called by
100 the main emulation engine.
101
102 ***************************************************************************/
103
zodiack_vh_screenrefresh(struct osd_bitmap * bitmap,int full_refresh)104 void zodiack_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
105 {
106 int offs;
107
108
109 /* draw the background characters */
110 for (offs = 0; offs < videoram_size; offs++)
111 {
112 int code,sx,sy,col;
113
114
115 if (!dirtybuffer[offs]) continue;
116
117 dirtybuffer[offs] = 0;
118
119
120 sy = offs / 32;
121 sx = offs % 32;
122
123 col = galaxian_attributesram[2 * sx + 1] & 0x07;
124
125 if (flipscreen)
126 {
127 sx = 31 - sx;
128 sy = 31 - sy;
129 }
130
131 code = videoram[offs];
132
133 drawgfx(tmpbitmap,Machine->gfx[3],
134 code,
135 col,
136 flipscreen, flipscreen,
137 8*sx, 8*sy,
138 0,TRANSPARENCY_NONE,0);
139 }
140
141
142 /* draw the foreground characters */
143 for (offs = 0; offs < videoram_size; offs++)
144 {
145 int code,sx,sy,col;
146
147
148 sy = offs / 32;
149 sx = offs % 32;
150
151 col = (galaxian_attributesram[2 * sx + 1] >> 4) & 0x07;
152
153 if (flipscreen)
154 {
155 sy = 31 - sy;
156 sx = 31 - sx;
157 }
158
159 code = zodiack_videoram2[offs];
160
161 drawgfx(bitmap,Machine->gfx[0],
162 code,
163 col,
164 flipscreen, flipscreen,
165 8*sx, 8*sy,
166 &Machine->visible_area,TRANSPARENCY_NONE,0);
167 }
168
169
170 /* copy the temporary bitmap to the screen */
171 {
172 int i, scroll[32];
173
174
175 if (flipscreen)
176 {
177 for (i = 0;i < 32;i++)
178 {
179 scroll[31-i] = galaxian_attributesram[2 * i];
180 }
181 }
182 else
183 {
184 for (i = 0;i < 32;i++)
185 {
186 scroll[i] = -galaxian_attributesram[2 * i];
187 }
188 }
189
190 copyscrollbitmap(bitmap,tmpbitmap,0,0,32,scroll,&Machine->visible_area,TRANSPARENCY_COLOR,0);
191 }
192
193
194 /* draw the bullets */
195 for (offs = 0;offs < galaxian_bulletsram_size;offs += 4)
196 {
197 int x,y;
198
199
200 x = galaxian_bulletsram[offs + 3] + Machine->drv->gfxdecodeinfo[2].gfxlayout->width;
201 y = galaxian_bulletsram[offs + 1];
202
203 if (!percuss_hardware)
204 {
205 y = 255 - y;
206 }
207
208 drawgfx(bitmap,Machine->gfx[2],
209 0, /* this is just a dot, generated by the hardware */
210 0,
211 0,0,
212 x,y,
213 &Machine->visible_area,TRANSPARENCY_PEN,0);
214 }
215
216
217 /* draw the sprites */
218 for (offs = spriteram_size - 4;offs >= 0;offs -= 4)
219 {
220 int flipx,flipy,sx,sy,spritecode;
221
222
223 sx = 240 - spriteram[offs + 3];
224 sy = 240 - spriteram[offs];
225 flipx = !(spriteram[offs + 1] & 0x40);
226 flipy = spriteram[offs + 1] & 0x80;
227 spritecode = spriteram[offs + 1] & 0x3f;
228
229 if (percuss_hardware)
230 {
231 sy = 240 - sy;
232 flipy = !flipy;
233 }
234
235 drawgfx(bitmap,Machine->gfx[1],
236 spritecode,
237 spriteram[offs + 2] & 0x07,
238 flipx,flipy,
239 sx,sy,
240 //flipscreen[0] ? &spritevisibleareaflipx : &spritevisiblearea,TRANSPARENCY_PEN,0);
241 //&spritevisiblearea,TRANSPARENCY_PEN,0);
242 &Machine->visible_area,TRANSPARENCY_PEN,0);
243 }
244 }
245