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