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