2 * Common source code project -> FM-7 -> Display -> Vram access
3 * (C) 2015 K.Ohta <whatisthis.sowhat _at_ gmail.com>
5 * Sep 27, 2015 : Split from display.cpp .
8 #include "fm7_display.h"
10 uint8 DISPLAY::read_vram_8_200l(uint32 addr, uint32 offset)
12 uint32 page_offset = 0;
14 #if defined(_FM77AV_VARIANTS)
15 if(active_page != 0) {
19 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
20 if(vram_active_block != 0) page_offset += 0x18000;
22 pagemod = addr & 0xc000;
23 return gvram[(((addr + offset) & 0x3fff) | pagemod) + page_offset];
26 uint8 DISPLAY::read_vram_l4_400l(uint32 addr, uint32 offset)
31 uint32 raddr = addr & 0x3fff;
32 if((multimode_accessmask & 0x04) == 0) {
33 return gvram[0x8000 + (raddr + offset) & 0x7fff];
37 pagemod = addr & 0x4000;
38 return gvram[((addr + offset) & mask) | pagemod];
39 } else if(addr < 0x9800) {
40 return textvram[addr & 0x0fff];
41 } else { // $9800-$bfff
42 return subrom_l4[addr - 0x9800];
48 uint8 DISPLAY::read_vram_8_400l(uint32 addr, uint32 offset)
50 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
51 uint32 color = vram_bank & 0x03;
53 uint32 page_offset = 0;
55 if(addr >= 0x8000) return 0xff;
56 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
57 if(vram_active_block != 0) page_offset += 0x18000;
59 if(color > 2) color = 0;
60 pagemod = 0x8000 * color;
61 return gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset];
66 uint8 DISPLAY::read_vram_8_400l_direct(uint32 addr, uint32 offset)
68 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
70 uint32 page_offset = 0;
71 pagemod = addr & 0x18000;
72 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
73 //addr = addr % 0x18000;
74 if(vram_active_block != 0) page_offset += 0x18000;
76 return gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset];
81 uint8 DISPLAY::read_vram_4096(uint32 addr, uint32 offset)
83 #if defined(_FM77AV_VARIANTS)
84 uint32 page_offset = 0;
86 if(active_page != 0) {
89 pagemod = addr & 0xe000;
90 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
91 if(vram_active_block != 0) page_offset += 0x18000;
93 return gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset];
98 uint8 DISPLAY::read_vram_256k(uint32 addr, uint32 offset)
100 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
103 page_offset = 0xc000 * (vram_bank & 0x03);
104 pagemod = addr & 0xe000;
105 return gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset];
111 void DISPLAY::write_vram_8_200l(uint32 addr, uint32 offset, uint32 data)
113 uint32 page_offset = 0;
115 uint8 val8 = data & 0xff;
116 #if defined(_FM77AV_VARIANTS)
117 if(active_page != 0) {
118 page_offset = 0xc000;
121 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
122 if(vram_active_block) page_offset += 0x18000;
124 pagemod = addr & 0xc000;
125 gvram[(((addr + offset) & 0x3fff) | pagemod) + page_offset] = val8;
126 # if defined(_FM77AV_VARIANTS)
127 if((config.dipswitch & FM7_DIPSW_SYNC_TO_HSYNC) == 0) vram_wrote = true;
133 void DISPLAY::write_vram_l4_400l(uint32 addr, uint32 offset, uint32 data)
138 uint32 raddr = addr & 0x3fff;
139 if((multimode_accessmask & 0x04) == 0) {
140 gvram[0x8000 + (raddr + offset) & 0x7fff] = (uint8)data;
144 pagemod = addr & 0x4000;
145 gvram[((addr + offset) & mask) | pagemod] = (uint8)data;
146 } else if(addr < 0x9800) {
147 textvram[addr & 0x0fff] = (uint8)data;
148 } else { // $9800-$bfff
149 //return subrom_l4[addr - 0x9800];
155 void DISPLAY::write_vram_8_400l(uint32 addr, uint32 offset, uint32 data)
157 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
158 uint32 color = vram_bank & 0x03;
160 uint32 page_offset = 0;
161 uint8 val8 = (uint8)(data & 0x00ff);
162 if(addr >= 0x8000) return;
163 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
164 if(vram_active_block != 0) page_offset += 0x18000;
166 if(color > 2) color = 0;
167 pagemod = 0x8000 * color;
168 //offset = (offset & 0x3fff) << 1;
169 gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset] = val8;
171 if((config.dipswitch & FM7_DIPSW_SYNC_TO_HSYNC) == 0) vram_wrote = true;
175 void DISPLAY::write_vram_8_400l_direct(uint32 addr, uint32 offset, uint32 data)
177 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
179 uint32 page_offset = 0;
180 uint8 val8 = (uint8)(data & 0x00ff);
181 //offset = offset & 0x7fff;
182 pagemod = addr & 0x18000;
183 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
184 //addr = addr % 0x18000;
185 if(vram_active_block != 0) page_offset += 0x18000;
187 gvram[(((addr + offset) & 0x7fff) | pagemod) + page_offset] = val8;
188 if((config.dipswitch & FM7_DIPSW_SYNC_TO_HSYNC) == 0) vram_wrote = true;
192 void DISPLAY::write_vram_4096(uint32 addr, uint32 offset, uint32 data)
194 #if defined(_FM77AV_VARIANTS)
195 uint32 page_offset = 0;
197 if(active_page != 0) {
198 page_offset = 0xc000;
200 pagemod = addr & 0xe000;
201 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
202 if(vram_active_block != 0) page_offset += 0x18000;
204 gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset] = (uint8)data;
205 if((config.dipswitch & FM7_DIPSW_SYNC_TO_HSYNC) == 0) vram_wrote = true;
209 void DISPLAY::write_vram_256k(uint32 addr, uint32 offset, uint32 data)
211 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
212 uint32 page_offset = 0;
214 page_offset = 0xc000 * (vram_bank & 0x03);
215 pagemod = addr & 0xe000;
216 gvram[(((addr + offset) & 0x1fff) | pagemod) + page_offset] = (uint8)(data & 0xff);
217 if((config.dipswitch & FM7_DIPSW_SYNC_TO_HSYNC) == 0) vram_wrote = true;
222 inline void DISPLAY::GETVRAM_8_200L(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
224 register uint8 b, r, g;
227 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
228 int dpage = vram_display_block;
230 #if defined(_FM77AV_VARIANTS)
231 if(display_page == 1) { // Is this dirty?
232 yoff_d = offset_point_bank1_bak;
234 yoff_d = offset_point_bak;
237 yoff_d = offset_point;
239 yoff_d = (yoff + yoff_d) & 0x3fff;
240 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
248 if(dpage != 0) yoff_d += 0x18000;
251 #if defined(_FM77AV_VARIANTS)
252 if(display_page == 1) {
253 if(mask & 0x01) b = gvram_shadow[yoff_d + 0x0c000];
254 if(mask & 0x02) r = gvram_shadow[yoff_d + 0x10000];
255 if(mask & 0x04) g = gvram_shadow[yoff_d + 0x14000];
257 if(mask & 0x01) b = gvram_shadow[yoff_d + 0x00000];
258 if(mask & 0x02) r = gvram_shadow[yoff_d + 0x04000];
259 if(mask & 0x04) g = gvram_shadow[yoff_d + 0x08000];
262 if(mask & 0x01) b = gvram[yoff_d + 0x00000];
263 if(mask & 0x02) r = gvram[yoff_d + 0x04000];
264 if(mask & 0x04) g = gvram[yoff_d + 0x08000];
266 dot = ((g & 0x80) >> 5) | ((r & 0x80) >> 6) | ((b & 0x80) >> 7);
267 p[0] = dpalette_pixel[dot];
268 dot = ((g & 0x40) >> 4) | ((r & 0x40) >> 5) | ((b & 0x40) >> 6);
269 p[1] = dpalette_pixel[dot];
270 dot = ((g & 0x20) >> 3) | ((r & 0x20) >> 4) | ((b & 0x20) >> 5);
271 p[2] = dpalette_pixel[dot];
272 dot = ((g & 0x10) >> 2) | ((r & 0x10) >> 3) | ((b & 0x10) >> 4);
273 p[3] = dpalette_pixel[dot];
275 dot = ((g & 0x8) >> 1) | ((r & 0x8) >> 2) | ((b & 0x8) >> 3);
276 p[4] = dpalette_pixel[dot];
277 dot = (g & 0x4) | ((r & 0x4) >> 1) | ((b & 0x4) >> 2);
278 p[5] = dpalette_pixel[dot];
279 dot = ((g & 0x2) << 1) | (r & 0x2) | ((b & 0x2) >> 1);
280 p[6] = dpalette_pixel[dot];
281 dot = ((g & 0x1) << 2) | ((r & 0x1) << 1) | (b & 0x1);
282 p[7] = dpalette_pixel[dot];
285 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
286 inline void DISPLAY::GETVRAM_8_400L(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
288 register uint8 b, r, g;
291 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
292 int dpage = vram_display_block;
295 if(display_page == 1) { // Is this dirty?
296 yoff_d = offset_point_bank1_bak;
298 yoff_d = offset_point_bak;
300 yoff_d = (yoff + (yoff_d << 1)) & 0x7fff;
301 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
309 if(dpage != 0) yoff_d += 0x18000;
312 if(mask & 0x01) b = gvram_shadow[yoff_d + 0x00000];
313 if(mask & 0x02) r = gvram_shadow[yoff_d + 0x08000];
314 if(mask & 0x04) g = gvram_shadow[yoff_d + 0x10000];
316 dot = ((g & 0x80) >> 5) | ((r & 0x80) >> 6) | ((b & 0x80) >> 7);
317 p[0] = dpalette_pixel[dot];
318 dot = ((g & 0x40) >> 4) | ((r & 0x40) >> 5) | ((b & 0x40) >> 6);
319 p[1] = dpalette_pixel[dot];
320 dot = ((g & 0x20) >> 3) | ((r & 0x20) >> 4) | ((b & 0x20) >> 5);
321 p[2] = dpalette_pixel[dot];
322 dot = ((g & 0x10) >> 2) | ((r & 0x10) >> 3) | ((b & 0x10) >> 4);
323 p[3] = dpalette_pixel[dot];
325 dot = ((g & 0x8) >> 1) | ((r & 0x8) >> 2) | ((b & 0x8) >> 3);
326 p[4] = dpalette_pixel[dot];
327 dot = (g & 0x4) | ((r & 0x4) >> 1) | ((b & 0x4) >> 2);
328 p[5] = dpalette_pixel[dot];
329 dot = ((g & 0x2) << 1) | (r & 0x2) | ((b & 0x2) >> 1);
330 p[6] = dpalette_pixel[dot];
331 dot = ((g & 0x1) << 2) | ((r & 0x1) << 1) | (b & 0x1);
332 p[7] = dpalette_pixel[dot];
335 inline void DISPLAY::GETVRAM_256k(int yoff, scrntype *p, uint32 mask)
337 register uint32 b3, r3, g3;
338 register uint32 b4, r4, g4;
339 register uint32 btmp, rtmp, gtmp;
341 register scrntype b, r, g;
343 uint32 yoff_d1, yoff_d2;
352 yoff_d1 = offset_point_bak;
353 yoff_d2 = offset_point_bank1_bak;
354 yoff_d1 = (yoff + yoff_d1) & 0x1fff;
355 yoff_d2 = (yoff + yoff_d2) & 0x1fff;
357 b3 = gvram_shadow[yoff_d1] << 24;
358 b3 |= gvram_shadow[yoff_d1 + 0x02000] << 16;
360 b3 |= gvram_shadow[yoff_d2 + 0x0c000] << 8;
361 b3 |= gvram_shadow[yoff_d2 + 0x0e000] << 0;
363 b4 = gvram_shadow[yoff_d1 + 0x18000] << 8;
364 b4 |= gvram_shadow[yoff_d1 + 0x1a000] << 0;
367 r3 = gvram_shadow[yoff_d1 + 0x04000] << 24;
368 r3 |= gvram_shadow[yoff_d1 + 0x06000] << 16;
369 r3 |= gvram_shadow[yoff_d2 + 0x10000] << 8;
370 r3 |= gvram_shadow[yoff_d2 + 0x12000] << 0;
371 r4 = gvram_shadow[yoff_d1 + 0x1c000] << 8;
372 r4 |= gvram_shadow[yoff_d1 + 0x1e000] << 0;
376 g3 = gvram_shadow[yoff_d1 + 0x08000] << 24;
377 g3 |= gvram_shadow[yoff_d1 + 0x0a000] << 16;
378 g3 |= gvram_shadow[yoff_d2 + 0x14000] << 8;
379 g3 |= gvram_shadow[yoff_d2 + 0x16000] << 0;
381 g4 = gvram_shadow[yoff_d1 + 0x20000] << 8;
382 g4 |= gvram_shadow[yoff_d1 + 0x22000] << 0;
386 for(_shift = 7; _shift >= 0; _shift--) {
387 _bit = 0x01010101 << _shift;
390 btmp = (b3 & _bit) >> _shift;
391 b = (((btmp & (0x01 << 24)) != 0) ? 0x80 : 0) | (((btmp & (0x01 << 16)) != 0)? 0x40 : 0)
392 | (((btmp & (0x01 << 8)) != 0) ? 0x20 : 0) | (((btmp & 0x01) != 0) ? 0x10 : 0);
393 btmp = (b4 & _bit) >> _shift;
394 b = b | (((btmp & (0x01 << 8)) != 0) ? 0x08 : 0) | (((btmp & 0x01) != 0) ? 0x04 : 0);
397 rtmp = (r3 & _bit) >> _shift;
398 r = ((rtmp & (0x01 << 24)) ? 0x80 : 0) | ((rtmp & (0x01 << 16)) ? 0x40 : 0)
399 | ((rtmp & (0x01 << 8)) ? 0x20 : 0) | ((rtmp & 0x01) ? 0x10 : 0);
400 rtmp = (r4 & _bit) >> _shift;
401 r = r | ((rtmp & (0x01 << 8)) ? 0x08 : 0) | ((rtmp & 0x01) ? 0x04 : 0);
404 gtmp = (g3 & _bit) >> _shift;
405 g = ((gtmp & (0x01 << 24)) ? 0x80 : 0) | ((gtmp & (0x01 << 16)) ? 0x40 : 0)
406 | ((gtmp & (0x01 << 8)) ? 0x20 : 0) | ((gtmp & 0x01) ? 0x10 : 0);
407 gtmp = (g4 & _bit) >> _shift;
408 g = g | ((gtmp & (0x01 << 8)) ? 0x08 : 0) | ((gtmp & 0x01) ? 0x04 : 0);
411 pixel = RGB_COLOR(r, g, b);
420 #if defined(_FM77AV_VARIANTS)
421 inline void DISPLAY::GETVRAM_4096(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
427 uint32 yoff_d1, yoff_d2;
428 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
429 int dpage = vram_display_block;
432 yoff_d1 = offset_point_bak;
433 yoff_d2 = offset_point_bank1_bak;
434 yoff_d1 = (yoff + yoff_d1) & 0x1fff;
435 yoff_d2 = (yoff + yoff_d2) & 0x1fff;
436 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
450 b3 = gvram_shadow[yoff_d1] << 24;
451 b3 |= gvram_shadow[yoff_d1 + 0x02000] << 16;
452 r3 = gvram_shadow[yoff_d1 + 0x04000] << 24;
453 r3 |= gvram_shadow[yoff_d1 + 0x06000] << 16;
455 g3 = gvram_shadow[yoff_d1 + 0x08000] << 24;
456 g3 |= gvram_shadow[yoff_d1 + 0x0a000] << 16;
458 b3 |= gvram_shadow[yoff_d2 + 0x0c000] << 8;
459 b3 |= gvram_shadow[yoff_d2 + 0x0e000] << 0;
461 r3 |= gvram_shadow[yoff_d2 + 0x10000] << 8;
462 r3 |= gvram_shadow[yoff_d2 + 0x12000] << 0;
463 g3 |= gvram_shadow[yoff_d2 + 0x14000] << 8;
464 g3 |= gvram_shadow[yoff_d2 + 0x16000] << 0;
466 g = ((g3 & (0x80 << 24)) >> 20) | ((g3 & (0x80 << 16)) >> 13) | ((g3 & (0x80 << 8)) >> 6) | ((g3 & 0x80) << 1);
467 r = ((r3 & (0x80 << 24)) >> 24) | ((r3 & (0x80 << 16)) >> 17) | ((r3 & (0x80 << 8)) >> 10) | ((r3 & 0x80) >> 3);
468 b = ((b3 & (0x80 << 24)) >> 28) | ((b3 & (0x80 << 16)) >> 21) | ((b3 & (0x80 << 8)) >> 14) | ((b3 & 0x80) >> 7);
470 idx = (g | b | r ) & mask;
471 pixel = analog_palette_pixel[idx];
475 g = ((g3 & (0x40 << 24)) >> 19) | ((g3 & (0x40 << 16)) >> 12) | ((g3 & (0x40 << 8)) >> 5) | ((g3 & 0x40) << 2);
476 r = ((r3 & (0x40 << 24)) >> 23) | ((r3 & (0x40 << 16)) >> 16) | ((r3 & (0x40 << 8)) >> 9) | ((r3 & 0x40) >> 2);
477 b = ((b3 & (0x40 << 24)) >> 27) | ((b3 & (0x40 << 16)) >> 20) | ((b3 & (0x40 << 8)) >> 13) | ((b3 & 0x40) >> 6);
479 //g = ((g3 & (0x40 << 24)) ? 0x800 : 0) | ((g3 & (0x40 << 16)) ? 0x400 : 0) | ((g3 & (0x40 << 8)) ? 0x200 : 0) | ((g3 & 0x40) ? 0x100 : 0);
480 //r = ((r3 & (0x40 << 24)) ? 0x80 : 0) | ((r3 & (0x40 << 16)) ? 0x40 : 0) | ((r3 & (0x40 << 8)) ? 0x20 : 0) | ((r3 & 0x40) ? 0x10 : 0);
481 //b = ((b3 & (0x40 << 24)) ? 0x8 : 0) | ((b3 & (0x40 << 16)) ? 0x4 : 0) | ((b3 & (0x40 << 8)) ? 0x2 : 0) | ((b3 & 0x40) ? 0x1 : 0);
483 idx = (g | b | r ) & mask;
484 pixel = analog_palette_pixel[idx];
488 // g = ((g3 & (0x20 << 24)) ? 0x800 : 0) | ((g3 & (0x20 << 16)) ? 0x400 : 0) | ((g3 & (0x20 << 8)) ? 0x200 : 0) | ((g3 & 0x20) ? 0x100 : 0);
489 // r = ((r3 & (0x20 << 24)) ? 0x80 : 0) | ((r3 & (0x20 << 16)) ? 0x40 : 0) | ((r3 & (0x20 << 8)) ? 0x20 : 0) | ((r3 & 0x20) ? 0x10 : 0);
490 // b = ((b3 & (0x20 << 24)) ? 0x8 : 0) | ((b3 & (0x20 << 16)) ? 0x4 : 0) | ((b3 & (0x20 << 8)) ? 0x2 : 0) | ((b3 & 0x20) ? 0x1 : 0);
491 g = ((g3 & (0x20 << 24)) >> 18) | ((g3 & (0x20 << 16)) >> 11) | ((g3 & (0x20 << 8)) >> 4) | ((g3 & 0x20) << 3);
492 r = ((r3 & (0x20 << 24)) >> 22) | ((r3 & (0x20 << 16)) >> 15) | ((r3 & (0x20 << 8)) >> 8) | ((r3 & 0x20) >> 1);
493 b = ((b3 & (0x20 << 24)) >> 26) | ((b3 & (0x20 << 16)) >> 19) | ((b3 & (0x20 << 8)) >> 12) | ((b3 & 0x20) >> 5);
495 idx = (g | b | r ) & mask;
496 pixel = analog_palette_pixel[idx];
500 //g = ((g3 & (0x10 << 24)) ? 0x800 : 0) | ((g3 & (0x10 << 16)) ? 0x400 : 0) | ((g3 & (0x10 << 8)) ? 0x200 : 0) | ((g3 & 0x10) ? 0x100 : 0);
501 //r = ((r3 & (0x10 << 24)) ? 0x80 : 0) | ((r3 & (0x10 << 16)) ? 0x40 : 0) | ((r3 & (0x10 << 8)) ? 0x20 : 0) | ((r3 & 0x10) ? 0x10 : 0);
502 //b = ((b3 & (0x10 << 24)) ? 0x8 : 0) | ((b3 & (0x10 << 16)) ? 0x4 : 0) | ((b3 & (0x10 << 8)) ? 0x2 : 0) | ((b3 & 0x10) ? 0x1 : 0);
503 g = ((g3 & (0x10 << 24)) >> 17) | ((g3 & (0x10 << 16)) >> 10) | ((g3 & (0x10 << 8)) >> 3) | ((g3 & 0x10) << 4);
504 r = ((r3 & (0x10 << 24)) >> 21) | ((r3 & (0x10 << 16)) >> 14) | ((r3 & (0x10 << 8)) >> 7) | ((r3 & 0x10) >> 0);
505 b = ((b3 & (0x10 << 24)) >> 25) | ((b3 & (0x10 << 16)) >> 18) | ((b3 & (0x10 << 8)) >> 11) | ((b3 & 0x10) >> 4);
507 idx = (g | b | r ) & mask;
508 pixel = analog_palette_pixel[idx];
513 //g = ((g3 & (0x8 << 24)) ? 0x800 : 0) | ((g3 & (0x8 << 16)) ? 0x400 : 0) | ((g3 & (0x8 << 8)) ? 0x200 : 0) | ((g3 & 0x8) ? 0x100 : 0);
514 //r = ((r3 & (0x8 << 24)) ? 0x80 : 0) | ((r3 & (0x8 << 16)) ? 0x40 : 0) | ((r3 & (0x8 << 8)) ? 0x20 : 0) | ((r3 & 0x8) ? 0x10 : 0);
515 //b = ((b3 & (0x8 << 24)) ? 0x8 : 0) | ((b3 & (0x8 << 16)) ? 0x4 : 0) | ((b3 & (0x8 << 8)) ? 0x2 : 0) | ((b3 & 0x8) ? 0x1 : 0);
516 g = ((g3 & (0x8 << 24)) >> 16) | ((g3 & (0x8 << 16)) >> 9) | ((g3 & (0x8 << 8)) >> 2) | ((g3 & 0x8) << 5);
517 r = ((r3 & (0x8 << 24)) >> 20) | ((r3 & (0x8 << 16)) >> 13) | ((r3 & (0x8 << 8)) >> 6) | ((r3 & 0x8) << 1);
518 b = ((b3 & (0x8 << 24)) >> 24) | ((b3 & (0x8 << 16)) >> 17) | ((b3 & (0x8 << 8)) >> 10) | ((b3 & 0x8) >> 3);
520 idx = (g | b | r ) & mask;
521 pixel = analog_palette_pixel[idx];
526 //g = ((g3 & (0x4 << 24)) ? 0x800 : 0) | ((g3 & (0x4 << 16)) ? 0x400 : 0) | ((g3 & (0x4 << 8)) ? 0x200 : 0) | ((g3 & 0x4) ? 0x100 : 0);
527 //r = ((r3 & (0x4 << 24)) ? 0x80 : 0) | ((r3 & (0x4 << 16)) ? 0x40 : 0) | ((r3 & (0x4 << 8)) ? 0x20 : 0) | ((r3 & 0x4) ? 0x10 : 0);
528 //b = ((b3 & (0x4 << 24)) ? 0x8 : 0) | ((b3 & (0x4 << 16)) ? 0x4 : 0) | ((b3 & (0x4 << 8)) ? 0x2 : 0) | ((b3 & 0x4) ? 0x1 : 0);
529 g = ((g3 & (0x4 << 24)) >> 15) | ((g3 & (0x4 << 16)) >> 8) | ((g3 & (0x4 << 8)) >> 1) | ((g3 & 0x4) << 6);
530 r = ((r3 & (0x4 << 24)) >> 19) | ((r3 & (0x4 << 16)) >> 12) | ((r3 & (0x4 << 8)) >> 5) | ((r3 & 0x4) << 2);
531 b = ((b3 & (0x4 << 24)) >> 23) | ((b3 & (0x4 << 16)) >> 16) | ((b3 & (0x4 << 8)) >> 9) | ((b3 & 0x4) >> 2);
533 idx = (g | b | r ) & mask;
534 pixel = analog_palette_pixel[idx];
538 //g = ((g3 & (0x2 << 24)) ? 0x800 : 0) | ((g3 & (0x2 << 16)) ? 0x400 : 0) | ((g3 & (0x2 << 8)) ? 0x200 : 0) | ((g3 & 0x2) ? 0x100 : 0);
539 //r = ((r3 & (0x2 << 24)) ? 0x80 : 0) | ((r3 & (0x2 << 16)) ? 0x40 : 0) | ((r3 & (0x2 << 8)) ? 0x20 : 0) | ((r3 & 0x2) ? 0x10 : 0);
540 //b = ((b3 & (0x2 << 24)) ? 0x8 : 0) | ((b3 & (0x2 << 16)) ? 0x4 : 0) | ((b3 & (0x2 << 8)) ? 0x2 : 0) | ((b3 & 0x2) ? 0x1 : 0);
541 g = ((g3 & (0x2 << 24)) >> 14) | ((g3 & (0x2 << 16)) >> 7) | ((g3 & (0x2 << 8)) >> 0) | ((g3 & 0x2) << 7);
542 r = ((r3 & (0x2 << 24)) >> 18) | ((r3 & (0x2 << 16)) >> 11) | ((r3 & (0x2 << 8)) >> 4) | ((r3 & 0x2) << 3);
543 b = ((b3 & (0x2 << 24)) >> 22) | ((b3 & (0x2 << 16)) >> 15) | ((b3 & (0x2 << 8)) >> 8) | ((b3 & 0x2) >> 1);
545 idx = (g | b | r ) & mask;
546 pixel = analog_palette_pixel[idx];
550 //g = ((g3 & (0x1 << 24)) ? 0x800 : 0) | ((g3 & (0x1 << 16)) ? 0x400 : 0) | ((g3 & (0x1 << 8)) ? 0x200 : 0) | ((g3 & 0x1) ? 0x100 : 0);
551 //r = ((r3 & (0x1 << 24)) ? 0x80 : 0) | ((r3 & (0x1 << 16)) ? 0x40 : 0) | ((r3 & (0x1 << 8)) ? 0x20 : 0) | ((r3 & 0x1) ? 0x10 : 0);
552 //b = ((b3 & (0x1 << 24)) ? 0x8 : 0) | ((b3 & (0x1 << 16)) ? 0x4 : 0) | ((b3 & (0x1 << 8)) ? 0x2 : 0) | ((b3 & 0x1) ? 0x1 : 0);
553 g = ((g3 & (0x1 << 24)) >> 13) | ((g3 & (0x1 << 16)) >> 6) | ((g3 & (0x1 << 8)) << 1) | ((g3 & 0x1) << 8);
554 r = ((r3 & (0x1 << 24)) >> 17) | ((r3 & (0x1 << 16)) >> 10) | ((r3 & (0x1 << 8)) >> 3) | ((r3 & 0x1) << 4);
555 b = ((b3 & (0x1 << 24)) >> 21) | ((b3 & (0x1 << 16)) >> 14) | ((b3 & (0x1 << 8)) >> 7) | ((b3 & 0x1) >> 0);
557 idx = (g | b | r ) & mask;
558 pixel = analog_palette_pixel[idx];
564 void DISPLAY::draw_screen()
570 register uint32 rgbmask;
571 uint16 wx_begin, wx_end, wy_low, wy_high;
572 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
574 wx_begin = window_xbegin;
575 wx_end = window_xend;
577 wy_high = window_high;
578 bool _flag = window_opened;
579 if((wx_begin < wx_end) && (wy_low < wy_high)) {
580 window_opened = true;
582 window_opened = false;
584 if(_flag != window_opened) vram_wrote_shadow = true;
588 #if defined(_FM77AV_VARIANTS)
590 int factor = (config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28;
591 if(frame_skip_count <= factor) return;
592 frame_skip_count = 0;
596 int factor = (config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28;
597 if((frame_skip_count <= factor) || !(vram_wrote)) return;
599 frame_skip_count = 0;
604 for(y = 0; y < 400; y++) {
605 memset(emu->screen_buffer(y), 0x00, 640 * sizeof(scrntype));
609 # if defined(_FM77AV_VARIANTS)
610 if(!vram_wrote_shadow) return;
612 if(display_mode == DISPLAY_MODE_8_200L) {
614 rgbmask = ~multimode_dispmask;
615 for(y = 0; y < 400; y += 2) {
616 p = emu->screen_buffer(y);
619 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
620 if(window_opened && (wy_low <= y) && (wy_high > y)) {
621 for(x = 0; x < 80; x++) {
622 if((x >= wx_begin) && (x < wx_end)) {
623 GETVRAM_8_200L(yoff, p, rgbmask, true);
625 GETVRAM_8_200L(yoff, p, rgbmask, false);
633 for(x = 0; x < 10; x++) {
634 GETVRAM_8_200L(yoff + 0, p, rgbmask, false);
637 GETVRAM_8_200L(yoff + 1, p, rgbmask, false);
640 GETVRAM_8_200L(yoff + 2, p, rgbmask, false);
643 GETVRAM_8_200L(yoff + 3, p, rgbmask, false);
646 GETVRAM_8_200L(yoff + 4, p, rgbmask, false);
649 GETVRAM_8_200L(yoff + 5, p, rgbmask, false);
652 GETVRAM_8_200L(yoff + 6, p, rgbmask, false);
655 GETVRAM_8_200L(yoff + 7, p, rgbmask, false);
660 if(config.scan_line == 0) {
661 memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
663 memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
666 # if defined(_FM77AV_VARIANTS)
667 vram_wrote_shadow = false;
671 # if defined(_FM77AV_VARIANTS)
672 if(display_mode == DISPLAY_MODE_4096) {
675 rgbmask = multimode_dispmask;
676 if((rgbmask & 0x01) == 0) mask = 0x00f;
677 if((rgbmask & 0x02) == 0) mask = mask | 0x0f0;
678 if((rgbmask & 0x04) == 0) mask = mask | 0xf00;
679 for(y = 0; y < 400; y += 2) {
680 p = emu->screen_buffer(y);
683 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
684 if(window_opened && (wy_low <= y) && (wy_high > y)) {
685 for(x = 0; x < 40; x++) {
686 if((x >= wx_begin) && (x < wx_end)) {
687 GETVRAM_4096(yoff, p, mask, true);
689 GETVRAM_4096(yoff, p, mask, false);
697 for(x = 0; x < 5; x++) {
698 GETVRAM_4096(yoff + 0, p, mask);
701 GETVRAM_4096(yoff + 1, p, mask);
704 GETVRAM_4096(yoff + 2, p, mask);
707 GETVRAM_4096(yoff + 3, p, mask);
710 GETVRAM_4096(yoff + 4, p, mask);
713 GETVRAM_4096(yoff + 5, p, mask);
716 GETVRAM_4096(yoff + 6, p, mask);
719 GETVRAM_4096(yoff + 7, p, mask);
724 if(config.scan_line == 0) {
725 memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
727 memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
730 # if defined(_FM77AV_VARIANTS)
731 vram_wrote_shadow = false;
735 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
736 else if(display_mode == DISPLAY_MODE_8_400L) {
738 rgbmask = ~multimode_dispmask;
739 for(y = 0; y < 400; y++) {
740 p = emu->screen_buffer(y);
743 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
744 if(window_opened && (wy_low <= y) && (wy_high > y)) {
745 for(x = 0; x < 80; x++) {
746 if((x >= wx_begin) && (x < wx_end)) {
747 GETVRAM_8_400L(yoff, p, rgbmask, true);
749 GETVRAM_8_400L(yoff, p, rgbmask, false);
756 for(x = 0; x < 10; x++) {
757 GETVRAM_8_400L(yoff + 0, p, rgbmask);
760 GETVRAM_8_400L(yoff + 1, p, rgbmask);
763 GETVRAM_8_400L(yoff + 2, p, rgbmask);
766 GETVRAM_8_400L(yoff + 3, p, rgbmask);
769 GETVRAM_8_400L(yoff + 4, p, rgbmask);
772 GETVRAM_8_400L(yoff + 5, p, rgbmask);
775 GETVRAM_8_400L(yoff + 6, p, rgbmask);
778 GETVRAM_8_400L(yoff + 7, p, rgbmask);
783 # if defined(_FM77AV_VARIANTS)
784 vram_wrote_shadow = false;
787 } else if(display_mode == DISPLAY_MODE_256k) {
788 rgbmask = ~multimode_dispmask;
789 for(y = 0; y < 400; y += 2) {
790 # if defined(_FM77AV_VARIANTS)
791 //if(!vram_wrote_shadow && !vram_draw_table[y >> 1]) continue;
792 vram_draw_table[y >> 1] = false;
794 p = emu->screen_buffer(y);
798 for(x = 0; x < 5; x++) {
799 GETVRAM_256k(yoff + 0, p, rgbmask);
802 GETVRAM_256k(yoff + 1, p, rgbmask);
805 GETVRAM_256k(yoff + 2, p, rgbmask);
808 GETVRAM_256k(yoff + 3, p, rgbmask);
811 GETVRAM_256k(yoff + 4, p, rgbmask);
814 GETVRAM_256k(yoff + 5, p, rgbmask);
817 GETVRAM_256k(yoff + 6, p, rgbmask);
820 GETVRAM_256k(yoff + 7, p, rgbmask);
825 if(config.scan_line == 0) {
826 memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
828 memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
831 # if defined(_FM77AV_VARIANTS)
832 vram_wrote_shadow = false;
837 # endif //_FM77AV_VARIANTS