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_l4_400l(uint32 addr, uint32 offset)
15 uint32 raddr = addr & 0x3fff;
16 if((multimode_accessmask & 0x04) == 0) {
17 return gvram[0x8000 + (raddr + offset) & 0x7fff];
21 pagemod = addr & 0x4000;
22 return gvram[((addr + offset) & mask) | pagemod];
23 } else if(addr < 0x9800) {
24 return textvram[addr & 0x0fff];
25 } else { // $9800-$bfff
26 return subrom_l4[addr - 0x9800];
32 void DISPLAY::write_vram_l4_400l(uint32 addr, uint32 offset, uint32 data)
37 uint32 raddr = addr & 0x3fff;
38 if((multimode_accessmask & 0x04) == 0) {
39 gvram[0x8000 + (raddr + offset) & 0x7fff] = (uint8)data;
43 pagemod = addr & 0x4000;
44 gvram[((addr + offset) & mask) | pagemod] = (uint8)data;
45 } else if(addr < 0x9800) {
46 textvram[addr & 0x0fff] = (uint8)data;
47 } else { // $9800-$bfff
48 //return subrom_l4[addr - 0x9800];
54 inline void DISPLAY::GETVRAM_8_200L(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
56 register uint8 b, r, g;
59 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
60 int dpage = vram_display_block;
63 #if defined(_FM77AV_VARIANTS)
64 if(display_page == 1) { // Is this dirty?
65 yoff_d = offset_point_bank1_bak;
67 yoff_d = offset_point_bak;
70 yoff_d = offset_point;
72 yoff_d = (yoff + yoff_d) & 0x3fff;
73 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
81 if(dpage != 0) yoff_d += 0x18000;
84 #if defined(_FM77AV_VARIANTS)
85 if(display_page == 1) {
86 if(mask & 0x01) b = gvram_shadow[yoff_d + 0x0c000];
87 if(mask & 0x02) r = gvram_shadow[yoff_d + 0x10000];
88 if(mask & 0x04) g = gvram_shadow[yoff_d + 0x14000];
90 if(mask & 0x01) b = gvram_shadow[yoff_d + 0x00000];
91 if(mask & 0x02) r = gvram_shadow[yoff_d + 0x04000];
92 if(mask & 0x04) g = gvram_shadow[yoff_d + 0x08000];
95 if(mask & 0x01) b = gvram[yoff_d + 0x00000];
96 if(mask & 0x02) r = gvram[yoff_d + 0x04000];
97 if(mask & 0x04) g = gvram[yoff_d + 0x08000];
99 dot = ((g & 0x80) >> 5) | ((r & 0x80) >> 6) | ((b & 0x80) >> 7);
100 p[0] = dpalette_pixel[dot];
101 dot = ((g & 0x40) >> 4) | ((r & 0x40) >> 5) | ((b & 0x40) >> 6);
102 p[1] = dpalette_pixel[dot];
103 dot = ((g & 0x20) >> 3) | ((r & 0x20) >> 4) | ((b & 0x20) >> 5);
104 p[2] = dpalette_pixel[dot];
105 dot = ((g & 0x10) >> 2) | ((r & 0x10) >> 3) | ((b & 0x10) >> 4);
106 p[3] = dpalette_pixel[dot];
108 dot = ((g & 0x8) >> 1) | ((r & 0x8) >> 2) | ((b & 0x8) >> 3);
109 p[4] = dpalette_pixel[dot];
110 dot = (g & 0x4) | ((r & 0x4) >> 1) | ((b & 0x4) >> 2);
111 p[5] = dpalette_pixel[dot];
112 dot = ((g & 0x2) << 1) | (r & 0x2) | ((b & 0x2) >> 1);
113 p[6] = dpalette_pixel[dot];
114 dot = ((g & 0x1) << 2) | ((r & 0x1) << 1) | (b & 0x1);
115 p[7] = dpalette_pixel[dot];
118 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
119 inline void DISPLAY::GETVRAM_8_400L(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
121 register uint8 b, r, g;
124 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
125 int dpage = vram_display_block;
127 if(p == NULL) return;
128 if(display_page == 1) { // Is this dirty?
129 yoff_d = offset_point_bank1_bak;
131 yoff_d = offset_point_bak;
133 yoff_d = (yoff + (yoff_d << 1)) & 0x7fff;
134 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
142 if(dpage != 0) yoff_d += 0x18000;
145 if(mask & 0x01) b = gvram_shadow[yoff_d + 0x00000];
146 if(mask & 0x02) r = gvram_shadow[yoff_d + 0x08000];
147 if(mask & 0x04) g = gvram_shadow[yoff_d + 0x10000];
149 dot = ((g & 0x80) >> 5) | ((r & 0x80) >> 6) | ((b & 0x80) >> 7);
150 p[0] = dpalette_pixel[dot];
151 dot = ((g & 0x40) >> 4) | ((r & 0x40) >> 5) | ((b & 0x40) >> 6);
152 p[1] = dpalette_pixel[dot];
153 dot = ((g & 0x20) >> 3) | ((r & 0x20) >> 4) | ((b & 0x20) >> 5);
154 p[2] = dpalette_pixel[dot];
155 dot = ((g & 0x10) >> 2) | ((r & 0x10) >> 3) | ((b & 0x10) >> 4);
156 p[3] = dpalette_pixel[dot];
158 dot = ((g & 0x8) >> 1) | ((r & 0x8) >> 2) | ((b & 0x8) >> 3);
159 p[4] = dpalette_pixel[dot];
160 dot = (g & 0x4) | ((r & 0x4) >> 1) | ((b & 0x4) >> 2);
161 p[5] = dpalette_pixel[dot];
162 dot = ((g & 0x2) << 1) | (r & 0x2) | ((b & 0x2) >> 1);
163 p[6] = dpalette_pixel[dot];
164 dot = ((g & 0x1) << 2) | ((r & 0x1) << 1) | (b & 0x1);
165 p[7] = dpalette_pixel[dot];
168 inline void DISPLAY::GETVRAM_256k(int yoff, scrntype *p, uint32 mask)
170 register uint32 b3, r3, g3;
171 register uint32 b4, r4, g4;
172 register uint32 btmp, rtmp, gtmp;
174 register scrntype b, r, g;
176 uint32 yoff_d1, yoff_d2;
180 if(p == NULL) return;
186 yoff_d1 = offset_point_bak;
187 yoff_d2 = offset_point_bank1_bak;
188 yoff_d1 = (yoff + yoff_d1) & 0x1fff;
189 yoff_d2 = (yoff + yoff_d2) & 0x1fff;
191 b3 = gvram_shadow[yoff_d1] << 24;
192 b3 |= gvram_shadow[yoff_d1 + 0x02000] << 16;
194 b3 |= gvram_shadow[yoff_d2 + 0x0c000] << 8;
195 b3 |= gvram_shadow[yoff_d2 + 0x0e000] << 0;
197 b4 = gvram_shadow[yoff_d1 + 0x18000] << 8;
198 b4 |= gvram_shadow[yoff_d1 + 0x1a000] << 0;
201 r3 = gvram_shadow[yoff_d1 + 0x04000] << 24;
202 r3 |= gvram_shadow[yoff_d1 + 0x06000] << 16;
203 r3 |= gvram_shadow[yoff_d2 + 0x10000] << 8;
204 r3 |= gvram_shadow[yoff_d2 + 0x12000] << 0;
205 r4 = gvram_shadow[yoff_d1 + 0x1c000] << 8;
206 r4 |= gvram_shadow[yoff_d1 + 0x1e000] << 0;
210 g3 = gvram_shadow[yoff_d1 + 0x08000] << 24;
211 g3 |= gvram_shadow[yoff_d1 + 0x0a000] << 16;
212 g3 |= gvram_shadow[yoff_d2 + 0x14000] << 8;
213 g3 |= gvram_shadow[yoff_d2 + 0x16000] << 0;
215 g4 = gvram_shadow[yoff_d1 + 0x20000] << 8;
216 g4 |= gvram_shadow[yoff_d1 + 0x22000] << 0;
220 for(_shift = 7; _shift >= 0; _shift--) {
221 _bit = 0x01010101 << _shift;
224 btmp = (b3 & _bit) >> _shift;
225 b = (((btmp & (0x01 << 24)) != 0) ? 0x80 : 0) | (((btmp & (0x01 << 16)) != 0)? 0x40 : 0)
226 | (((btmp & (0x01 << 8)) != 0) ? 0x20 : 0) | (((btmp & 0x01) != 0) ? 0x10 : 0);
227 btmp = (b4 & _bit) >> _shift;
228 b = b | (((btmp & (0x01 << 8)) != 0) ? 0x08 : 0) | (((btmp & 0x01) != 0) ? 0x04 : 0);
231 rtmp = (r3 & _bit) >> _shift;
232 r = ((rtmp & (0x01 << 24)) ? 0x80 : 0) | ((rtmp & (0x01 << 16)) ? 0x40 : 0)
233 | ((rtmp & (0x01 << 8)) ? 0x20 : 0) | ((rtmp & 0x01) ? 0x10 : 0);
234 rtmp = (r4 & _bit) >> _shift;
235 r = r | ((rtmp & (0x01 << 8)) ? 0x08 : 0) | ((rtmp & 0x01) ? 0x04 : 0);
238 gtmp = (g3 & _bit) >> _shift;
239 g = ((gtmp & (0x01 << 24)) ? 0x80 : 0) | ((gtmp & (0x01 << 16)) ? 0x40 : 0)
240 | ((gtmp & (0x01 << 8)) ? 0x20 : 0) | ((gtmp & 0x01) ? 0x10 : 0);
241 gtmp = (g4 & _bit) >> _shift;
242 g = g | ((gtmp & (0x01 << 8)) ? 0x08 : 0) | ((gtmp & 0x01) ? 0x04 : 0);
245 pixel = RGB_COLOR(r, g, b);
254 #if defined(_FM77AV_VARIANTS)
255 inline void DISPLAY::GETVRAM_4096(int yoff, scrntype *p, uint32 mask, bool window_inv = false)
261 uint32 yoff_d1, yoff_d2;
262 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
263 int dpage = vram_display_block;
265 if(p == NULL) return;
267 yoff_d1 = offset_point_bak;
268 yoff_d2 = offset_point_bank1_bak;
269 yoff_d1 = (yoff + yoff_d1) & 0x1fff;
270 yoff_d2 = (yoff + yoff_d2) & 0x1fff;
271 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
285 b3 = gvram_shadow[yoff_d1] << 24;
286 b3 |= gvram_shadow[yoff_d1 + 0x02000] << 16;
287 r3 = gvram_shadow[yoff_d1 + 0x04000] << 24;
288 r3 |= gvram_shadow[yoff_d1 + 0x06000] << 16;
290 g3 = gvram_shadow[yoff_d1 + 0x08000] << 24;
291 g3 |= gvram_shadow[yoff_d1 + 0x0a000] << 16;
293 b3 |= gvram_shadow[yoff_d2 + 0x0c000] << 8;
294 b3 |= gvram_shadow[yoff_d2 + 0x0e000] << 0;
296 r3 |= gvram_shadow[yoff_d2 + 0x10000] << 8;
297 r3 |= gvram_shadow[yoff_d2 + 0x12000] << 0;
298 g3 |= gvram_shadow[yoff_d2 + 0x14000] << 8;
299 g3 |= gvram_shadow[yoff_d2 + 0x16000] << 0;
301 g = ((g3 & (0x80 << 24)) >> 20) | ((g3 & (0x80 << 16)) >> 13) | ((g3 & (0x80 << 8)) >> 6) | ((g3 & 0x80) << 1);
302 r = ((r3 & (0x80 << 24)) >> 24) | ((r3 & (0x80 << 16)) >> 17) | ((r3 & (0x80 << 8)) >> 10) | ((r3 & 0x80) >> 3);
303 b = ((b3 & (0x80 << 24)) >> 28) | ((b3 & (0x80 << 16)) >> 21) | ((b3 & (0x80 << 8)) >> 14) | ((b3 & 0x80) >> 7);
305 idx = (g | b | r ) & mask;
306 pixel = analog_palette_pixel[idx];
310 g = ((g3 & (0x40 << 24)) >> 19) | ((g3 & (0x40 << 16)) >> 12) | ((g3 & (0x40 << 8)) >> 5) | ((g3 & 0x40) << 2);
311 r = ((r3 & (0x40 << 24)) >> 23) | ((r3 & (0x40 << 16)) >> 16) | ((r3 & (0x40 << 8)) >> 9) | ((r3 & 0x40) >> 2);
312 b = ((b3 & (0x40 << 24)) >> 27) | ((b3 & (0x40 << 16)) >> 20) | ((b3 & (0x40 << 8)) >> 13) | ((b3 & 0x40) >> 6);
314 idx = (g | b | r ) & mask;
315 pixel = analog_palette_pixel[idx];
319 g = ((g3 & (0x20 << 24)) >> 18) | ((g3 & (0x20 << 16)) >> 11) | ((g3 & (0x20 << 8)) >> 4) | ((g3 & 0x20) << 3);
320 r = ((r3 & (0x20 << 24)) >> 22) | ((r3 & (0x20 << 16)) >> 15) | ((r3 & (0x20 << 8)) >> 8) | ((r3 & 0x20) >> 1);
321 b = ((b3 & (0x20 << 24)) >> 26) | ((b3 & (0x20 << 16)) >> 19) | ((b3 & (0x20 << 8)) >> 12) | ((b3 & 0x20) >> 5);
323 idx = (g | b | r ) & mask;
324 pixel = analog_palette_pixel[idx];
328 g = ((g3 & (0x10 << 24)) >> 17) | ((g3 & (0x10 << 16)) >> 10) | ((g3 & (0x10 << 8)) >> 3) | ((g3 & 0x10) << 4);
329 r = ((r3 & (0x10 << 24)) >> 21) | ((r3 & (0x10 << 16)) >> 14) | ((r3 & (0x10 << 8)) >> 7) | ((r3 & 0x10) >> 0);
330 b = ((b3 & (0x10 << 24)) >> 25) | ((b3 & (0x10 << 16)) >> 18) | ((b3 & (0x10 << 8)) >> 11) | ((b3 & 0x10) >> 4);
332 idx = (g | b | r ) & mask;
333 pixel = analog_palette_pixel[idx];
337 g = ((g3 & (0x8 << 24)) >> 16) | ((g3 & (0x8 << 16)) >> 9) | ((g3 & (0x8 << 8)) >> 2) | ((g3 & 0x8) << 5);
338 r = ((r3 & (0x8 << 24)) >> 20) | ((r3 & (0x8 << 16)) >> 13) | ((r3 & (0x8 << 8)) >> 6) | ((r3 & 0x8) << 1);
339 b = ((b3 & (0x8 << 24)) >> 24) | ((b3 & (0x8 << 16)) >> 17) | ((b3 & (0x8 << 8)) >> 10) | ((b3 & 0x8) >> 3);
341 idx = (g | b | r ) & mask;
342 pixel = analog_palette_pixel[idx];
347 g = ((g3 & (0x4 << 24)) >> 15) | ((g3 & (0x4 << 16)) >> 8) | ((g3 & (0x4 << 8)) >> 1) | ((g3 & 0x4) << 6);
348 r = ((r3 & (0x4 << 24)) >> 19) | ((r3 & (0x4 << 16)) >> 12) | ((r3 & (0x4 << 8)) >> 5) | ((r3 & 0x4) << 2);
349 b = ((b3 & (0x4 << 24)) >> 23) | ((b3 & (0x4 << 16)) >> 16) | ((b3 & (0x4 << 8)) >> 9) | ((b3 & 0x4) >> 2);
351 idx = (g | b | r ) & mask;
352 pixel = analog_palette_pixel[idx];
356 g = ((g3 & (0x2 << 24)) >> 14) | ((g3 & (0x2 << 16)) >> 7) | ((g3 & (0x2 << 8)) >> 0) | ((g3 & 0x2) << 7);
357 r = ((r3 & (0x2 << 24)) >> 18) | ((r3 & (0x2 << 16)) >> 11) | ((r3 & (0x2 << 8)) >> 4) | ((r3 & 0x2) << 3);
358 b = ((b3 & (0x2 << 24)) >> 22) | ((b3 & (0x2 << 16)) >> 15) | ((b3 & (0x2 << 8)) >> 8) | ((b3 & 0x2) >> 1);
360 idx = (g | b | r ) & mask;
361 pixel = analog_palette_pixel[idx];
365 g = ((g3 & (0x1 << 24)) >> 13) | ((g3 & (0x1 << 16)) >> 6) | ((g3 & (0x1 << 8)) << 1) | ((g3 & 0x1) << 8);
366 r = ((r3 & (0x1 << 24)) >> 17) | ((r3 & (0x1 << 16)) >> 10) | ((r3 & (0x1 << 8)) >> 3) | ((r3 & 0x1) << 4);
367 b = ((b3 & (0x1 << 24)) >> 21) | ((b3 & (0x1 << 16)) >> 14) | ((b3 & (0x1 << 8)) >> 7) | ((b3 & 0x1) >> 0);
369 idx = (g | b | r ) & mask;
370 pixel = analog_palette_pixel[idx];
376 void DISPLAY::draw_screen()
382 register uint32 rgbmask;
383 uint16 wx_begin, wx_end, wy_low, wy_high;
384 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
386 wx_begin = window_xbegin;
387 wx_end = window_xend;
389 wy_high = window_high;
390 bool _flag = window_opened;
391 if((wx_begin < wx_end) && (wy_low < wy_high)) {
392 window_opened = true;
394 window_opened = false;
396 if(_flag != window_opened) vram_wrote_shadow = true;
400 #if defined(_FM77AV_VARIANTS)
402 int factor = (config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28;
403 if(frame_skip_count <= factor) return;
404 frame_skip_count = 0;
408 int factor = (config.dipswitch & FM7_DIPSW_FRAMESKIP) >> 28;
409 if((frame_skip_count <= factor) || !(vram_wrote)) return;
411 frame_skip_count = 0;
418 if(display_mode == DISPLAY_MODE_8_200L) {
419 emu->set_vm_screen_size(640, 200, SCREEN_WIDTH_ASPECT, SCREEN_HEIGHT_ASPECT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
420 for(y = 0; y < 200; y++) {
421 ppp = emu->screen_buffer(y);
422 if(ppp != NULL) memset(ppp, 0x00, 640 * sizeof(scrntype));
424 } else if(display_mode == DISPLAY_MODE_8_400L) {
425 emu->set_vm_screen_size(640, 400, SCREEN_WIDTH_ASPECT, SCREEN_HEIGHT_ASPECT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
426 for(y = 0; y < 400; y++) {
427 ppp = emu->screen_buffer(y);
428 if(ppp != NULL) memset(ppp, 0x00, 640 * sizeof(scrntype));
431 emu->set_vm_screen_size(320, 200, SCREEN_WIDTH_ASPECT, SCREEN_HEIGHT_ASPECT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
432 for(y = 0; y < 200; y++) {
433 ppp = emu->screen_buffer(y);
434 if(ppp != NULL) memset(ppp, 0x00, 320 * sizeof(scrntype));
438 crt_flag_bak = crt_flag;
441 crt_flag_bak = crt_flag;
442 # if defined(_FM77AV_VARIANTS)
443 if(!vram_wrote_shadow) return;
445 if(display_mode == DISPLAY_MODE_8_200L) {
446 emu->set_vm_screen_size(640, 200, SCREEN_WIDTH_ASPECT, SCREEN_HEIGHT_ASPECT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
448 rgbmask = ~multimode_dispmask;
449 for(y = 0; y < 200; y ++) {
450 p = emu->screen_buffer(y);
451 if(p == NULL) continue;
454 # if defined(_FM77AV_VARIANTS)
455 vram_draw_table[y] = false;
457 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
458 if(window_opened && (wy_low <= y) && (wy_high > y)) {
459 for(x = 0; x < 80; x++) {
460 if((x >= wx_begin) && (x < wx_end)) {
461 GETVRAM_8_200L(yoff, p, rgbmask, true);
463 GETVRAM_8_200L(yoff, p, rgbmask, false);
471 for(x = 0; x < 10; x++) {
472 GETVRAM_8_200L(yoff + 0, p, rgbmask, false);
475 GETVRAM_8_200L(yoff + 1, p, rgbmask, false);
478 GETVRAM_8_200L(yoff + 2, p, rgbmask, false);
481 GETVRAM_8_200L(yoff + 3, p, rgbmask, false);
484 GETVRAM_8_200L(yoff + 4, p, rgbmask, false);
487 GETVRAM_8_200L(yoff + 5, p, rgbmask, false);
490 GETVRAM_8_200L(yoff + 6, p, rgbmask, false);
493 GETVRAM_8_200L(yoff + 7, p, rgbmask, false);
498 //if(config.scan_line == 0) {
499 // memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
501 // memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
504 # if defined(_FM77AV_VARIANTS)
505 vram_wrote_shadow = false;
509 # if defined(_FM77AV_VARIANTS)
510 if(display_mode == DISPLAY_MODE_4096) {
511 emu->set_vm_screen_size(320, 200, SCREEN_WIDTH_ASPECT, SCREEN_HEIGHT_ASPECT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
514 rgbmask = multimode_dispmask;
515 if((rgbmask & 0x01) == 0) mask = 0x00f;
516 if((rgbmask & 0x02) == 0) mask = mask | 0x0f0;
517 if((rgbmask & 0x04) == 0) mask = mask | 0xf00;
518 for(y = 0; y < 200; y ++) {
519 p = emu->screen_buffer(y);
520 if(p == NULL) continue;
523 # if defined(_FM77AV_VARIANTS)
524 vram_draw_table[y] = false;
526 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
527 if(window_opened && (wy_low <= y) && (wy_high > y)) {
528 for(x = 0; x < 40; x++) {
529 if((x >= wx_begin) && (x < wx_end)) {
530 GETVRAM_4096(yoff, p, mask, true);
532 GETVRAM_4096(yoff, p, mask, false);
540 for(x = 0; x < 5; x++) {
541 GETVRAM_4096(yoff + 0, p, mask);
544 GETVRAM_4096(yoff + 1, p, mask);
547 GETVRAM_4096(yoff + 2, p, mask);
550 GETVRAM_4096(yoff + 3, p, mask);
553 GETVRAM_4096(yoff + 4, p, mask);
556 GETVRAM_4096(yoff + 5, p, mask);
559 GETVRAM_4096(yoff + 6, p, mask);
562 GETVRAM_4096(yoff + 7, p, mask);
567 //if(config.scan_line == 0) {
568 // memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
570 // memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
573 vram_wrote_shadow = false;
576 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
577 else if(display_mode == DISPLAY_MODE_8_400L) {
578 emu->set_vm_screen_size(640, 400, SCREEN_WIDTH_ASPECT, SCREEN_HEIGHT_ASPECT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
580 rgbmask = ~multimode_dispmask;
581 for(y = 0; y < 400; y++) {
582 p = emu->screen_buffer(y);
583 if(p == NULL) continue;
586 # if defined(_FM77AV_VARIANTS)
587 vram_draw_table[y] = false;
589 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
590 if(window_opened && (wy_low <= y) && (wy_high > y)) {
591 for(x = 0; x < 80; x++) {
592 if((x >= wx_begin) && (x < wx_end)) {
593 GETVRAM_8_400L(yoff, p, rgbmask, true);
595 GETVRAM_8_400L(yoff, p, rgbmask, false);
602 for(x = 0; x < 10; x++) {
603 GETVRAM_8_400L(yoff + 0, p, rgbmask);
606 GETVRAM_8_400L(yoff + 1, p, rgbmask);
609 GETVRAM_8_400L(yoff + 2, p, rgbmask);
612 GETVRAM_8_400L(yoff + 3, p, rgbmask);
615 GETVRAM_8_400L(yoff + 4, p, rgbmask);
618 GETVRAM_8_400L(yoff + 5, p, rgbmask);
621 GETVRAM_8_400L(yoff + 6, p, rgbmask);
624 GETVRAM_8_400L(yoff + 7, p, rgbmask);
629 vram_wrote_shadow = false;
631 } else if(display_mode == DISPLAY_MODE_256k) {
632 emu->set_vm_screen_size(320, 200, SCREEN_WIDTH_ASPECT, SCREEN_HEIGHT_ASPECT, WINDOW_WIDTH_ASPECT, WINDOW_HEIGHT_ASPECT);
633 rgbmask = ~multimode_dispmask;
634 for(y = 0; y < 200; y++) {
635 # if defined(_FM77AV_VARIANTS)
636 vram_draw_table[y] = false;
638 p = emu->screen_buffer(y);
639 if(p == NULL) continue;
643 for(x = 0; x < 5; x++) {
644 GETVRAM_256k(yoff + 0, p, rgbmask);
647 GETVRAM_256k(yoff + 1, p, rgbmask);
650 GETVRAM_256k(yoff + 2, p, rgbmask);
653 GETVRAM_256k(yoff + 3, p, rgbmask);
656 GETVRAM_256k(yoff + 4, p, rgbmask);
659 GETVRAM_256k(yoff + 5, p, rgbmask);
662 GETVRAM_256k(yoff + 6, p, rgbmask);
665 GETVRAM_256k(yoff + 7, p, rgbmask);
670 //if(config.scan_line == 0) {
671 // memcpy((void *)emu->screen_buffer(y + 1), pp, 640 * sizeof(scrntype));
673 // memset((void *)emu->screen_buffer(y + 1), 0x00, 640 * sizeof(scrntype));
676 vram_wrote_shadow = false;
680 # endif //_FM77AV_VARIANTS
683 bool DISPLAY::screen_update(void)
685 bool f = screen_update_flag;
686 screen_update_flag = false;
690 void DISPLAY::reset_screen_update(void)
692 screen_update_flag = false;