1 #include "driver.h"
2 
3 unsigned char *bjtwin_cmdram;
4 unsigned char *bjtwin_workram;
5 unsigned char *bjtwin_spriteram;
6 unsigned char *bjtwin_txvideoram;
7 unsigned char *bjtwin_videocontrol;
8 size_t bjtwin_txvideoram_size;
9 
10 static unsigned char * dirtybuffer;
11 static struct osd_bitmap *tmpbitmap;
12 static int flipscreen = 0;
13 
14 
bjtwin_vh_start(void)15 int bjtwin_vh_start(void)
16 {
17 	dirtybuffer = (unsigned char*)malloc(bjtwin_txvideoram_size/2);
18 	tmpbitmap = bitmap_alloc(Machine->drv->screen_width,Machine->drv->screen_height);
19 
20 	if (!dirtybuffer || !tmpbitmap)
21 	{
22 		if (tmpbitmap) bitmap_free(tmpbitmap);
23 		if (dirtybuffer) free(dirtybuffer);
24 		return 1;
25 	}
26 
27 	bjtwin_spriteram = bjtwin_workram + 0x8000;
28 
29 	return 0;
30 }
31 
bjtwin_vh_stop(void)32 void bjtwin_vh_stop(void)
33 {
34 	bitmap_free(tmpbitmap);
35 	free(dirtybuffer);
36 
37 	dirtybuffer = 0;
38 	tmpbitmap = 0;
39 }
40 
41 
READ_HANDLER(bjtwin_txvideoram_r)42 READ_HANDLER( bjtwin_txvideoram_r )
43 {
44 	return READ_WORD(&bjtwin_txvideoram[offset]);
45 }
46 
WRITE_HANDLER(bjtwin_txvideoram_w)47 WRITE_HANDLER( bjtwin_txvideoram_w )
48 {
49 	int oldword = READ_WORD(&bjtwin_txvideoram[offset]);
50 	int newword = COMBINE_WORD(oldword,data);
51 
52 	if (oldword != newword)
53 	{
54 		WRITE_WORD(&bjtwin_txvideoram[offset],newword);
55 		dirtybuffer[offset/2] = 1;
56 	}
57 }
58 
59 
WRITE_HANDLER(bjtwin_paletteram_w)60 WRITE_HANDLER( bjtwin_paletteram_w )
61 {
62 	int r,g,b;
63 	int oldword = READ_WORD(&paletteram[offset]);
64 	int newword = COMBINE_WORD(oldword,data);
65 
66 
67 	WRITE_WORD(&paletteram[offset],newword);
68 
69 	r = ((newword >> 11) & 0x1e) | ((newword >> 3) & 0x01);
70 	g = ((newword >>  7) & 0x1e) | ((newword >> 2) & 0x01);
71 	b = ((newword >>  3) & 0x1e) | ((newword >> 1) & 0x01);
72 
73 	r = (r << 3) | (r >> 2);
74 	g = (g << 3) | (g >> 2);
75 	b = (b << 3) | (b >> 2);
76 
77 	palette_change_color(offset / 2,r,g,b);
78 }
79 
80 
WRITE_HANDLER(bjtwin_flipscreen_w)81 WRITE_HANDLER( bjtwin_flipscreen_w )
82 {
83 	if ((data & 1) != flipscreen)
84 	{
85 		flipscreen = data & 1;
86 		memset(dirtybuffer, 1, bjtwin_txvideoram_size/2);
87 	}
88 }
89 
bjtwin_vh_screenrefresh(struct osd_bitmap * bitmap,int full_refresh)90 void bjtwin_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
91 {
92 	static int oldbgstart = -1;
93 	int offs, bgstart;
94 
95 	bgstart = 2048 * (READ_WORD(&bjtwin_videocontrol[0]) & 0x0f);
96 
97 	palette_init_used_colors();
98 
99 	for (offs = (bjtwin_txvideoram_size/2)-1; offs >= 0; offs--)
100 	{
101 		int color = (READ_WORD(&bjtwin_txvideoram[offs*2]) >> 12);
102 		memset(&palette_used_colors[16 * color],PALETTE_COLOR_USED,16);
103 	}
104 
105 	for (offs = 0; offs < 256*16; offs += 16)
106 	{
107 		if (READ_WORD(&bjtwin_spriteram[offs]) != 0)
108 			memset(&palette_used_colors[256 + 16*READ_WORD(&bjtwin_spriteram[offs+14])],PALETTE_COLOR_USED,16);
109 	}
110 
111 	if (palette_recalc() || (oldbgstart != bgstart))
112 	{
113 		oldbgstart = bgstart;
114 		memset(dirtybuffer, 1, bjtwin_txvideoram_size/2);
115 	}
116 
117 	for (offs = (bjtwin_txvideoram_size/2)-1; offs >= 0; offs--)
118 	{
119 		if (dirtybuffer[offs])
120 		{
121 			int sx = offs / 32;
122 			int sy = offs % 32;
123 
124 			int tilecode = READ_WORD(&bjtwin_txvideoram[offs*2]);
125 			int bank = (tilecode & 0x800) ? 1 : 0;
126 
127 			if (flipscreen)
128 			{
129 				sx = 47-sx;
130 				sy = 31-sy;
131 			}
132 
133 			drawgfx(tmpbitmap,Machine->gfx[bank],
134 					(tilecode & 0x7ff) + ((bank) ? bgstart : 0),
135 					tilecode >> 12,
136 					flipscreen, flipscreen,
137 					8*sx,8*sy,
138 					0,TRANSPARENCY_NONE,0);
139 
140 			dirtybuffer[offs] = 0;
141 		}
142 	}
143 
144 	/* copy the character mapped graphics */
145 	copybitmap(bitmap,tmpbitmap,0,0,0,0,&Machine->visible_area,TRANSPARENCY_NONE,0);
146 
147 	for (offs = 0; offs < 256*16; offs += 16)
148 	{
149 		if (READ_WORD(&bjtwin_spriteram[offs]) != 0)
150 		{
151 			int sx = (READ_WORD(&bjtwin_spriteram[offs+8]) & 0x1ff) + 64;
152 			int sy = (READ_WORD(&bjtwin_spriteram[offs+12]) & 0x1ff);
153 			int tilecode = READ_WORD(&bjtwin_spriteram[offs+6]);
154 			int xx = (READ_WORD(&bjtwin_spriteram[offs+2]) & 0x0f) + 1;
155 			int yy = (READ_WORD(&bjtwin_spriteram[offs+2]) >> 4) + 1;
156 			int width = xx;
157 			int delta = 16;
158 			int startx = sx;
159 
160 			if (flipscreen)
161 			{
162 				sx = 367 - sx;
163 				sy = 239 - sy;
164 				delta = -16;
165 				startx = sx;
166 			}
167 
168 			do
169 			{
170 				do
171 				{
172 					drawgfx(bitmap,Machine->gfx[2],
173 							tilecode & 0x1fff,
174 							READ_WORD(&bjtwin_spriteram[offs+14]),
175 							flipscreen, flipscreen,
176 							sx & 0x1ff,sy & 0x1ff,
177 							&Machine->visible_area,TRANSPARENCY_PEN,15);
178 
179 					tilecode++;
180 					sx += delta;
181 				} while (--xx);
182 
183 				sy += delta;
184 				sx = startx;
185 				xx = width;
186 			} while (--yy);
187 		}
188 	}
189 }
190