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 unsigned char *ttmahjng_sharedram;
13 unsigned char *ttmahjng_videoram1;
14 unsigned char *ttmahjng_videoram2;
15 size_t ttmahjng_videoram_size;
16 
17 static struct mame_bitmap *tmpbitmap1;
18 static struct mame_bitmap *tmpbitmap2;
19 
20 static int video_flip;
21 static int video_color_select_1;
22 static int video_color_select_2;
23 static int video_remap_1;
24 static int video_remap_2;
25 static const unsigned char *ttmahjng_color_prom;
26 
27 /* Local functions */
28 static void modify_pen(int pen, int colorindex);
29 static void common_videoram_w(int offset,int data,
30                               int coloroffset, struct mame_bitmap *bitmap);
31 
32 
33 
PALETTE_INIT(ttmahjng)34 PALETTE_INIT( ttmahjng )
35 {
36 	ttmahjng_color_prom = color_prom;	/* we'll need this later */
37 }
38 
39 
40 /***************************************************************************
41 
42   Start the video hardware emulation.
43 
44 ***************************************************************************/
VIDEO_START(ttmahjng)45 VIDEO_START( ttmahjng )
46 {
47 	if ((tmpbitmap1 = auto_bitmap_alloc(Machine->drv->screen_width,Machine->drv->screen_height)) == 0)
48 		return 1;
49 
50 	if ((tmpbitmap2 = auto_bitmap_alloc(Machine->drv->screen_width,Machine->drv->screen_height)) == 0)
51 		return 1;
52 
53 	video_flip = 0;
54 	video_color_select_1 = 0;
55 	video_color_select_2 = 0;
56 	video_remap_1 = 1;
57 	video_remap_2 = 1;
58 
59 	return 0;
60 }
61 
62 /***************************************************************************
63   ttmahjng_out0_w
64 ***************************************************************************/
WRITE_HANDLER(ttmahjng_out0_w)65 WRITE_HANDLER( ttmahjng_out0_w )
66 {
67 	static int last_write = 0;
68 
69 	if (data == last_write) return;
70 
71 	video_color_select_1 = ((data & 0x1f) << 2);
72 
73 	/* Bit 5 is the coin counter. */
74 	coin_counter_w(0, data & 0x20);
75 
76 	video_remap_1 = 1;
77 	last_write = data;
78 }
79 
80 /***************************************************************************
81   ttmahjng_out1_w
82 ***************************************************************************/
WRITE_HANDLER(ttmahjng_out1_w)83 WRITE_HANDLER( ttmahjng_out1_w )
84 {
85 	static int last_write = 0;
86 
87 	if (data == last_write) return;
88 
89 	video_color_select_2 = ((data & 0x1f) << 2);
90 
91 	if (video_flip != ((data & 0x20) >> 5))
92 	{
93 		video_flip = (data & 0x20) >> 5;
94 	}
95 
96 	video_remap_2 = 1;
97 	last_write = data;
98 }
99 
100 /***************************************************************************
101   ttmahjng_sharedram_r
102 ***************************************************************************/
READ_HANDLER(ttmahjng_sharedram_r)103 READ_HANDLER( ttmahjng_sharedram_r )
104 {
105 	return ttmahjng_sharedram[offset];
106 }
107 
108 /***************************************************************************
109   ttmahjng_sharedram_w
110 ***************************************************************************/
WRITE_HANDLER(ttmahjng_sharedram_w)111 WRITE_HANDLER( ttmahjng_sharedram_w )
112 {
113 	ttmahjng_sharedram[offset] = data;
114 }
115 
116 /***************************************************************************
117   ttmahjng_videoram1_r
118 ***************************************************************************/
READ_HANDLER(ttmahjng_videoram1_r)119 READ_HANDLER( ttmahjng_videoram1_r )
120 {
121 	return ttmahjng_videoram1[offset];
122 }
123 
124 /***************************************************************************
125   ttmahjng_videoram2_r
126 ***************************************************************************/
READ_HANDLER(ttmahjng_videoram2_r)127 READ_HANDLER( ttmahjng_videoram2_r )
128 {
129 	return ttmahjng_videoram1[offset];
130 }
131 
132 /***************************************************************************
133   ttmahjng_videoram1_w
134 ***************************************************************************/
WRITE_HANDLER(ttmahjng_videoram1_w)135 WRITE_HANDLER( ttmahjng_videoram1_w )
136 {
137 	ttmahjng_videoram1[offset] = data;
138 
139 	common_videoram_w(offset, data, 0, tmpbitmap1);
140 }
141 
142 /***************************************************************************
143   ttmahjng_videoram2_w
144 ***************************************************************************/
WRITE_HANDLER(ttmahjng_videoram2_w)145 WRITE_HANDLER( ttmahjng_videoram2_w )
146 {
147 	ttmahjng_videoram2[offset] = data;
148 
149 	common_videoram_w(offset, data, 4, tmpbitmap2);
150 }
151 
152 /***************************************************************************
153   common_videoram_w
154 ***************************************************************************/
common_videoram_w(int offset,int data,int coloroffset,struct mame_bitmap * bitmap)155 static void common_videoram_w(int offset,int data,
156                               int coloroffset, struct mame_bitmap *bitmap)
157 {
158 	int x, y, color1, color2, color3, color4;
159 
160 	x = ((offset & 0x3f) << 2);
161 	y = (offset & 0xffc0) >> 6;
162 
163 	if (video_flip)
164 	{
165 		x = 255 - x;
166 		y = 255 - y;
167 	}
168 
169 	color4 = ((data & 0x80) >> 6) | ((data & 0x08) >> 3);
170 	color3 = ((data & 0x40) >> 5) | ((data & 0x04) >> 2);
171 	color2 = ((data & 0x20) >> 4) | ((data & 0x02) >> 1);
172 	color1 = ((data & 0x10) >> 3) | ((data & 0x01)     );
173 
174 	if (video_flip)
175 	{
176 		plot_pixel(bitmap, x  , y, Machine->pens[color1 | coloroffset]);
177 		plot_pixel(bitmap, x-1, y, Machine->pens[color2 | coloroffset]);
178 		plot_pixel(bitmap, x-2, y, Machine->pens[color3 | coloroffset]);
179 		plot_pixel(bitmap, x-3, y, Machine->pens[color4 | coloroffset]);
180 	}
181 	else
182 	{
183 		plot_pixel(bitmap, x  , y, Machine->pens[color1 | coloroffset]);
184 		plot_pixel(bitmap, x+1, y, Machine->pens[color2 | coloroffset]);
185 		plot_pixel(bitmap, x+2, y, Machine->pens[color3 | coloroffset]);
186 		plot_pixel(bitmap, x+3, y, Machine->pens[color4 | coloroffset]);
187 	}
188 }
189 
190 /***************************************************************************
191 
192   Draw the game screen in the given mame_bitmap.
193   Do NOT call osd_update_display() from this function, it will be called by
194   the main emulation engine.
195 
196 ***************************************************************************/
VIDEO_UPDATE(ttmahjng)197 VIDEO_UPDATE( ttmahjng )
198 {
199 	if (video_remap_1)
200 	{
201 		modify_pen(0, video_color_select_1 + 0);
202 		modify_pen(1, video_color_select_1 + 1);
203 		modify_pen(2, video_color_select_1 + 2);
204 		modify_pen(3, video_color_select_1 + 3);
205 	}
206 
207 	if (video_remap_2)
208 	{
209 		modify_pen(4, video_color_select_2 + 0);
210 		modify_pen(5, video_color_select_2 + 1);
211 		modify_pen(6, video_color_select_2 + 2);
212 		modify_pen(7, video_color_select_2 + 3);
213 	}
214 
215 
216 	if (get_vh_global_attribute_changed() || video_remap_1 || video_remap_2)
217 	{
218 		int offs;
219 
220 		// redraw bitmaps
221 		for (offs = 0; offs < ttmahjng_videoram_size; offs++)
222 		{
223 			ttmahjng_videoram1_w(offs, ttmahjng_videoram1[offs]);
224 			ttmahjng_videoram2_w(offs, ttmahjng_videoram2[offs]);
225 		}
226 	}
227 
228 	video_remap_1 = 0;
229 	video_remap_2 = 0;
230 
231 
232 	copybitmap(bitmap,tmpbitmap2,0,0,0,0,&Machine->visible_area,TRANSPARENCY_NONE,0);
233 	copybitmap(bitmap,tmpbitmap1,0,0,0,0,&Machine->visible_area,TRANSPARENCY_COLOR,0);
234 }
235 
236 /***************************************************************************
237   mofify_pen
238  ***************************************************************************/
modify_pen(int pen,int colorindex)239 static void modify_pen(int pen, int colorindex)
240 {
241 	int r,g,b,color;
242 
243 	color = ttmahjng_color_prom[colorindex];
244 
245 	b = ((color & 1) ? 0xff : 0x00);
246 	g = ((color & 2) ? 0xff : 0x00);
247 	r = ((color & 4) ? 0xff : 0x00);
248 
249 	palette_set_color(pen,r,g,b);
250 }
251