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 .
10 #include "fm7_display.h"
12 uint8_t DISPLAY::read_vram_l4_400l(uint32_t addr, uint32_t offset)
17 uint32_t raddr = addr & 0x3fff;
18 if((multimode_accessmask & 0x04) == 0) {
19 return gvram[0x8000 + (raddr + offset) & 0x7fff];
23 pagemod = addr & 0x4000;
24 return gvram[((addr + offset) & mask) | pagemod];
25 } else if(addr < 0x9800) {
26 return textvram[addr & 0x0fff];
27 } else { // $9800-$bfff
28 return subrom_l4[addr - 0x9800];
34 void DISPLAY::write_vram_l4_400l(uint32_t addr, uint32_t offset, uint32_t data)
39 uint32_t raddr = addr & 0x3fff;
40 if((multimode_accessmask & 0x04) == 0) {
41 gvram[0x8000 + (raddr + offset) & 0x7fff] = (uint8_t)data;
45 pagemod = addr & 0x4000;
46 gvram[((addr + offset) & mask) | pagemod] = (uint8_t)data;
47 } else if(addr < 0x9800) {
48 textvram[addr & 0x0fff] = (uint8_t)data;
49 } else { // $9800-$bfff
50 //return subrom_l4[addr - 0x9800];
56 void DISPLAY::GETVRAM_8_200L(int yoff, scrntype_t *p,
58 bool window_inv = false,
59 bool scan_line = false)
63 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
64 int dpage = vram_display_block;
68 yoff_d = (yoff + yoff_d) & 0x3fff;
70 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
78 if(dpage != 0) yoff_d += 0x18000;
81 #if defined(_FM77AV_VARIANTS)
82 if(display_page_bak == 1) yoff_d += 0xc000;
84 if(!multimode_dispflags[0]) b = gvram_shadow[yoff_d + 0x00000];
85 if(!multimode_dispflags[1]) r = gvram_shadow[yoff_d + 0x04000];
86 if(!multimode_dispflags[2]) g = gvram_shadow[yoff_d + 0x08000];
88 uint16_t *pg = &(bit_trans_table_0[g][0]);
89 uint16_t *pr = &(bit_trans_table_1[r][0]);
90 uint16_t *pb = &(bit_trans_table_2[b][0]);
94 for(int i = 0; i < 8; i++) {
95 tmp_d[i] = pg[i] | pr[i] | pb[i];
97 for(int i = 0; i < 8; i++) {
98 tmp_d[i] = tmp_d[i] >> 5;
100 for(int i = 0; i < 8; i++) {
101 tmp_dd[i] = dpalette_pixel[tmp_d[i]];
103 for(int i = 0; i < 8; i++) {
106 #if defined(FIXED_FRAMEBUFFER_SIZE)
109 static const scrntype_t dblack[8] = {0, 0, 0, 0, 0, 0, 0, 0};
110 for(int i = 0; i < 8; i++) {
113 #else /* Fancy scanline */
114 static const scrntype_t dblack[8] = { RGB_COLOR(32, 32, 32),
115 RGB_COLOR(32, 32, 32),
116 RGB_COLOR(32, 32, 32),
117 RGB_COLOR(32, 32, 32),
118 RGB_COLOR(32, 32, 32),
119 RGB_COLOR(32, 32, 32),
120 RGB_COLOR(32, 32, 32),
121 RGB_COLOR(32, 32, 32)};
123 for(int i = 0; i < 8; i++) {
124 #if defined(_RGB888) || defined(_RGBA888)
125 tmp_dd[i] = tmp_dd[i] >> 3;
126 #elif defined(_RGB555)
127 tmp_dd[i] = tmp_dd[i] >> 2;
128 #elif defined(_RGB565)
129 tmp_dd[i] = tmp_dd[i] >> 2;
132 for(int i = 0; i < 8; i++) {
133 tmp_dd[i] = tmp_dd[i] & RGBA_COLOR(31, 31, 31, 255);
135 for(int i = 0; i < 8; i++) {
140 for(int i = 0; i < 8; i++) {
147 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
148 void DISPLAY::GETVRAM_8_400L(int yoff, scrntype_t *p,
149 bool window_inv = false)
154 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
155 int dpage = vram_display_block;
157 if(p == NULL) return;
159 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
167 if(dpage != 0) yoff_d += 0x18000;
170 if(!multimode_dispflags[0]) b = gvram_shadow[yoff_d + 0x00000];
171 if(!multimode_dispflags[1]) r = gvram_shadow[yoff_d + 0x08000];
172 if(!multimode_dispflags[2]) g = gvram_shadow[yoff_d + 0x10000];
174 uint16_t *pg = &(bit_trans_table_0[g][0]);
175 uint16_t *pr = &(bit_trans_table_1[r][0]);
176 uint16_t *pb = &(bit_trans_table_2[b][0]);
178 scrntype_t tmp_dd[8];
180 for(int i = 0; i < 8; i++) {
181 tmp_d[i] = pg[i] | pr[i] | pb[i];
183 for(int i = 0; i < 8; i++) {
184 tmp_d[i] = tmp_d[i] >> 5;
186 for(int i = 0; i < 8; i++) {
187 tmp_dd[i] = dpalette_pixel[tmp_d[i]];
189 for(int i = 0; i < 8; i++) {
194 void DISPLAY::GETVRAM_256k(int yoff, scrntype_t *p, scrntype_t *px, bool scan_line = false)
198 uint32_t btmp, rtmp, gtmp;
207 if(p == NULL) return;
216 uint8_t bb[8], rr[8], gg[8];
217 uint16_t *p0, *p1, *p2, *p3, *p4, *p5;
218 uint32_t _btmp[8], _rtmp[8], _gtmp[8];
219 #if !defined(FIXED_FRAMEBUFFER_SIZE)
220 scrntype_t tmp_dd[8];
222 scrntype_t tmp_dd[16];
225 if(!multimode_dispflags[0]) {
227 bb[0] = gvram_shadow[yoff_d1];
228 bb[1] = gvram_shadow[yoff_d1 + 0x02000];
230 bb[2] = gvram_shadow[yoff_d2 + 0x0c000];
231 bb[3] = gvram_shadow[yoff_d2 + 0x0e000];
233 bb[4] = gvram_shadow[yoff_d1 + 0x18000];
234 bb[5] = gvram_shadow[yoff_d1 + 0x1a000];
236 p0 = &(bit_trans_table_0[bb[0]][0]);
237 p1 = &(bit_trans_table_1[bb[1]][0]);
238 p2 = &(bit_trans_table_2[bb[2]][0]);
239 p3 = &(bit_trans_table_3[bb[3]][0]);
240 p4 = &(bit_trans_table_4[bb[4]][0]);
241 p5 = &(bit_trans_table_5[bb[5]][0]);
242 for(int i = 0; i < 8; i++) {
243 _btmp[i] = p0[i] | p1[i] | p2[i] | p3[i] | p4[i] | p5[i];
246 for(int i = 0; i < 8; i++) {
250 if(!multimode_dispflags[1]) {
253 rr[0] = gvram_shadow[yoff_d1 + 0x04000];
254 rr[1] = gvram_shadow[yoff_d1 + 0x06000];
256 rr[2] = gvram_shadow[yoff_d2 + 0x10000];
257 rr[3] = gvram_shadow[yoff_d2 + 0x12000];
259 rr[4] = gvram_shadow[yoff_d1 + 0x1c000];
260 rr[5] = gvram_shadow[yoff_d1 + 0x1e000];
262 p0 = &(bit_trans_table_0[rr[0]][0]);
263 p1 = &(bit_trans_table_1[rr[1]][0]);
264 p2 = &(bit_trans_table_2[rr[2]][0]);
265 p3 = &(bit_trans_table_3[rr[3]][0]);
266 p4 = &(bit_trans_table_4[rr[4]][0]);
267 p5 = &(bit_trans_table_5[rr[5]][0]);
268 for(int i = 0; i < 8; i++) {
269 _rtmp[i] = p0[i] | p1[i] | p2[i] | p3[i] | p4[i] | p5[i];
272 for(int i = 0; i < 8; i++) {
276 if(!multimode_dispflags[2]) {
279 gg[0] = gvram_shadow[yoff_d1 + 0x08000];
280 gg[1] = gvram_shadow[yoff_d1 + 0x0a000];
282 gg[2] = gvram_shadow[yoff_d2 + 0x14000];
283 gg[3] = gvram_shadow[yoff_d2 + 0x16000];
285 gg[4] = gvram_shadow[yoff_d1 + 0x20000];
286 gg[5] = gvram_shadow[yoff_d1 + 0x22000];
288 p0 = &(bit_trans_table_0[gg[0]][0]);
289 p1 = &(bit_trans_table_1[gg[1]][0]);
290 p2 = &(bit_trans_table_2[gg[2]][0]);
291 p3 = &(bit_trans_table_3[gg[3]][0]);
292 p4 = &(bit_trans_table_4[gg[4]][0]);
293 p5 = &(bit_trans_table_5[gg[5]][0]);
294 for(int i = 0; i < 8; i++) {
295 _gtmp[i] = p0[i] | p1[i] | p2[i] | p3[i] | p4[i] | p5[i];
298 for(int i = 0; i < 8; i++) {
302 #if !defined(FIXED_FRAMEBUFFER_SIZE)
303 for(int i = 0; i < 8; i++) {
304 tmp_dd[i] = RGB_COLOR(_rtmp[i], _gtmp[i], _btmp[i]);
306 for(int i = 0; i < 8; i++) {
310 for(int i = 0; i < 8; i++) {
311 tmp_dd[i * 2] = tmp_dd[i * 2 + 1] = RGB_COLOR(_rtmp[i], _gtmp[i], _btmp[i]);
313 for(int i = 0; i < 16; i++) {
318 static const scrntype_t dblack[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
319 for(int i = 0; i < 16; i++) {
322 #else /* Fancy scanline */
323 static const scrntype_t dblack[16] = { RGB_COLOR(32, 32, 32),
324 RGB_COLOR(32, 32, 32),
325 RGB_COLOR(32, 32, 32),
326 RGB_COLOR(32, 32, 32),
327 RGB_COLOR(32, 32, 32),
328 RGB_COLOR(32, 32, 32),
329 RGB_COLOR(32, 32, 32),
330 RGB_COLOR(32, 32, 32),
331 RGB_COLOR(32, 32, 32),
332 RGB_COLOR(32, 32, 32),
333 RGB_COLOR(32, 32, 32),
334 RGB_COLOR(32, 32, 32),
335 RGB_COLOR(32, 32, 32),
336 RGB_COLOR(32, 32, 32),
337 RGB_COLOR(32, 32, 32),
338 RGB_COLOR(32, 32, 32)};
340 for(int i = 0; i < 16; i++) {
341 #if defined(_RGB888) || defined(_RGBA888)
342 tmp_dd[i] = tmp_dd[i] >> 3;
343 #elif defined(_RGB555)
344 tmp_dd[i] = tmp_dd[i] >> 2;
345 #elif defined(_RGB565)
346 tmp_dd[i] = tmp_dd[i] >> 2;
349 for(int i = 0; i < 16; i++) {
350 tmp_dd[i] = tmp_dd[i] & RGBA_COLOR(31, 31, 31, 256);
352 for(int i = 0; i < 16; i++) {
357 for(int i = 0; i < 16; i++) {
365 #if defined(_FM77AV_VARIANTS)
366 void DISPLAY::GETVRAM_4096(int yoff, scrntype_t *p, scrntype_t *px,
368 bool window_inv = false,
369 bool scan_line = false)
372 uint8_t bb[4], rr[4], gg[4];
374 const uint16_t __masks[8] = {(uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask, (uint16_t)mask};
380 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
381 int dpage = vram_display_block;
383 if(p == NULL) return;
387 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
400 bb[0] = gvram_shadow[yoff_d1];
401 bb[1] = gvram_shadow[yoff_d1 + 0x02000];
402 rr[0] = gvram_shadow[yoff_d1 + 0x04000];
403 rr[1] = gvram_shadow[yoff_d1 + 0x06000];
405 gg[0] = gvram_shadow[yoff_d1 + 0x08000];
406 gg[1] = gvram_shadow[yoff_d1 + 0x0a000];
408 bb[2] = gvram_shadow[yoff_d2 + 0x0c000];
409 bb[3] = gvram_shadow[yoff_d2 + 0x0e000];
411 rr[2] = gvram_shadow[yoff_d2 + 0x10000];
412 rr[3] = gvram_shadow[yoff_d2 + 0x12000];
413 gg[2] = gvram_shadow[yoff_d2 + 0x14000];
414 gg[3] = gvram_shadow[yoff_d2 + 0x16000];
416 uint16_t tmp_g[8], tmp_r[8], tmp_b[8];
417 uint16_t *p0, *p1, *p2, *p3;
418 #if !defined(FIXED_FRAMEBUFFER_SIZE)
419 scrntype_t tmp_dd[8];
421 scrntype_t tmp_dd[16];
424 p0 = &(bit_trans_table_0[gg[0]][0]);
425 p1 = &(bit_trans_table_1[gg[1]][0]);
426 p2 = &(bit_trans_table_2[gg[2]][0]);
427 p3 = &(bit_trans_table_3[gg[3]][0]);
428 for(int i = 0; i < 8; i++) {
429 tmp_g[i] = p0[i] | p1[i] | p2[i] | p3[i];
432 p0 = &(bit_trans_table_0[rr[0]][0]);
433 p1 = &(bit_trans_table_1[rr[1]][0]);
434 p2 = &(bit_trans_table_2[rr[2]][0]);
435 p3 = &(bit_trans_table_3[rr[3]][0]);
436 for(int i = 0; i < 8; i++) {
437 tmp_r[i] = p0[i] | p1[i] | p2[i] | p3[i];
440 p0 = &(bit_trans_table_0[bb[0]][0]);
441 p1 = &(bit_trans_table_1[bb[1]][0]);
442 p2 = &(bit_trans_table_2[bb[2]][0]);
443 p3 = &(bit_trans_table_3[bb[3]][0]);
444 for(int i = 0; i < 8; i++) {
445 tmp_b[i] = p0[i] | p1[i] | p2[i] | p3[i];
447 for(int i = 0; i < 8; i++) {
448 pixels[i] = ((tmp_g[i] * 16) | tmp_r[i] | (tmp_b[i] / 16)) & __masks[i];
450 //for(int i = 0; i < 8; i++) {
451 // pixels[i] = pixels[i] & mask;
453 #if !defined(FIXED_FRAMEBUFFER_SIZE)
454 for(int i = 0; i < 8; i++) {
455 tmp_dd[i] = analog_palette_pixel[pixels[i]];
458 for(int i = 0; i < 8; i++) {
462 for(int i = 0; i < 8; i++) {
463 tmp_dd[i * 2] = tmp_dd[i * 2 + 1] = analog_palette_pixel[pixels[i]];;
465 for(int i = 0; i < 16; i++) {
470 static const scrntype_t dblack[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
471 for(int i = 0; i < 16; i++) {
474 #else /* Fancy scanline */
475 static const scrntype_t dblack[16] = { RGB_COLOR(32, 32, 32),
476 RGB_COLOR(32, 32, 32),
477 RGB_COLOR(32, 32, 32),
478 RGB_COLOR(32, 32, 32),
479 RGB_COLOR(32, 32, 32),
480 RGB_COLOR(32, 32, 32),
481 RGB_COLOR(32, 32, 32),
482 RGB_COLOR(32, 32, 32),
483 RGB_COLOR(32, 32, 32),
484 RGB_COLOR(32, 32, 32),
485 RGB_COLOR(32, 32, 32),
486 RGB_COLOR(32, 32, 32),
487 RGB_COLOR(32, 32, 32),
488 RGB_COLOR(32, 32, 32),
489 RGB_COLOR(32, 32, 32),
490 RGB_COLOR(32, 32, 32)};
492 for(int i = 0; i < 16; i++) {
493 #if defined(_RGB888) || defined(_RGBA888)
494 tmp_dd[i] = tmp_dd[i] >> 3;
495 #elif defined(_RGB555)
496 tmp_dd[i] = tmp_dd[i] >> 2;
497 #elif defined(_RGB565)
498 tmp_dd[i] = tmp_dd[i] >> 2;
501 for(int i = 0; i < 16; i++) {
502 tmp_dd[i] = tmp_dd[i] & RGBA_COLOR(31, 31, 31, 255);
504 for(int i = 0; i < 16; i++) {
509 for(int i = 0; i < 16; i++) {
519 void DISPLAY::draw_screen()
521 //#if !defined(_FM77AV_VARIANTS)
522 this->draw_screen2();
526 extern config_t config;
527 void DISPLAY::draw_screen2()
531 scrntype_t *p, *pp, *p2;
534 uint32_t yoff_d1, yoff_d2;
535 uint16_t wx_begin, wx_end, wy_low, wy_high;
536 bool scan_line = config.scan_line;
538 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
540 wx_begin = window_xbegin;
541 wx_end = window_xend;
543 wy_high = window_high;
544 bool _flag = window_opened;
545 if((wx_begin < wx_end) && (wy_low < wy_high)) {
546 window_opened = true;
548 window_opened = false;
550 if(_flag != window_opened) vram_wrote_shadow = true;
553 // frame_skip_count_draw++;
554 #if defined(_FM77AV_VARIANTS)
558 //if(!(vram_wrote_shadow)) return;
559 yoff_d1 = yoff_d2 = offset_point;
565 if(display_mode == DISPLAY_MODE_8_200L) {
566 #if !defined(FIXED_FRAMEBUFFER_SIZE)
567 emu->set_vm_screen_size(640, 200, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
569 emu->set_vm_screen_size(640, 400, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
571 #if !defined(FIXED_FRAMEBUFFER_SIZE)
572 for(y = 0; y < 200; y++) {
573 vram_draw_table[y] = false;
574 ppp = emu->get_screen_buffer(y);
575 if(ppp != NULL) memset(ppp, 0x00, 640 * sizeof(scrntype_t));
578 for(y = 0; y < 400; y++) {
579 vram_draw_table[y] = false;
580 ppp = emu->get_screen_buffer(y);
581 if(ppp != NULL) memset(ppp, 0x00, 640 * sizeof(scrntype_t));
584 } else if(display_mode == DISPLAY_MODE_8_400L) {
585 emu->set_vm_screen_size(640, 400, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
586 for(y = 0; y < 400; y++) {
587 vram_draw_table[y] = false;
588 ppp = emu->get_screen_buffer(y);
589 if(ppp != NULL) memset(ppp, 0x00, 640 * sizeof(scrntype_t));
592 #if !defined(FIXED_FRAMEBUFFER_SIZE)
593 emu->set_vm_screen_size(320, 200, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
595 emu->set_vm_screen_size(640, 400, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
597 #if !defined(FIXED_FRAMEBUFFER_SIZE)
598 for(y = 0; y < 200; y++) {
599 vram_draw_table[y] = false;
600 ppp = emu->get_screen_buffer(y);
601 if(ppp != NULL) memset(ppp, 0x00, 320 * sizeof(scrntype_t));
604 for(y = 0; y < 400; y++) {
605 vram_draw_table[y] = false;
606 ppp = emu->get_screen_buffer(y);
607 if(ppp != NULL) memset(ppp, 0x00, 640 * sizeof(scrntype_t));
612 crt_flag_bak = crt_flag;
615 crt_flag_bak = crt_flag;
617 // uint32_t factor = ((config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28) & 3;
618 // if(frame_skip_count_draw < factor) return;
619 // frame_skip_count_draw = 0;
621 if(!vram_wrote_shadow && !palette_changed) return;
622 vram_wrote_shadow = false;
623 if(palette_changed) {
624 for(y = 0; y < 400; y++) {
625 vram_draw_table[y] = true;
627 palette_changed = false;
629 if(display_mode == DISPLAY_MODE_8_200L) {
631 #if !defined(FIXED_FRAMEBUFFER_SIZE)
632 emu->set_vm_screen_size(640, 200, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
634 emu->set_vm_screen_size(640, 400, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
637 //rgbmask = ~multimode_dispmask;
638 for(y = 0; y < 200; y ++) {
639 if(!vram_draw_table[y]) continue;
640 vram_draw_table[y] = false;
641 #if !defined(FIXED_FRAMEBUFFER_SIZE)
642 p = emu->get_screen_buffer(y);
645 p = emu->get_screen_buffer(y * 2);
646 p2 = emu->get_screen_buffer(y * 2 + 1);
648 if(p == NULL) continue;
651 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
652 if(window_opened && (wy_low <= y) && (wy_high > y)) {
653 for(x = 0; x < 80; x++) {
654 if((x >= wx_begin) && (x < wx_end)) {
655 GETVRAM_8_200L(yoff, p, p2, true, scan_line);
657 GETVRAM_8_200L(yoff, p, p2, false, scan_line);
659 #if defined(FIXED_FRAMEBUFFER_SIZE)
668 for(x = 0; x < 10; x++) {
669 for(ii = 0; ii < 8; ii++) {
670 GETVRAM_8_200L(yoff + ii, p, p2, false, scan_line);
671 #if defined(FIXED_FRAMEBUFFER_SIZE)
682 # if defined(_FM77AV_VARIANTS)
683 if(display_mode == DISPLAY_MODE_4096) {
684 #if !defined(FIXED_FRAMEBUFFER_SIZE)
685 emu->set_vm_screen_size(320, 200, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
687 emu->set_vm_screen_size(640, 400, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
692 if(!multimode_dispflags[0]) mask = 0x00f;
693 if(!multimode_dispflags[1]) mask = mask | 0x0f0;
694 if(!multimode_dispflags[2]) mask = mask | 0xf00;
696 for(y = 0; y < 200; y ++) {
697 if(!vram_draw_table[y]) continue;
698 vram_draw_table[y] = false;
700 #if !defined(FIXED_FRAMEBUFFER_SIZE)
701 p = emu->get_screen_buffer(y);
704 p = emu->get_screen_buffer(y * 2 );
705 p2 = emu->get_screen_buffer(y * 2 + 1);
707 if(p == NULL) continue;
710 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
711 if(window_opened && (wy_low <= y) && (wy_high > y)) {
712 for(x = 0; x < 40; x++) {
713 if((x >= wx_begin) && (x < wx_end)) {
714 GETVRAM_4096(yoff, p, p2, mask, true, scan_line);
716 GETVRAM_4096(yoff, p, p2, mask, false, scan_line);
718 #if defined(FIXED_FRAMEBUFFER_SIZE)
729 for(x = 0; x < 5; x++) {
730 for(ii = 0; ii < 8; ii++) {
731 GETVRAM_4096(yoff + ii, p, p2, mask, false, scan_line);
732 #if defined(FIXED_FRAMEBUFFER_SIZE)
745 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
746 else if(display_mode == DISPLAY_MODE_8_400L) {
748 emu->set_vm_screen_size(640, 400, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
750 //rgbmask = ~multimode_dispmask;
751 for(y = 0; y < 400; y++) {
752 if(!vram_draw_table[y]) continue;
753 vram_draw_table[y] = false;
755 p = emu->get_screen_buffer(y);
756 if(p == NULL) continue;
759 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
760 if(window_opened && (wy_low <= y) && (wy_high > y)) {
761 for(x = 0; x < 80; x++) {
762 if((x >= wx_begin) && (x < wx_end)) {
763 GETVRAM_8_400L(yoff, p, true);
765 GETVRAM_8_400L(yoff, p, false);
772 for(x = 0; x < 10; x++) {
774 for(ii = 0; ii < 8; ii++) {
775 GETVRAM_8_400L(yoff + ii, p);
782 } else if(display_mode == DISPLAY_MODE_256k) {
784 #if !defined(FIXED_FRAMEBUFFER_SIZE)
785 emu->set_vm_screen_size(320, 200, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
787 emu->set_vm_screen_size(640, 400, WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
789 //rgbmask = ~multimode_dispmask;
790 for(y = 0; y < 200; y++) {
791 if(!vram_draw_table[y]) continue;
792 vram_draw_table[y] = false;
793 #if !defined(FIXED_FRAMEBUFFER_SIZE)
794 p = emu->get_screen_buffer(y);
797 p = emu->get_screen_buffer(y * 2 );
798 p2 = emu->get_screen_buffer(y * 2 + 1);
800 if(p == NULL) continue;
804 for(x = 0; x < 5; x++) {
805 for(ii = 0; ii < 8; ii++) {
806 GETVRAM_256k(yoff + ii, p, p2, scan_line);
807 #if !defined(FIXED_FRAMEBUFFER_SIZE)
821 # endif //_FM77AV_VARIANTS
824 bool DISPLAY::screen_update(void)
827 bool f = screen_update_flag;
828 screen_update_flag = false;
831 if(crt_flag_bak) return true;
836 void DISPLAY::reset_screen_update(void)
838 screen_update_flag = false;